diff --git a/.github/workflows/build-pr-artifacts.yml b/.github/workflows/build-pr-artifacts.yml index b0187beb85..022afcd9f4 100644 --- a/.github/workflows/build-pr-artifacts.yml +++ b/.github/workflows/build-pr-artifacts.yml @@ -43,7 +43,7 @@ jobs: 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 }},rudderlabs/develop-rudder-transformer:${{ needs.generate-tag-names.outputs.tag_name }} + push_tags: rudderstack/develop-rudder-transformer:${{ needs.generate-tag-names.outputs.tag_name }} img_tag: ${{ needs.generate-tag-names.outputs.tag_name }} dockerfile: Dockerfile load_target: development @@ -59,7 +59,7 @@ jobs: 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 }},rudderlabs/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 }} img_tag: ${{ needs.generate-tag-names.outputs.tag_name_ut }} dockerfile: Dockerfile-ut-func load_target: development diff --git a/.github/workflows/build-push-docker-image.yml b/.github/workflows/build-push-docker-image.yml index 7e36beba76..f65aa0c8ce 100644 --- a/.github/workflows/build-push-docker-image.yml +++ b/.github/workflows/build-push-docker-image.yml @@ -29,9 +29,9 @@ env: DOCKERHUB_USERNAME: rudderlabs jobs: - build-transformer-image: - name: Build Transformer Docker Image - runs-on: ubuntu-latest + build-transformer-image-arm64: + name: Build Transformer Docker Image ARM64 + runs-on: [self-hosted, Linux, ARM64] steps: - name: Checkout uses: actions/checkout@v3.5.3 @@ -55,12 +55,12 @@ jobs: target: ${{ inputs.load_target }} load: true tags: ${{ inputs.build_tag }} - cache-from: type=gha - cache-to: type=gha,mode=max + # cache-from: type=gha + # cache-to: type=gha,mode=max - name: Run Tests run: | - docker run ${{ inputs.build_tag }} npm run test:js:ci + docker run ${{ inputs.build_tag }} npm run test:js:ci docker run ${{ inputs.build_tag }} npm run test:ts:ci - name: Build and Push Multi-platform Images @@ -70,12 +70,80 @@ jobs: file: ${{ inputs.dockerfile }} target: ${{ inputs.push_target }} push: true - tags: ${{ inputs.push_tags }} + tags: ${{ inputs.push_tags }}-arm64 platforms: | - linux/amd64 linux/arm64 build-args: | - version=${{ inputs.img_tag }} + version=${{ inputs.img_tag }}-arm64 GIT_COMMIT_SHA=${{ github.sha }} - cache-from: type=gha - cache-to: type=gha,mode=max + # cache-from: type=gha + # cache-to: type=gha,mode=max + + build-transformer-image-amd64: + name: Build Transformer Docker Image AMD64 + runs-on: [self-hosted, Linux, X64] + steps: + - name: Checkout + uses: actions/checkout@v3.5.3 + with: + fetch-depth: 1 + + - name: Setup Docker Buildx + uses: docker/setup-buildx-action@v2.9.1 + + - name: Login to DockerHub + uses: docker/login-action@v2.1.0 + with: + username: ${{ env.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_PROD_TOKEN }} + + - name: Build Docker Image + uses: docker/build-push-action@v4.1.1 + with: + context: . + file: ${{ inputs.dockerfile }} + target: ${{ inputs.load_target }} + load: true + tags: ${{ inputs.build_tag }} + # cache-from: type=gha + # cache-to: type=gha,mode=max + + - name: Run Tests + run: | + docker run ${{ inputs.build_tag }} npm run test:js:ci + docker run ${{ inputs.build_tag }} npm run test:ts:ci + + - name: Build and Push Multi-platform Images + uses: docker/build-push-action@v4.1.1 + with: + context: . + file: ${{ inputs.dockerfile }} + target: ${{ inputs.push_target }} + push: true + tags: ${{ inputs.push_tags }}-amd64 + platforms: | + linux/amd64 + build-args: | + version=${{ inputs.img_tag }}-amd64 + GIT_COMMIT_SHA=${{ github.sha }} + # cache-from: type=gha + # cache-to: type=gha,mode=max + + create-manifest: + name: Create multi-arch manifest + runs-on: ubuntu-latest + needs: [build-transformer-image-amd64, build-transformer-image-arm64] + + steps: + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2.9.1 + + - name: Login to DockerHub + uses: docker/login-action@v2.1.0 + with: + username: ${{ env.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_PROD_TOKEN }} + + - name: Create multi-arch manifest + run: | + docker buildx imagetools create -t ${{ inputs.push_tags }} ${{ inputs.push_tags }}-amd64 ${{ inputs.push_tags }}-arm64 diff --git a/.github/workflows/prepare-for-dev-deploy.yml b/.github/workflows/prepare-for-dev-deploy.yml index 636ba5a6d8..d45f760c66 100644 --- a/.github/workflows/prepare-for-dev-deploy.yml +++ b/.github/workflows/prepare-for-dev-deploy.yml @@ -51,7 +51,7 @@ jobs: 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 }},rudderlabs/develop-rudder-transformer:${{ needs.generate-tag-names.outputs.tag_name }} + push_tags: rudderstack/develop-rudder-transformer:${{ needs.generate-tag-names.outputs.tag_name }} img_tag: ${{ needs.generate-tag-names.outputs.tag_name }} dockerfile: Dockerfile load_target: development @@ -67,7 +67,7 @@ jobs: 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 }},rudderlabs/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 }} img_tag: ${{ needs.generate-tag-names.outputs.tag_name_ut }} dockerfile: Dockerfile-ut-func load_target: development diff --git a/.github/workflows/prepare-for-prod-deploy.yml b/.github/workflows/prepare-for-prod-deploy.yml index df96daa8a9..818bd32bd1 100644 --- a/.github/workflows/prepare-for-prod-deploy.yml +++ b/.github/workflows/prepare-for-prod-deploy.yml @@ -39,15 +39,31 @@ jobs: echo "Tag Name: $tag_name" echo "tag_name=$tag_name" >> $GITHUB_OUTPUT - build-transformer-image: - name: Build Transformer Docker Image - Prod + build-rudderstack-transformer-image: + name: Build Transformer Docker Image for Rudderstack org- 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) 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 }},rudderstack/rudder-transformer:latest,rudderlabs/rudder-transformer:${{ needs.generate-tag-names.outputs.tag_name }},rudderlabs/rudder-transformer:latest + push_tags: rudderstack/rudder-transformer:${{ needs.generate-tag-names.outputs.tag_name }},rudderstack/rudder-transformer:latest + 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 }} + + build-rudderlabs-transformer-image: + name: Build Transformer Docker Image for Rudderlabs org - 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) + 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: rudderlabs/rudder-transformer:${{ needs.generate-tag-names.outputs.tag_name }},rudderlabs/rudder-transformer:latest img_tag: ${{ needs.generate-tag-names.outputs.tag_name }} dockerfile: Dockerfile load_target: development @@ -58,7 +74,7 @@ jobs: create-pull-request: name: Update Helm Charts For Production and Create Pull Request runs-on: ubuntu-latest - needs: [generate-tag-names, build-transformer-image] + needs: [generate-tag-names, build-rudderstack-transformer-image, build-rudderlabs-transformer-image] env: TAG_NAME: ${{ needs.generate-tag-names.outputs.tag_name }} TF_IMAGE_REPOSITORY: rudderstack/rudder-transformer diff --git a/.github/workflows/prepare-for-prod-ut-deploy.yml b/.github/workflows/prepare-for-prod-ut-deploy.yml index 2016b35231..511e21d6dd 100644 --- a/.github/workflows/prepare-for-prod-ut-deploy.yml +++ b/.github/workflows/prepare-for-prod-ut-deploy.yml @@ -42,15 +42,15 @@ jobs: echo "UT Tag Name: $tag_name_ut" echo "tag_name_ut=$tag_name_ut" >> $GITHUB_OUTPUT - build-user-transformer-image: - name: Build User Transformer Docker Image - Prod + build-rudderstack-user-transformer-image: + name: Build User Transformer Docker Image for Rudderstack org - 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) 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 }},rudderstack/rudder-transformer:ut-latest,rudderlabs/rudder-transformer:${{ needs.generate-tag-names.outputs.tag_name_ut }},rudderlabs/rudder-transformer:ut-latest + push_tags: rudderstack/rudder-transformer:${{ needs.generate-tag-names.outputs.tag_name_ut }},rudderstack/rudder-transformer:ut-latest img_tag: ${{ needs.generate-tag-names.outputs.tag_name_ut }} dockerfile: Dockerfile-ut-func load_target: development @@ -58,10 +58,27 @@ jobs: secrets: DOCKERHUB_PROD_TOKEN: ${{ secrets.DOCKERHUB_PROD_TOKEN }} + build-rudderlabs-user-transformer-image: + name: Build User Transformer Docker Image for Rudderlabs org - 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) + 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: rudderlabs/rudder-transformer:${{ needs.generate-tag-names.outputs.tag_name_ut }},rudderlabs/rudder-transformer:ut-latest + 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 }} + + create-pull-request: name: Update Helm Charts For Production and Create Pull Request runs-on: ubuntu-latest - needs: [generate-tag-names, build-user-transformer-image] + needs: [generate-tag-names, build-rudderstack-user-transformer-image, build-rudderlabs-user-transformer-image] env: UT_TAG_NAME: ${{ needs.generate-tag-names.outputs.tag_name_ut }} TF_IMAGE_REPOSITORY: rudderstack/rudder-transformer diff --git a/.github/workflows/prepare-for-staging-deploy.yml b/.github/workflows/prepare-for-staging-deploy.yml index 786110944f..4b63b70640 100644 --- a/.github/workflows/prepare-for-staging-deploy.yml +++ b/.github/workflows/prepare-for-staging-deploy.yml @@ -35,15 +35,15 @@ jobs: echo "UT Tag Name: $tag_name_ut" echo "tag_name_ut=$tag_name_ut" >> $GITHUB_OUTPUT - build-transformer-image: - name: Build Transformer Docker Image - Staging + build-rudderstack-transformer-image: + name: Build Transformer Docker Image For Rudderstack org - Staging # Only 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/')) 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 }},rudderlabs/rudder-transformer:${{ needs.generate-tag-names.outputs.tag_name }} + push_tags: rudderstack/rudder-transformer:${{ needs.generate-tag-names.outputs.tag_name }} img_tag: ${{ needs.generate-tag-names.outputs.tag_name }} dockerfile: Dockerfile load_target: development @@ -51,8 +51,41 @@ jobs: secrets: DOCKERHUB_PROD_TOKEN: ${{ secrets.DOCKERHUB_PROD_TOKEN }} - build-user-transformer-image: - name: Build User Transformer Docker Image - Staging + build-rudderlabs-transformer-image: + name: Build Transformer Docker Image For Rudderlabs org - Staging + # Only 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/')) + 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: rudderlabs/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 }} + + build-rudderstack-user-transformer-image: + name: Build User Transformer Docker Image For Rudderstack org - Staging + # Only 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/')) + + 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 }} + 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 }} + + build-rudderlabs-user-transformer-image: + name: Build User Transformer Docker Image For Rudderlabs org - Staging # Only 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/')) @@ -60,7 +93,7 @@ jobs: 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 }},rudderlabs/rudder-transformer:${{ needs.generate-tag-names.outputs.tag_name_ut }} + push_tags: rudderlabs/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 @@ -71,7 +104,7 @@ jobs: create-pull-request: name: Update Helm Charts For Staging and Create Pull Request runs-on: ubuntu-latest - needs: [generate-tag-names, build-transformer-image, build-user-transformer-image] + needs: [generate-tag-names, build-rudderstack-transformer-image, build-rudderlabs-transformer-image, build-rudderstack-user-transformer-image, build-rudderlabs-user-transformer-image] env: TAG_NAME: ${{ needs.generate-tag-names.outputs.tag_name }} UT_TAG_NAME: ${{ needs.generate-tag-names.outputs.tag_name_ut }} diff --git a/CHANGELOG.md b/CHANGELOG.md index 1da774dc3e..e66ba72716 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,36 @@ 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.41.1](https://github.com/rudderlabs/rudder-transformer/compare/v1.41.0...v1.41.1) (2023-09-14) + + +### Bug Fixes + +* **redis:** add destination_id in the key ([55629d6](https://github.com/rudderlabs/rudder-transformer/commit/55629d6d871d275de601a11ec223e0c283641d7b)) + +## [1.41.0](https://github.com/rudderlabs/rudder-transformer/compare/v1.40.2...v1.41.0) (2023-09-11) + + +### Features + +* add support for updating profile properties through track call ([#2581](https://github.com/rudderlabs/rudder-transformer/issues/2581)) ([f0f20d6](https://github.com/rudderlabs/rudder-transformer/commit/f0f20d654ec5ee8eb078ce7f5610a4666d73fd8c)) +* **INT-580:** messageId to event_id mapping support ([#2570](https://github.com/rudderlabs/rudder-transformer/issues/2570)) ([b38843b](https://github.com/rudderlabs/rudder-transformer/commit/b38843bce9bc02d73dceedc6f751f402251fd23a)) +* **tiktok_ads:** messageId to event_id mapping support ([72f87bf](https://github.com/rudderlabs/rudder-transformer/commit/72f87bfa381ed7a5b74fb5907f932b78d0257ab9)) + + +### Bug Fixes + +* **bugsnag:** alerts ([266514b](https://github.com/rudderlabs/rudder-transformer/commit/266514bd56c150d6c88c1db0733a1da0a4367c02)) +* **bugsnag:** alerts ([#2580](https://github.com/rudderlabs/rudder-transformer/issues/2580)) ([9e9eeac](https://github.com/rudderlabs/rudder-transformer/commit/9e9eeacdf79cf8175f87f302242542060f668db8)) +* json paths for non tracks events for warehouse ([#2571](https://github.com/rudderlabs/rudder-transformer/issues/2571)) ([e455368](https://github.com/rudderlabs/rudder-transformer/commit/e45536805cf9545b73f4d5bf1be5fad1565ab075)) + +### [1.40.2](https://github.com/rudderlabs/rudder-transformer/compare/v1.40.1...v1.40.2) (2023-09-06) + + +### Bug Fixes + +* marketo bulk upload import issue ([#2559](https://github.com/rudderlabs/rudder-transformer/issues/2559)) ([752f351](https://github.com/rudderlabs/rudder-transformer/commit/752f351f02b7f7611c702d7dbcb4804972bb0970)) + ### [1.40.1](https://github.com/rudderlabs/rudder-transformer/compare/v1.40.0...v1.40.1) (2023-09-06) diff --git a/package-lock.json b/package-lock.json index 580253c4da..ef0cb08127 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,26 +1,30 @@ { "name": "rudder-transformer", - "version": "1.40.1", + "version": "1.41.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "rudder-transformer", - "version": "1.40.1", + "version": "1.41.1", "license": "ISC", "dependencies": { "@amplitude/ua-parser-js": "^0.7.24", - "@aws-sdk/client-personalize": "^3.363.0", + "@aws-sdk/client-lambda": "^3.276.0", + "@aws-sdk/client-personalize": "^3.391.0", "@aws-sdk/client-s3": "^3.370.0", - "@aws-sdk/credential-providers": "^3.363.0", - "@aws-sdk/lib-storage": "^3.370.0", + "@aws-sdk/credential-providers": "^3.391.0", + "@aws-sdk/lib-storage": "^3.391.0", "@bugsnag/js": "^7.20.2", "@datadog/pprof": "^3.1.0", "@koa/router": "^12.0.0", "@ndhoule/extend": "^2.0.0", + "@pyroscope/nodejs": "^0.2.6", + "@rudderstack/workflow-engine": "^0.5.7", "ajv": "^8.12.0", "ajv-draft-04": "^1.0.0", "ajv-formats": "^2.1.1", + "aws-sdk": "^2.1354.0", "axios": "^1.4.0", "btoa": "^1.2.1", "component-each": "^0.2.6", @@ -50,14 +54,14 @@ "moment": "^2.29.4", "moment-timezone": "^0.5.43", "node-cache": "^5.1.2", - "node-fetch": "^2.6.9", + "node-fetch": "^2.6.12", "oauth-1.0a": "^2.2.6", "object-hash": "^3.0.0", "parse-static-imports": "^1.1.0", + "pprof": "^3.2.1", "prom-client": "^14.2.0", "qs": "^6.11.1", "rudder-transformer-cdk": "^1.4.11", - "rudder-workflow-engine": "^0.4.7", "set-value": "^4.1.0", "sha256": "^0.2.0", "stacktrace-parser": "^0.1.10", @@ -349,55 +353,3982 @@ } }, "node_modules/@aws-sdk/client-cognito-identity": { - "version": "3.363.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.363.0.tgz", - "integrity": "sha512-tsJzgBSCpna85IVsuS7FBIK9wkSl7fs8TJ/QzapIgu8rKss0ySHVO6TeMVAdw2BvaQl7CxU9c3PosjhLWHu6KQ==", + "version": "3.414.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.414.0.tgz", + "integrity": "sha512-U9J0R/22eftQjY6JeAzXXYSgA+T6vx/jDsBBWBIKTjCZPBmmVOb2A4/d4sxHMxjh6Ms3DolpocE5FCbB9eGBEg==", "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sts": "3.363.0", - "@aws-sdk/credential-provider-node": "3.363.0", - "@aws-sdk/middleware-host-header": "3.363.0", - "@aws-sdk/middleware-logger": "3.363.0", - "@aws-sdk/middleware-recursion-detection": "3.363.0", - "@aws-sdk/middleware-signing": "3.363.0", - "@aws-sdk/middleware-user-agent": "3.363.0", - "@aws-sdk/types": "3.357.0", - "@aws-sdk/util-endpoints": "3.357.0", - "@aws-sdk/util-user-agent-browser": "3.363.0", - "@aws-sdk/util-user-agent-node": "3.363.0", + "@aws-sdk/client-sts": "3.414.0", + "@aws-sdk/credential-provider-node": "3.414.0", + "@aws-sdk/middleware-host-header": "3.413.0", + "@aws-sdk/middleware-logger": "3.413.0", + "@aws-sdk/middleware-recursion-detection": "3.413.0", + "@aws-sdk/middleware-signing": "3.413.0", + "@aws-sdk/middleware-user-agent": "3.413.0", + "@aws-sdk/region-config-resolver": "3.413.0", + "@aws-sdk/types": "3.413.0", + "@aws-sdk/util-endpoints": "3.413.0", + "@aws-sdk/util-user-agent-browser": "3.413.0", + "@aws-sdk/util-user-agent-node": "3.413.0", + "@smithy/config-resolver": "^2.0.8", + "@smithy/fetch-http-handler": "^2.1.3", + "@smithy/hash-node": "^2.0.7", + "@smithy/invalid-dependency": "^2.0.7", + "@smithy/middleware-content-length": "^2.0.9", + "@smithy/middleware-endpoint": "^2.0.7", + "@smithy/middleware-retry": "^2.0.10", + "@smithy/middleware-serde": "^2.0.7", + "@smithy/middleware-stack": "^2.0.0", + "@smithy/node-config-provider": "^2.0.10", + "@smithy/node-http-handler": "^2.1.3", + "@smithy/protocol-http": "^3.0.3", + "@smithy/smithy-client": "^2.1.4", + "@smithy/types": "^2.3.1", + "@smithy/url-parser": "^2.0.7", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-body-length-browser": "^2.0.0", + "@smithy/util-body-length-node": "^2.1.0", + "@smithy/util-defaults-mode-browser": "^2.0.8", + "@smithy/util-defaults-mode-node": "^2.0.10", + "@smithy/util-retry": "^2.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/types": { + "version": "3.413.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.413.0.tgz", + "integrity": "sha512-j1xib0f/TazIFc5ySIKOlT1ujntRbaoG4LJFeEezz4ji03/wSJMI8Vi4KjzpBp8J1tTu0oRDnsxRIGixsUBeYQ==", + "dependencies": { + "@smithy/types": "^2.3.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/abort-controller": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-2.0.8.tgz", + "integrity": "sha512-2SOdVj5y0zE37Y9scSXoizoxgi6mgnDabi7a/SOfhl0p+50I0rIkuJTfyAuTPDtQ7e5dD6tSZPCLB3c/YM6Zig==", + "dependencies": { + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/config-resolver": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-2.0.9.tgz", + "integrity": "sha512-QBkGPLUqyPmis9Erz8v4q5lo/ErnF7+GD5WZHa6JZiXopUPfaaM+B21n8gzS5xCkIXZmnwzNQhObP9xQPu8oqQ==", + "dependencies": { + "@smithy/node-config-provider": "^2.0.11", + "@smithy/types": "^2.3.2", + "@smithy/util-config-provider": "^2.0.0", + "@smithy/util-middleware": "^2.0.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/credential-provider-imds": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-2.0.11.tgz", + "integrity": "sha512-uJJs8dnM5iXkn8a2GaKvlKMhcOJ+oJPYqY9gY3CM/EieCVObIDjxUtR/g8lU/k/A+OauA78GzScAfulmFjPOYA==", + "dependencies": { + "@smithy/node-config-provider": "^2.0.11", + "@smithy/property-provider": "^2.0.9", + "@smithy/types": "^2.3.2", + "@smithy/url-parser": "^2.0.8", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/fetch-http-handler": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-2.1.4.tgz", + "integrity": "sha512-SL24M9W5ERByoXaVicRx+bj9GJVujDnPn+QO7GY7adhY0mPGa6DSF58pVKsgIh4r5Tx/k3SWCPlH4BxxSxA/fQ==", + "dependencies": { + "@smithy/protocol-http": "^3.0.4", + "@smithy/querystring-builder": "^2.0.8", + "@smithy/types": "^2.3.2", + "@smithy/util-base64": "^2.0.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/hash-node": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-2.0.8.tgz", + "integrity": "sha512-yZL/nmxZzjZV5/QX5JWSgXlt0HxuMTwFO89CS++jOMMPiCMZngf6VYmtNdccs8IIIAMmfQeTzwu07XgUE/Zd3Q==", + "dependencies": { + "@smithy/types": "^2.3.2", + "@smithy/util-buffer-from": "^2.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/invalid-dependency": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-2.0.8.tgz", + "integrity": "sha512-88VOS7W3KzUz/bNRc+Sl/F/CDIasFspEE4G39YZRHIh9YmsXF7GUyVaAKURfMNulTie62ayk6BHC9O0nOBAVgQ==", + "dependencies": { + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/is-array-buffer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.0.0.tgz", + "integrity": "sha512-z3PjFjMyZNI98JFRJi/U0nGoLWMSJlDjAW4QUX2WNZLas5C0CmVV6LJ01JI0k90l7FvpmixjWxPFmENSClQ7ug==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/middleware-content-length": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-2.0.10.tgz", + "integrity": "sha512-EGSbysyA4jH0p3xI6G0jdXoj9Iz9GUnAta6aEaHtXm3wVWtenRf80y2TeVvNkVSr5jwKOdSCjKIRI2l1A/oZLA==", + "dependencies": { + "@smithy/protocol-http": "^3.0.4", + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/middleware-endpoint": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-2.0.8.tgz", + "integrity": "sha512-yOpogfG2d2V0cbJdAJ6GLAWkNOc9pVsL5hZUfXcxJu408N3CUCsXzIAFF6+70ZKSE+lCfG3GFErcSXv/UfUbjw==", + "dependencies": { + "@smithy/middleware-serde": "^2.0.8", + "@smithy/types": "^2.3.2", + "@smithy/url-parser": "^2.0.8", + "@smithy/util-middleware": "^2.0.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/middleware-retry": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-2.0.11.tgz", + "integrity": "sha512-pknfokumZ+wvBERSuKAI2vVr+aK3ZgPiWRg6+0ZG4kKJogBRpPmDGWw+Jht0izS9ZaEbIobNzueIb4wD33JJVg==", + "dependencies": { + "@smithy/node-config-provider": "^2.0.11", + "@smithy/protocol-http": "^3.0.4", + "@smithy/service-error-classification": "^2.0.1", + "@smithy/types": "^2.3.2", + "@smithy/util-middleware": "^2.0.1", + "@smithy/util-retry": "^2.0.1", + "tslib": "^2.5.0", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/middleware-serde": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-2.0.8.tgz", + "integrity": "sha512-Is0sm+LiNlgsc0QpstDzifugzL9ehno1wXp109GgBgpnKTK3j+KphiparBDI4hWTtH9/7OUsxuspNqai2yyhcg==", + "dependencies": { + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/middleware-stack": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-2.0.1.tgz", + "integrity": "sha512-UexsfY6/oQZRjTQL56s9AKtMcR60tBNibSgNYX1I2WXaUaXg97W9JCkFyth85TzBWKDBTyhLfenrukS/kyu54A==", + "dependencies": { + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/node-config-provider": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-2.0.11.tgz", + "integrity": "sha512-CaR1dciSSGKttjhcefpytYjsfI/Yd5mqL8am4wfmyFCDxSiPsvnEWHl8UjM/RbcAjX0klt+CeIKPSHEc0wGvJA==", + "dependencies": { + "@smithy/property-provider": "^2.0.9", + "@smithy/shared-ini-file-loader": "^2.0.10", + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/node-http-handler": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-2.1.4.tgz", + "integrity": "sha512-8Rw/AusvWDyC6SK8esAcVBeTlQHf94NMFv805suFUJCQ2gwlh0oLDNh+6s2MDOrxcjvLxjjzv1mytM0Mt+0cPQ==", + "dependencies": { + "@smithy/abort-controller": "^2.0.8", + "@smithy/protocol-http": "^3.0.4", + "@smithy/querystring-builder": "^2.0.8", + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/property-provider": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.0.9.tgz", + "integrity": "sha512-25pPZ8f8DeRwYI5wbPRZaoMoR+3vrw8DwbA0TjP+GsdiB2KxScndr4HQehiJ5+WJ0giOTWhLz0bd+7Djv1qpUQ==", + "dependencies": { + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/protocol-http": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.0.4.tgz", + "integrity": "sha512-CGfSWk6TRlbwa8YgrSXdn80Yu7pov3EV/h7TSfiCHhq6/LO3WymmqnzgH1f0qV2bdTDipIkTNp5dGCGN3Af/5g==", + "dependencies": { + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/querystring-builder": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-2.0.8.tgz", + "integrity": "sha512-+vzIMwjC8Saz97/ptPn+IJRCRRZ+pP95ZIWDRqEqZV/a6hiKbaFoMSa2iCKsnKzR696U2JZXrDqMu3e/FD1+2g==", + "dependencies": { + "@smithy/types": "^2.3.2", + "@smithy/util-uri-escape": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/querystring-parser": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-2.0.8.tgz", + "integrity": "sha512-ArbanNuR7O/MmTd90ZqhDqGOPPDYmxx3huHxD+R3cuCnazcK/1tGQA+SnnR5307T7ZRb5WTpB6qBggERuibVSA==", + "dependencies": { + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/service-error-classification": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-2.0.1.tgz", + "integrity": "sha512-QHa9+t+v4s0cMuDCcbjIJN67mNZ42/+fc3jKe8P6ZMPXZl5ksKk6a8vhZ/m494GZng5eFTc3OePv+NF9cG83yg==", + "dependencies": { + "@smithy/types": "^2.3.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/shared-ini-file-loader": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.0.10.tgz", + "integrity": "sha512-jWASteSezRKohJ7GdA7pHDvmr7Q7tw3b5mu3xLHIkZy/ICftJ+O7aqNaF8wklhI7UNFoQ7flFRM3Rd0KA+1BbQ==", + "dependencies": { + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/smithy-client": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-2.1.5.tgz", + "integrity": "sha512-7S865uKzsxApM8W8Q6zkij7tcUFgaG8PuADMFdMt1yL/ku3d0+s6Zwrg3N7iXCPM08Gu/mf0BIfTXIu/9i450Q==", + "dependencies": { + "@smithy/middleware-stack": "^2.0.1", + "@smithy/types": "^2.3.2", + "@smithy/util-stream": "^2.0.11", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/types": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.3.2.tgz", + "integrity": "sha512-iH0cdKi7HQlzfAM3w2shFk/qZYKAqJWswtpmQpPtlruF+uFZeGEpMJjgDRyhWiddfVM4e2oP4nMaOBsMy6lXgg==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/url-parser": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-2.0.8.tgz", + "integrity": "sha512-wQw7j004ScCrBRJ+oNPXlLE9mtofxyadSZ9D8ov/rHkyurS7z1HTNuyaGRj6OvKsEk0SVQsuY0C9+EfM75XTkw==", + "dependencies": { + "@smithy/querystring-parser": "^2.0.8", + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-base64": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-2.0.0.tgz", + "integrity": "sha512-Zb1E4xx+m5Lud8bbeYi5FkcMJMnn+1WUnJF3qD7rAdXpaL7UjkFQLdmW5fHadoKbdHpwH9vSR8EyTJFHJs++tA==", + "dependencies": { + "@smithy/util-buffer-from": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-body-length-browser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-2.0.0.tgz", + "integrity": "sha512-JdDuS4ircJt+FDnaQj88TzZY3+njZ6O+D3uakS32f2VNnDo3vyEuNdBOh/oFd8Df1zSZOuH1HEChk2AOYDezZg==", + "dependencies": { + "tslib": "^2.5.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-body-length-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-2.1.0.tgz", + "integrity": "sha512-/li0/kj/y3fQ3vyzn36NTLGmUwAICb7Jbe/CsWCktW363gh1MOcpEcSO3mJ344Gv2dqz8YJCLQpb6hju/0qOWw==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-buffer-from": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.0.0.tgz", + "integrity": "sha512-/YNnLoHsR+4W4Vf2wL5lGv0ksg8Bmk3GEGxn2vEQt52AQaPSCuaO5PM5VM7lP1K9qHRKHwrPGktqVoAHKWHxzw==", + "dependencies": { + "@smithy/is-array-buffer": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-config-provider": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-2.0.0.tgz", + "integrity": "sha512-xCQ6UapcIWKxXHEU4Mcs2s7LcFQRiU3XEluM2WcCjjBtQkUN71Tb+ydGmJFPxMUrW/GWMgQEEGipLym4XG0jZg==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-defaults-mode-browser": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.0.9.tgz", + "integrity": "sha512-JONLJVQWT8165XoSV36ERn3SVlZLJJ4D6IeGsCSePv65Uxa93pzSLE0UMSR9Jwm4zix7rst9AS8W5QIypZWP8Q==", + "dependencies": { + "@smithy/property-provider": "^2.0.9", + "@smithy/smithy-client": "^2.1.5", + "@smithy/types": "^2.3.2", + "bowser": "^2.11.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-defaults-mode-node": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.0.11.tgz", + "integrity": "sha512-tmqjNsfj+bgZN6jXBe6efZnukzILA7BUytHkzqikuRLNtR+0VVchQHvawD0w6vManh76rO81ydhioe7i4oBzuA==", + "dependencies": { + "@smithy/config-resolver": "^2.0.9", + "@smithy/credential-provider-imds": "^2.0.11", + "@smithy/node-config-provider": "^2.0.11", + "@smithy/property-provider": "^2.0.9", + "@smithy/smithy-client": "^2.1.5", + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-hex-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-2.0.0.tgz", + "integrity": "sha512-c5xY+NUnFqG6d7HFh1IFfrm3mGl29lC+vF+geHv4ToiuJCBmIfzx6IeHLg+OgRdPFKDXIw6pvi+p3CsscaMcMA==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-middleware": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-2.0.1.tgz", + "integrity": "sha512-LnsBMi0Mg3gfz/TpNGLv2Jjcz2ra1OX5HR/4IaCepIYmtPQzqMWDdhX/XTW1LS8OZ0xbQuyQPcHkQ+2XkhWOVQ==", + "dependencies": { + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-2.0.1.tgz", + "integrity": "sha512-naj4X0IafJ9yJnVJ58QgSMkCNLjyQOnyrnKh/T0f+0UOUxJiT8vuFn/hS7B/pNqbo2STY7PyJ4J4f+5YqxwNtA==", + "dependencies": { + "@smithy/service-error-classification": "^2.0.1", + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-stream": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-2.0.11.tgz", + "integrity": "sha512-2MeWfqSpZKdmEJ+tH8CJQSgzLWhH5cmdE24X7JB0hiamXrOmswWGGuPvyj/9sQCTclo57pNxLR2p7KrP8Ahiyg==", + "dependencies": { + "@smithy/fetch-http-handler": "^2.1.4", + "@smithy/node-http-handler": "^2.1.4", + "@smithy/types": "^2.3.2", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-buffer-from": "^2.0.0", + "@smithy/util-hex-encoding": "^2.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-uri-escape": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-2.0.0.tgz", + "integrity": "sha512-ebkxsqinSdEooQduuk9CbKcI+wheijxEb3utGXkCoYQkJnwTnLbH1JXGimJtUkQwNQbsbuYwG2+aFVyZf5TLaw==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-utf8": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.0.0.tgz", + "integrity": "sha512-rctU1VkziY84n5OXe3bPNpKR001ZCME2JCaBBFgtiM2hfKbHFudc/BkMuPab8hRbLd0j3vbnBTTZ1igBf0wgiQ==", + "dependencies": { + "@smithy/util-buffer-from": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/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==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@aws-sdk/client-lambda": { + "version": "3.414.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-lambda/-/client-lambda-3.414.0.tgz", + "integrity": "sha512-Nt2ktmFWKlL19NWcaG9fS2cxjiJvGDIp8Irt1NZngIOfmqm4XsY1AcUjUcdZRED/VjdfM0ziHa9Oj4VVVTdYZA==", + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/client-sts": "3.414.0", + "@aws-sdk/credential-provider-node": "3.414.0", + "@aws-sdk/middleware-host-header": "3.413.0", + "@aws-sdk/middleware-logger": "3.413.0", + "@aws-sdk/middleware-recursion-detection": "3.413.0", + "@aws-sdk/middleware-signing": "3.413.0", + "@aws-sdk/middleware-user-agent": "3.413.0", + "@aws-sdk/region-config-resolver": "3.413.0", + "@aws-sdk/types": "3.413.0", + "@aws-sdk/util-endpoints": "3.413.0", + "@aws-sdk/util-user-agent-browser": "3.413.0", + "@aws-sdk/util-user-agent-node": "3.413.0", + "@smithy/config-resolver": "^2.0.8", + "@smithy/eventstream-serde-browser": "^2.0.7", + "@smithy/eventstream-serde-config-resolver": "^2.0.7", + "@smithy/eventstream-serde-node": "^2.0.7", + "@smithy/fetch-http-handler": "^2.1.3", + "@smithy/hash-node": "^2.0.7", + "@smithy/invalid-dependency": "^2.0.7", + "@smithy/middleware-content-length": "^2.0.9", + "@smithy/middleware-endpoint": "^2.0.7", + "@smithy/middleware-retry": "^2.0.10", + "@smithy/middleware-serde": "^2.0.7", + "@smithy/middleware-stack": "^2.0.0", + "@smithy/node-config-provider": "^2.0.10", + "@smithy/node-http-handler": "^2.1.3", + "@smithy/protocol-http": "^3.0.3", + "@smithy/smithy-client": "^2.1.4", + "@smithy/types": "^2.3.1", + "@smithy/url-parser": "^2.0.7", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-body-length-browser": "^2.0.0", + "@smithy/util-body-length-node": "^2.1.0", + "@smithy/util-defaults-mode-browser": "^2.0.8", + "@smithy/util-defaults-mode-node": "^2.0.10", + "@smithy/util-retry": "^2.0.0", + "@smithy/util-stream": "^2.0.10", + "@smithy/util-utf8": "^2.0.0", + "@smithy/util-waiter": "^2.0.7", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-lambda/node_modules/@aws-sdk/types": { + "version": "3.413.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.413.0.tgz", + "integrity": "sha512-j1xib0f/TazIFc5ySIKOlT1ujntRbaoG4LJFeEezz4ji03/wSJMI8Vi4KjzpBp8J1tTu0oRDnsxRIGixsUBeYQ==", + "dependencies": { + "@smithy/types": "^2.3.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/abort-controller": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-2.0.8.tgz", + "integrity": "sha512-2SOdVj5y0zE37Y9scSXoizoxgi6mgnDabi7a/SOfhl0p+50I0rIkuJTfyAuTPDtQ7e5dD6tSZPCLB3c/YM6Zig==", + "dependencies": { + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/config-resolver": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-2.0.9.tgz", + "integrity": "sha512-QBkGPLUqyPmis9Erz8v4q5lo/ErnF7+GD5WZHa6JZiXopUPfaaM+B21n8gzS5xCkIXZmnwzNQhObP9xQPu8oqQ==", + "dependencies": { + "@smithy/node-config-provider": "^2.0.11", + "@smithy/types": "^2.3.2", + "@smithy/util-config-provider": "^2.0.0", + "@smithy/util-middleware": "^2.0.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/credential-provider-imds": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-2.0.11.tgz", + "integrity": "sha512-uJJs8dnM5iXkn8a2GaKvlKMhcOJ+oJPYqY9gY3CM/EieCVObIDjxUtR/g8lU/k/A+OauA78GzScAfulmFjPOYA==", + "dependencies": { + "@smithy/node-config-provider": "^2.0.11", + "@smithy/property-provider": "^2.0.9", + "@smithy/types": "^2.3.2", + "@smithy/url-parser": "^2.0.8", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/eventstream-codec": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-2.0.8.tgz", + "integrity": "sha512-onO4to8ujCKn4m5XagReT9Nc6FlNG5vveuvjp1H7AtaG7njdet1LOl6/jmUOkskF2C/w+9jNw3r9Ak+ghOvN0A==", + "dependencies": { + "@aws-crypto/crc32": "3.0.0", + "@smithy/types": "^2.3.2", + "@smithy/util-hex-encoding": "^2.0.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/eventstream-serde-browser": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-2.0.8.tgz", + "integrity": "sha512-/RGlkKUnC0sd+xKBKH/2APSBRmVMZTeLOKZMhrZmrO+ONoU+DwyMr/RLJ6WnmBKN+2ebjffM4pcIJTKLNNDD8g==", + "dependencies": { + "@smithy/eventstream-serde-universal": "^2.0.8", + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/eventstream-serde-config-resolver": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-2.0.8.tgz", + "integrity": "sha512-EyAEj258eMUv9zcMvBbqrInh2eHRYuiwQAjXDMxZFCyP+JePzQB6O++3wFwjQeRKMFFgZipNgnEXfReII4+NAw==", + "dependencies": { + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/eventstream-serde-node": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-2.0.8.tgz", + "integrity": "sha512-FMBatSUSKwh6aguKVJokXfJaV8nqsuCkCZHb9MP9zah0ZF+ohbTLeeed7DQGeTVBueVIVWEzIsShPxtxBv7MMQ==", + "dependencies": { + "@smithy/eventstream-serde-universal": "^2.0.8", + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/eventstream-serde-universal": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-2.0.8.tgz", + "integrity": "sha512-6InMXH8BUKoEDa6CAuxR4Gn8Gf2vBfVtjA9A6zDKZClYHT+ANUJS+2EtOBc5wECJJGk4KLn5ajQyrt9MBv5lcw==", + "dependencies": { + "@smithy/eventstream-codec": "^2.0.8", + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/fetch-http-handler": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-2.1.4.tgz", + "integrity": "sha512-SL24M9W5ERByoXaVicRx+bj9GJVujDnPn+QO7GY7adhY0mPGa6DSF58pVKsgIh4r5Tx/k3SWCPlH4BxxSxA/fQ==", + "dependencies": { + "@smithy/protocol-http": "^3.0.4", + "@smithy/querystring-builder": "^2.0.8", + "@smithy/types": "^2.3.2", + "@smithy/util-base64": "^2.0.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/hash-node": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-2.0.8.tgz", + "integrity": "sha512-yZL/nmxZzjZV5/QX5JWSgXlt0HxuMTwFO89CS++jOMMPiCMZngf6VYmtNdccs8IIIAMmfQeTzwu07XgUE/Zd3Q==", + "dependencies": { + "@smithy/types": "^2.3.2", + "@smithy/util-buffer-from": "^2.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/invalid-dependency": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-2.0.8.tgz", + "integrity": "sha512-88VOS7W3KzUz/bNRc+Sl/F/CDIasFspEE4G39YZRHIh9YmsXF7GUyVaAKURfMNulTie62ayk6BHC9O0nOBAVgQ==", + "dependencies": { + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + } + }, + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/is-array-buffer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.0.0.tgz", + "integrity": "sha512-z3PjFjMyZNI98JFRJi/U0nGoLWMSJlDjAW4QUX2WNZLas5C0CmVV6LJ01JI0k90l7FvpmixjWxPFmENSClQ7ug==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/middleware-content-length": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-2.0.10.tgz", + "integrity": "sha512-EGSbysyA4jH0p3xI6G0jdXoj9Iz9GUnAta6aEaHtXm3wVWtenRf80y2TeVvNkVSr5jwKOdSCjKIRI2l1A/oZLA==", + "dependencies": { + "@smithy/protocol-http": "^3.0.4", + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/middleware-endpoint": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-2.0.8.tgz", + "integrity": "sha512-yOpogfG2d2V0cbJdAJ6GLAWkNOc9pVsL5hZUfXcxJu408N3CUCsXzIAFF6+70ZKSE+lCfG3GFErcSXv/UfUbjw==", + "dependencies": { + "@smithy/middleware-serde": "^2.0.8", + "@smithy/types": "^2.3.2", + "@smithy/url-parser": "^2.0.8", + "@smithy/util-middleware": "^2.0.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/middleware-retry": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-2.0.11.tgz", + "integrity": "sha512-pknfokumZ+wvBERSuKAI2vVr+aK3ZgPiWRg6+0ZG4kKJogBRpPmDGWw+Jht0izS9ZaEbIobNzueIb4wD33JJVg==", + "dependencies": { + "@smithy/node-config-provider": "^2.0.11", + "@smithy/protocol-http": "^3.0.4", + "@smithy/service-error-classification": "^2.0.1", + "@smithy/types": "^2.3.2", + "@smithy/util-middleware": "^2.0.1", + "@smithy/util-retry": "^2.0.1", + "tslib": "^2.5.0", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/middleware-serde": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-2.0.8.tgz", + "integrity": "sha512-Is0sm+LiNlgsc0QpstDzifugzL9ehno1wXp109GgBgpnKTK3j+KphiparBDI4hWTtH9/7OUsxuspNqai2yyhcg==", + "dependencies": { + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/middleware-stack": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-2.0.1.tgz", + "integrity": "sha512-UexsfY6/oQZRjTQL56s9AKtMcR60tBNibSgNYX1I2WXaUaXg97W9JCkFyth85TzBWKDBTyhLfenrukS/kyu54A==", + "dependencies": { + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/node-config-provider": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-2.0.11.tgz", + "integrity": "sha512-CaR1dciSSGKttjhcefpytYjsfI/Yd5mqL8am4wfmyFCDxSiPsvnEWHl8UjM/RbcAjX0klt+CeIKPSHEc0wGvJA==", + "dependencies": { + "@smithy/property-provider": "^2.0.9", + "@smithy/shared-ini-file-loader": "^2.0.10", + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/node-http-handler": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-2.1.4.tgz", + "integrity": "sha512-8Rw/AusvWDyC6SK8esAcVBeTlQHf94NMFv805suFUJCQ2gwlh0oLDNh+6s2MDOrxcjvLxjjzv1mytM0Mt+0cPQ==", + "dependencies": { + "@smithy/abort-controller": "^2.0.8", + "@smithy/protocol-http": "^3.0.4", + "@smithy/querystring-builder": "^2.0.8", + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/property-provider": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.0.9.tgz", + "integrity": "sha512-25pPZ8f8DeRwYI5wbPRZaoMoR+3vrw8DwbA0TjP+GsdiB2KxScndr4HQehiJ5+WJ0giOTWhLz0bd+7Djv1qpUQ==", + "dependencies": { + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/protocol-http": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.0.4.tgz", + "integrity": "sha512-CGfSWk6TRlbwa8YgrSXdn80Yu7pov3EV/h7TSfiCHhq6/LO3WymmqnzgH1f0qV2bdTDipIkTNp5dGCGN3Af/5g==", + "dependencies": { + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/querystring-builder": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-2.0.8.tgz", + "integrity": "sha512-+vzIMwjC8Saz97/ptPn+IJRCRRZ+pP95ZIWDRqEqZV/a6hiKbaFoMSa2iCKsnKzR696U2JZXrDqMu3e/FD1+2g==", + "dependencies": { + "@smithy/types": "^2.3.2", + "@smithy/util-uri-escape": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/querystring-parser": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-2.0.8.tgz", + "integrity": "sha512-ArbanNuR7O/MmTd90ZqhDqGOPPDYmxx3huHxD+R3cuCnazcK/1tGQA+SnnR5307T7ZRb5WTpB6qBggERuibVSA==", + "dependencies": { + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/service-error-classification": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-2.0.1.tgz", + "integrity": "sha512-QHa9+t+v4s0cMuDCcbjIJN67mNZ42/+fc3jKe8P6ZMPXZl5ksKk6a8vhZ/m494GZng5eFTc3OePv+NF9cG83yg==", + "dependencies": { + "@smithy/types": "^2.3.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/shared-ini-file-loader": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.0.10.tgz", + "integrity": "sha512-jWASteSezRKohJ7GdA7pHDvmr7Q7tw3b5mu3xLHIkZy/ICftJ+O7aqNaF8wklhI7UNFoQ7flFRM3Rd0KA+1BbQ==", + "dependencies": { + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/smithy-client": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-2.1.5.tgz", + "integrity": "sha512-7S865uKzsxApM8W8Q6zkij7tcUFgaG8PuADMFdMt1yL/ku3d0+s6Zwrg3N7iXCPM08Gu/mf0BIfTXIu/9i450Q==", + "dependencies": { + "@smithy/middleware-stack": "^2.0.1", + "@smithy/types": "^2.3.2", + "@smithy/util-stream": "^2.0.11", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/types": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.3.2.tgz", + "integrity": "sha512-iH0cdKi7HQlzfAM3w2shFk/qZYKAqJWswtpmQpPtlruF+uFZeGEpMJjgDRyhWiddfVM4e2oP4nMaOBsMy6lXgg==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/url-parser": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-2.0.8.tgz", + "integrity": "sha512-wQw7j004ScCrBRJ+oNPXlLE9mtofxyadSZ9D8ov/rHkyurS7z1HTNuyaGRj6OvKsEk0SVQsuY0C9+EfM75XTkw==", + "dependencies": { + "@smithy/querystring-parser": "^2.0.8", + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + } + }, + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/util-base64": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-2.0.0.tgz", + "integrity": "sha512-Zb1E4xx+m5Lud8bbeYi5FkcMJMnn+1WUnJF3qD7rAdXpaL7UjkFQLdmW5fHadoKbdHpwH9vSR8EyTJFHJs++tA==", + "dependencies": { + "@smithy/util-buffer-from": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/util-body-length-browser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-2.0.0.tgz", + "integrity": "sha512-JdDuS4ircJt+FDnaQj88TzZY3+njZ6O+D3uakS32f2VNnDo3vyEuNdBOh/oFd8Df1zSZOuH1HEChk2AOYDezZg==", + "dependencies": { + "tslib": "^2.5.0" + } + }, + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/util-body-length-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-2.1.0.tgz", + "integrity": "sha512-/li0/kj/y3fQ3vyzn36NTLGmUwAICb7Jbe/CsWCktW363gh1MOcpEcSO3mJ344Gv2dqz8YJCLQpb6hju/0qOWw==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/util-buffer-from": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.0.0.tgz", + "integrity": "sha512-/YNnLoHsR+4W4Vf2wL5lGv0ksg8Bmk3GEGxn2vEQt52AQaPSCuaO5PM5VM7lP1K9qHRKHwrPGktqVoAHKWHxzw==", + "dependencies": { + "@smithy/is-array-buffer": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/util-config-provider": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-2.0.0.tgz", + "integrity": "sha512-xCQ6UapcIWKxXHEU4Mcs2s7LcFQRiU3XEluM2WcCjjBtQkUN71Tb+ydGmJFPxMUrW/GWMgQEEGipLym4XG0jZg==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/util-defaults-mode-browser": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.0.9.tgz", + "integrity": "sha512-JONLJVQWT8165XoSV36ERn3SVlZLJJ4D6IeGsCSePv65Uxa93pzSLE0UMSR9Jwm4zix7rst9AS8W5QIypZWP8Q==", + "dependencies": { + "@smithy/property-provider": "^2.0.9", + "@smithy/smithy-client": "^2.1.5", + "@smithy/types": "^2.3.2", + "bowser": "^2.11.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/util-defaults-mode-node": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.0.11.tgz", + "integrity": "sha512-tmqjNsfj+bgZN6jXBe6efZnukzILA7BUytHkzqikuRLNtR+0VVchQHvawD0w6vManh76rO81ydhioe7i4oBzuA==", + "dependencies": { + "@smithy/config-resolver": "^2.0.9", + "@smithy/credential-provider-imds": "^2.0.11", + "@smithy/node-config-provider": "^2.0.11", + "@smithy/property-provider": "^2.0.9", + "@smithy/smithy-client": "^2.1.5", + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/util-hex-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-2.0.0.tgz", + "integrity": "sha512-c5xY+NUnFqG6d7HFh1IFfrm3mGl29lC+vF+geHv4ToiuJCBmIfzx6IeHLg+OgRdPFKDXIw6pvi+p3CsscaMcMA==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/util-middleware": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-2.0.1.tgz", + "integrity": "sha512-LnsBMi0Mg3gfz/TpNGLv2Jjcz2ra1OX5HR/4IaCepIYmtPQzqMWDdhX/XTW1LS8OZ0xbQuyQPcHkQ+2XkhWOVQ==", + "dependencies": { + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/util-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-2.0.1.tgz", + "integrity": "sha512-naj4X0IafJ9yJnVJ58QgSMkCNLjyQOnyrnKh/T0f+0UOUxJiT8vuFn/hS7B/pNqbo2STY7PyJ4J4f+5YqxwNtA==", + "dependencies": { + "@smithy/service-error-classification": "^2.0.1", + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/util-stream": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-2.0.11.tgz", + "integrity": "sha512-2MeWfqSpZKdmEJ+tH8CJQSgzLWhH5cmdE24X7JB0hiamXrOmswWGGuPvyj/9sQCTclo57pNxLR2p7KrP8Ahiyg==", + "dependencies": { + "@smithy/fetch-http-handler": "^2.1.4", + "@smithy/node-http-handler": "^2.1.4", + "@smithy/types": "^2.3.2", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-buffer-from": "^2.0.0", + "@smithy/util-hex-encoding": "^2.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/util-uri-escape": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-2.0.0.tgz", + "integrity": "sha512-ebkxsqinSdEooQduuk9CbKcI+wheijxEb3utGXkCoYQkJnwTnLbH1JXGimJtUkQwNQbsbuYwG2+aFVyZf5TLaw==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/util-utf8": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.0.0.tgz", + "integrity": "sha512-rctU1VkziY84n5OXe3bPNpKR001ZCME2JCaBBFgtiM2hfKbHFudc/BkMuPab8hRbLd0j3vbnBTTZ1igBf0wgiQ==", + "dependencies": { + "@smithy/util-buffer-from": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/util-waiter": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-2.0.8.tgz", + "integrity": "sha512-t9yaoofNhdEhNlyDeV5al/JJEFJ62HIQBGktgCUE63MvKn6imnbkh1qISsYMyMYVLwhWCpZ3Xa3R1LA+SnWcng==", + "dependencies": { + "@smithy/abort-controller": "^2.0.8", + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-lambda/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==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@aws-sdk/client-personalize": { + "version": "3.414.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-personalize/-/client-personalize-3.414.0.tgz", + "integrity": "sha512-KHaNSYI/TPV77/S3Ble3/Qxq5lGJO5tXY8BpfQU4Gdp92MNkPowPdx4Pn3DFYyNovAGUmA/Y2iWP+vJBtyvQSA==", + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/client-sts": "3.414.0", + "@aws-sdk/credential-provider-node": "3.414.0", + "@aws-sdk/middleware-host-header": "3.413.0", + "@aws-sdk/middleware-logger": "3.413.0", + "@aws-sdk/middleware-recursion-detection": "3.413.0", + "@aws-sdk/middleware-signing": "3.413.0", + "@aws-sdk/middleware-user-agent": "3.413.0", + "@aws-sdk/region-config-resolver": "3.413.0", + "@aws-sdk/types": "3.413.0", + "@aws-sdk/util-endpoints": "3.413.0", + "@aws-sdk/util-user-agent-browser": "3.413.0", + "@aws-sdk/util-user-agent-node": "3.413.0", + "@smithy/config-resolver": "^2.0.8", + "@smithy/fetch-http-handler": "^2.1.3", + "@smithy/hash-node": "^2.0.7", + "@smithy/invalid-dependency": "^2.0.7", + "@smithy/middleware-content-length": "^2.0.9", + "@smithy/middleware-endpoint": "^2.0.7", + "@smithy/middleware-retry": "^2.0.10", + "@smithy/middleware-serde": "^2.0.7", + "@smithy/middleware-stack": "^2.0.0", + "@smithy/node-config-provider": "^2.0.10", + "@smithy/node-http-handler": "^2.1.3", + "@smithy/protocol-http": "^3.0.3", + "@smithy/smithy-client": "^2.1.4", + "@smithy/types": "^2.3.1", + "@smithy/url-parser": "^2.0.7", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-body-length-browser": "^2.0.0", + "@smithy/util-body-length-node": "^2.1.0", + "@smithy/util-defaults-mode-browser": "^2.0.8", + "@smithy/util-defaults-mode-node": "^2.0.10", + "@smithy/util-retry": "^2.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-personalize/node_modules/@aws-sdk/types": { + "version": "3.413.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.413.0.tgz", + "integrity": "sha512-j1xib0f/TazIFc5ySIKOlT1ujntRbaoG4LJFeEezz4ji03/wSJMI8Vi4KjzpBp8J1tTu0oRDnsxRIGixsUBeYQ==", + "dependencies": { + "@smithy/types": "^2.3.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-personalize/node_modules/@smithy/abort-controller": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-2.0.8.tgz", + "integrity": "sha512-2SOdVj5y0zE37Y9scSXoizoxgi6mgnDabi7a/SOfhl0p+50I0rIkuJTfyAuTPDtQ7e5dD6tSZPCLB3c/YM6Zig==", + "dependencies": { + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-personalize/node_modules/@smithy/config-resolver": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-2.0.9.tgz", + "integrity": "sha512-QBkGPLUqyPmis9Erz8v4q5lo/ErnF7+GD5WZHa6JZiXopUPfaaM+B21n8gzS5xCkIXZmnwzNQhObP9xQPu8oqQ==", + "dependencies": { + "@smithy/node-config-provider": "^2.0.11", + "@smithy/types": "^2.3.2", + "@smithy/util-config-provider": "^2.0.0", + "@smithy/util-middleware": "^2.0.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-personalize/node_modules/@smithy/credential-provider-imds": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-2.0.11.tgz", + "integrity": "sha512-uJJs8dnM5iXkn8a2GaKvlKMhcOJ+oJPYqY9gY3CM/EieCVObIDjxUtR/g8lU/k/A+OauA78GzScAfulmFjPOYA==", + "dependencies": { + "@smithy/node-config-provider": "^2.0.11", + "@smithy/property-provider": "^2.0.9", + "@smithy/types": "^2.3.2", + "@smithy/url-parser": "^2.0.8", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-personalize/node_modules/@smithy/fetch-http-handler": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-2.1.4.tgz", + "integrity": "sha512-SL24M9W5ERByoXaVicRx+bj9GJVujDnPn+QO7GY7adhY0mPGa6DSF58pVKsgIh4r5Tx/k3SWCPlH4BxxSxA/fQ==", + "dependencies": { + "@smithy/protocol-http": "^3.0.4", + "@smithy/querystring-builder": "^2.0.8", + "@smithy/types": "^2.3.2", + "@smithy/util-base64": "^2.0.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@aws-sdk/client-personalize/node_modules/@smithy/hash-node": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-2.0.8.tgz", + "integrity": "sha512-yZL/nmxZzjZV5/QX5JWSgXlt0HxuMTwFO89CS++jOMMPiCMZngf6VYmtNdccs8IIIAMmfQeTzwu07XgUE/Zd3Q==", + "dependencies": { + "@smithy/types": "^2.3.2", + "@smithy/util-buffer-from": "^2.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-personalize/node_modules/@smithy/invalid-dependency": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-2.0.8.tgz", + "integrity": "sha512-88VOS7W3KzUz/bNRc+Sl/F/CDIasFspEE4G39YZRHIh9YmsXF7GUyVaAKURfMNulTie62ayk6BHC9O0nOBAVgQ==", + "dependencies": { + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + } + }, + "node_modules/@aws-sdk/client-personalize/node_modules/@smithy/is-array-buffer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.0.0.tgz", + "integrity": "sha512-z3PjFjMyZNI98JFRJi/U0nGoLWMSJlDjAW4QUX2WNZLas5C0CmVV6LJ01JI0k90l7FvpmixjWxPFmENSClQ7ug==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-personalize/node_modules/@smithy/middleware-content-length": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-2.0.10.tgz", + "integrity": "sha512-EGSbysyA4jH0p3xI6G0jdXoj9Iz9GUnAta6aEaHtXm3wVWtenRf80y2TeVvNkVSr5jwKOdSCjKIRI2l1A/oZLA==", + "dependencies": { + "@smithy/protocol-http": "^3.0.4", + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-personalize/node_modules/@smithy/middleware-endpoint": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-2.0.8.tgz", + "integrity": "sha512-yOpogfG2d2V0cbJdAJ6GLAWkNOc9pVsL5hZUfXcxJu408N3CUCsXzIAFF6+70ZKSE+lCfG3GFErcSXv/UfUbjw==", + "dependencies": { + "@smithy/middleware-serde": "^2.0.8", + "@smithy/types": "^2.3.2", + "@smithy/url-parser": "^2.0.8", + "@smithy/util-middleware": "^2.0.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-personalize/node_modules/@smithy/middleware-retry": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-2.0.11.tgz", + "integrity": "sha512-pknfokumZ+wvBERSuKAI2vVr+aK3ZgPiWRg6+0ZG4kKJogBRpPmDGWw+Jht0izS9ZaEbIobNzueIb4wD33JJVg==", + "dependencies": { + "@smithy/node-config-provider": "^2.0.11", + "@smithy/protocol-http": "^3.0.4", + "@smithy/service-error-classification": "^2.0.1", + "@smithy/types": "^2.3.2", + "@smithy/util-middleware": "^2.0.1", + "@smithy/util-retry": "^2.0.1", + "tslib": "^2.5.0", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-personalize/node_modules/@smithy/middleware-serde": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-2.0.8.tgz", + "integrity": "sha512-Is0sm+LiNlgsc0QpstDzifugzL9ehno1wXp109GgBgpnKTK3j+KphiparBDI4hWTtH9/7OUsxuspNqai2yyhcg==", + "dependencies": { + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-personalize/node_modules/@smithy/middleware-stack": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-2.0.1.tgz", + "integrity": "sha512-UexsfY6/oQZRjTQL56s9AKtMcR60tBNibSgNYX1I2WXaUaXg97W9JCkFyth85TzBWKDBTyhLfenrukS/kyu54A==", + "dependencies": { + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-personalize/node_modules/@smithy/node-config-provider": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-2.0.11.tgz", + "integrity": "sha512-CaR1dciSSGKttjhcefpytYjsfI/Yd5mqL8am4wfmyFCDxSiPsvnEWHl8UjM/RbcAjX0klt+CeIKPSHEc0wGvJA==", + "dependencies": { + "@smithy/property-provider": "^2.0.9", + "@smithy/shared-ini-file-loader": "^2.0.10", + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-personalize/node_modules/@smithy/node-http-handler": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-2.1.4.tgz", + "integrity": "sha512-8Rw/AusvWDyC6SK8esAcVBeTlQHf94NMFv805suFUJCQ2gwlh0oLDNh+6s2MDOrxcjvLxjjzv1mytM0Mt+0cPQ==", + "dependencies": { + "@smithy/abort-controller": "^2.0.8", + "@smithy/protocol-http": "^3.0.4", + "@smithy/querystring-builder": "^2.0.8", + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-personalize/node_modules/@smithy/property-provider": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.0.9.tgz", + "integrity": "sha512-25pPZ8f8DeRwYI5wbPRZaoMoR+3vrw8DwbA0TjP+GsdiB2KxScndr4HQehiJ5+WJ0giOTWhLz0bd+7Djv1qpUQ==", + "dependencies": { + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-personalize/node_modules/@smithy/protocol-http": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.0.4.tgz", + "integrity": "sha512-CGfSWk6TRlbwa8YgrSXdn80Yu7pov3EV/h7TSfiCHhq6/LO3WymmqnzgH1f0qV2bdTDipIkTNp5dGCGN3Af/5g==", + "dependencies": { + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-personalize/node_modules/@smithy/querystring-builder": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-2.0.8.tgz", + "integrity": "sha512-+vzIMwjC8Saz97/ptPn+IJRCRRZ+pP95ZIWDRqEqZV/a6hiKbaFoMSa2iCKsnKzR696U2JZXrDqMu3e/FD1+2g==", + "dependencies": { + "@smithy/types": "^2.3.2", + "@smithy/util-uri-escape": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-personalize/node_modules/@smithy/querystring-parser": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-2.0.8.tgz", + "integrity": "sha512-ArbanNuR7O/MmTd90ZqhDqGOPPDYmxx3huHxD+R3cuCnazcK/1tGQA+SnnR5307T7ZRb5WTpB6qBggERuibVSA==", + "dependencies": { + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-personalize/node_modules/@smithy/service-error-classification": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-2.0.1.tgz", + "integrity": "sha512-QHa9+t+v4s0cMuDCcbjIJN67mNZ42/+fc3jKe8P6ZMPXZl5ksKk6a8vhZ/m494GZng5eFTc3OePv+NF9cG83yg==", + "dependencies": { + "@smithy/types": "^2.3.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-personalize/node_modules/@smithy/shared-ini-file-loader": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.0.10.tgz", + "integrity": "sha512-jWASteSezRKohJ7GdA7pHDvmr7Q7tw3b5mu3xLHIkZy/ICftJ+O7aqNaF8wklhI7UNFoQ7flFRM3Rd0KA+1BbQ==", + "dependencies": { + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-personalize/node_modules/@smithy/smithy-client": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-2.1.5.tgz", + "integrity": "sha512-7S865uKzsxApM8W8Q6zkij7tcUFgaG8PuADMFdMt1yL/ku3d0+s6Zwrg3N7iXCPM08Gu/mf0BIfTXIu/9i450Q==", + "dependencies": { + "@smithy/middleware-stack": "^2.0.1", + "@smithy/types": "^2.3.2", + "@smithy/util-stream": "^2.0.11", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-personalize/node_modules/@smithy/types": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.3.2.tgz", + "integrity": "sha512-iH0cdKi7HQlzfAM3w2shFk/qZYKAqJWswtpmQpPtlruF+uFZeGEpMJjgDRyhWiddfVM4e2oP4nMaOBsMy6lXgg==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-personalize/node_modules/@smithy/url-parser": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-2.0.8.tgz", + "integrity": "sha512-wQw7j004ScCrBRJ+oNPXlLE9mtofxyadSZ9D8ov/rHkyurS7z1HTNuyaGRj6OvKsEk0SVQsuY0C9+EfM75XTkw==", + "dependencies": { + "@smithy/querystring-parser": "^2.0.8", + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + } + }, + "node_modules/@aws-sdk/client-personalize/node_modules/@smithy/util-base64": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-2.0.0.tgz", + "integrity": "sha512-Zb1E4xx+m5Lud8bbeYi5FkcMJMnn+1WUnJF3qD7rAdXpaL7UjkFQLdmW5fHadoKbdHpwH9vSR8EyTJFHJs++tA==", + "dependencies": { + "@smithy/util-buffer-from": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-personalize/node_modules/@smithy/util-body-length-browser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-2.0.0.tgz", + "integrity": "sha512-JdDuS4ircJt+FDnaQj88TzZY3+njZ6O+D3uakS32f2VNnDo3vyEuNdBOh/oFd8Df1zSZOuH1HEChk2AOYDezZg==", + "dependencies": { + "tslib": "^2.5.0" + } + }, + "node_modules/@aws-sdk/client-personalize/node_modules/@smithy/util-body-length-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-2.1.0.tgz", + "integrity": "sha512-/li0/kj/y3fQ3vyzn36NTLGmUwAICb7Jbe/CsWCktW363gh1MOcpEcSO3mJ344Gv2dqz8YJCLQpb6hju/0qOWw==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-personalize/node_modules/@smithy/util-buffer-from": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.0.0.tgz", + "integrity": "sha512-/YNnLoHsR+4W4Vf2wL5lGv0ksg8Bmk3GEGxn2vEQt52AQaPSCuaO5PM5VM7lP1K9qHRKHwrPGktqVoAHKWHxzw==", + "dependencies": { + "@smithy/is-array-buffer": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-personalize/node_modules/@smithy/util-config-provider": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-2.0.0.tgz", + "integrity": "sha512-xCQ6UapcIWKxXHEU4Mcs2s7LcFQRiU3XEluM2WcCjjBtQkUN71Tb+ydGmJFPxMUrW/GWMgQEEGipLym4XG0jZg==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-personalize/node_modules/@smithy/util-defaults-mode-browser": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.0.9.tgz", + "integrity": "sha512-JONLJVQWT8165XoSV36ERn3SVlZLJJ4D6IeGsCSePv65Uxa93pzSLE0UMSR9Jwm4zix7rst9AS8W5QIypZWP8Q==", + "dependencies": { + "@smithy/property-provider": "^2.0.9", + "@smithy/smithy-client": "^2.1.5", + "@smithy/types": "^2.3.2", + "bowser": "^2.11.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/client-personalize/node_modules/@smithy/util-defaults-mode-node": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.0.11.tgz", + "integrity": "sha512-tmqjNsfj+bgZN6jXBe6efZnukzILA7BUytHkzqikuRLNtR+0VVchQHvawD0w6vManh76rO81ydhioe7i4oBzuA==", + "dependencies": { + "@smithy/config-resolver": "^2.0.9", + "@smithy/credential-provider-imds": "^2.0.11", + "@smithy/node-config-provider": "^2.0.11", + "@smithy/property-provider": "^2.0.9", + "@smithy/smithy-client": "^2.1.5", + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/client-personalize/node_modules/@smithy/util-hex-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-2.0.0.tgz", + "integrity": "sha512-c5xY+NUnFqG6d7HFh1IFfrm3mGl29lC+vF+geHv4ToiuJCBmIfzx6IeHLg+OgRdPFKDXIw6pvi+p3CsscaMcMA==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-personalize/node_modules/@smithy/util-middleware": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-2.0.1.tgz", + "integrity": "sha512-LnsBMi0Mg3gfz/TpNGLv2Jjcz2ra1OX5HR/4IaCepIYmtPQzqMWDdhX/XTW1LS8OZ0xbQuyQPcHkQ+2XkhWOVQ==", + "dependencies": { + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-personalize/node_modules/@smithy/util-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-2.0.1.tgz", + "integrity": "sha512-naj4X0IafJ9yJnVJ58QgSMkCNLjyQOnyrnKh/T0f+0UOUxJiT8vuFn/hS7B/pNqbo2STY7PyJ4J4f+5YqxwNtA==", + "dependencies": { + "@smithy/service-error-classification": "^2.0.1", + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@aws-sdk/client-personalize/node_modules/@smithy/util-stream": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-2.0.11.tgz", + "integrity": "sha512-2MeWfqSpZKdmEJ+tH8CJQSgzLWhH5cmdE24X7JB0hiamXrOmswWGGuPvyj/9sQCTclo57pNxLR2p7KrP8Ahiyg==", + "dependencies": { + "@smithy/fetch-http-handler": "^2.1.4", + "@smithy/node-http-handler": "^2.1.4", + "@smithy/types": "^2.3.2", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-buffer-from": "^2.0.0", + "@smithy/util-hex-encoding": "^2.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-personalize/node_modules/@smithy/util-uri-escape": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-2.0.0.tgz", + "integrity": "sha512-ebkxsqinSdEooQduuk9CbKcI+wheijxEb3utGXkCoYQkJnwTnLbH1JXGimJtUkQwNQbsbuYwG2+aFVyZf5TLaw==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-personalize/node_modules/@smithy/util-utf8": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.0.0.tgz", + "integrity": "sha512-rctU1VkziY84n5OXe3bPNpKR001ZCME2JCaBBFgtiM2hfKbHFudc/BkMuPab8hRbLd0j3vbnBTTZ1igBf0wgiQ==", + "dependencies": { + "@smithy/util-buffer-from": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-personalize/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==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@aws-sdk/client-s3": { + "version": "3.370.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.370.0.tgz", + "integrity": "sha512-+b53hI+C+tIiE6OhIvaUXD5qC0zFrCWIu6EKT597W+4XzfFIZE0BGgolP8pC1lLDghPjCFSmAm9Efcb2a1sPvw==", + "dependencies": { + "@aws-crypto/sha1-browser": "3.0.0", + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/client-sts": "3.370.0", + "@aws-sdk/credential-provider-node": "3.370.0", + "@aws-sdk/hash-blob-browser": "3.370.0", + "@aws-sdk/hash-stream-node": "3.370.0", + "@aws-sdk/md5-js": "3.370.0", + "@aws-sdk/middleware-bucket-endpoint": "3.370.0", + "@aws-sdk/middleware-expect-continue": "3.370.0", + "@aws-sdk/middleware-flexible-checksums": "3.370.0", + "@aws-sdk/middleware-host-header": "3.370.0", + "@aws-sdk/middleware-location-constraint": "3.370.0", + "@aws-sdk/middleware-logger": "3.370.0", + "@aws-sdk/middleware-recursion-detection": "3.370.0", + "@aws-sdk/middleware-sdk-s3": "3.370.0", + "@aws-sdk/middleware-signing": "3.370.0", + "@aws-sdk/middleware-ssec": "3.370.0", + "@aws-sdk/middleware-user-agent": "3.370.0", + "@aws-sdk/signature-v4-multi-region": "3.370.0", + "@aws-sdk/types": "3.370.0", + "@aws-sdk/util-endpoints": "3.370.0", + "@aws-sdk/util-user-agent-browser": "3.370.0", + "@aws-sdk/util-user-agent-node": "3.370.0", + "@aws-sdk/xml-builder": "3.310.0", + "@smithy/config-resolver": "^1.0.1", + "@smithy/eventstream-serde-browser": "^1.0.1", + "@smithy/eventstream-serde-config-resolver": "^1.0.1", + "@smithy/eventstream-serde-node": "^1.0.1", + "@smithy/fetch-http-handler": "^1.0.1", + "@smithy/hash-node": "^1.0.1", + "@smithy/invalid-dependency": "^1.0.1", + "@smithy/middleware-content-length": "^1.0.1", + "@smithy/middleware-endpoint": "^1.0.2", + "@smithy/middleware-retry": "^1.0.3", + "@smithy/middleware-serde": "^1.0.1", + "@smithy/middleware-stack": "^1.0.1", + "@smithy/node-config-provider": "^1.0.1", + "@smithy/node-http-handler": "^1.0.2", + "@smithy/protocol-http": "^1.1.0", + "@smithy/smithy-client": "^1.0.3", + "@smithy/types": "^1.1.0", + "@smithy/url-parser": "^1.0.1", + "@smithy/util-base64": "^1.0.1", + "@smithy/util-body-length-browser": "^1.0.1", + "@smithy/util-body-length-node": "^1.0.1", + "@smithy/util-defaults-mode-browser": "^1.0.1", + "@smithy/util-defaults-mode-node": "^1.0.1", + "@smithy/util-retry": "^1.0.3", + "@smithy/util-stream": "^1.0.1", + "@smithy/util-utf8": "^1.0.1", + "@smithy/util-waiter": "^1.0.1", + "fast-xml-parser": "4.2.5", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/client-sso": { + "version": "3.370.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.370.0.tgz", + "integrity": "sha512-0Ty1iHuzNxMQtN7nahgkZr4Wcu1XvqGfrQniiGdKKif9jG/4elxsQPiydRuQpFqN6b+bg7wPP7crFP1uTxx2KQ==", + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/middleware-host-header": "3.370.0", + "@aws-sdk/middleware-logger": "3.370.0", + "@aws-sdk/middleware-recursion-detection": "3.370.0", + "@aws-sdk/middleware-user-agent": "3.370.0", + "@aws-sdk/types": "3.370.0", + "@aws-sdk/util-endpoints": "3.370.0", + "@aws-sdk/util-user-agent-browser": "3.370.0", + "@aws-sdk/util-user-agent-node": "3.370.0", + "@smithy/config-resolver": "^1.0.1", + "@smithy/fetch-http-handler": "^1.0.1", + "@smithy/hash-node": "^1.0.1", + "@smithy/invalid-dependency": "^1.0.1", + "@smithy/middleware-content-length": "^1.0.1", + "@smithy/middleware-endpoint": "^1.0.2", + "@smithy/middleware-retry": "^1.0.3", + "@smithy/middleware-serde": "^1.0.1", + "@smithy/middleware-stack": "^1.0.1", + "@smithy/node-config-provider": "^1.0.1", + "@smithy/node-http-handler": "^1.0.2", + "@smithy/protocol-http": "^1.1.0", + "@smithy/smithy-client": "^1.0.3", + "@smithy/types": "^1.1.0", + "@smithy/url-parser": "^1.0.1", + "@smithy/util-base64": "^1.0.1", + "@smithy/util-body-length-browser": "^1.0.1", + "@smithy/util-body-length-node": "^1.0.1", + "@smithy/util-defaults-mode-browser": "^1.0.1", + "@smithy/util-defaults-mode-node": "^1.0.1", + "@smithy/util-retry": "^1.0.3", + "@smithy/util-utf8": "^1.0.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/client-sso-oidc": { + "version": "3.370.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.370.0.tgz", + "integrity": "sha512-jAYOO74lmVXylQylqkPrjLzxvUnMKw476JCUTvCO6Q8nv3LzCWd76Ihgv/m9Q4M2Tbqi1iP2roVK5bstsXzEjA==", + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/middleware-host-header": "3.370.0", + "@aws-sdk/middleware-logger": "3.370.0", + "@aws-sdk/middleware-recursion-detection": "3.370.0", + "@aws-sdk/middleware-user-agent": "3.370.0", + "@aws-sdk/types": "3.370.0", + "@aws-sdk/util-endpoints": "3.370.0", + "@aws-sdk/util-user-agent-browser": "3.370.0", + "@aws-sdk/util-user-agent-node": "3.370.0", + "@smithy/config-resolver": "^1.0.1", + "@smithy/fetch-http-handler": "^1.0.1", + "@smithy/hash-node": "^1.0.1", + "@smithy/invalid-dependency": "^1.0.1", + "@smithy/middleware-content-length": "^1.0.1", + "@smithy/middleware-endpoint": "^1.0.2", + "@smithy/middleware-retry": "^1.0.3", + "@smithy/middleware-serde": "^1.0.1", + "@smithy/middleware-stack": "^1.0.1", + "@smithy/node-config-provider": "^1.0.1", + "@smithy/node-http-handler": "^1.0.2", + "@smithy/protocol-http": "^1.1.0", + "@smithy/smithy-client": "^1.0.3", + "@smithy/types": "^1.1.0", + "@smithy/url-parser": "^1.0.1", + "@smithy/util-base64": "^1.0.1", + "@smithy/util-body-length-browser": "^1.0.1", + "@smithy/util-body-length-node": "^1.0.1", + "@smithy/util-defaults-mode-browser": "^1.0.1", + "@smithy/util-defaults-mode-node": "^1.0.1", + "@smithy/util-retry": "^1.0.3", + "@smithy/util-utf8": "^1.0.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/client-sts": { + "version": "3.370.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.370.0.tgz", + "integrity": "sha512-utFxOPWIzbN+3kc415Je2o4J72hOLNhgR2Gt5EnRSggC3yOnkC4GzauxG8n7n5gZGBX45eyubHyPOXLOIyoqQA==", + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/credential-provider-node": "3.370.0", + "@aws-sdk/middleware-host-header": "3.370.0", + "@aws-sdk/middleware-logger": "3.370.0", + "@aws-sdk/middleware-recursion-detection": "3.370.0", + "@aws-sdk/middleware-sdk-sts": "3.370.0", + "@aws-sdk/middleware-signing": "3.370.0", + "@aws-sdk/middleware-user-agent": "3.370.0", + "@aws-sdk/types": "3.370.0", + "@aws-sdk/util-endpoints": "3.370.0", + "@aws-sdk/util-user-agent-browser": "3.370.0", + "@aws-sdk/util-user-agent-node": "3.370.0", "@smithy/config-resolver": "^1.0.1", "@smithy/fetch-http-handler": "^1.0.1", "@smithy/hash-node": "^1.0.1", "@smithy/invalid-dependency": "^1.0.1", "@smithy/middleware-content-length": "^1.0.1", - "@smithy/middleware-endpoint": "^1.0.1", - "@smithy/middleware-retry": "^1.0.2", + "@smithy/middleware-endpoint": "^1.0.2", + "@smithy/middleware-retry": "^1.0.3", "@smithy/middleware-serde": "^1.0.1", "@smithy/middleware-stack": "^1.0.1", "@smithy/node-config-provider": "^1.0.1", - "@smithy/node-http-handler": "^1.0.2", - "@smithy/protocol-http": "^1.0.1", - "@smithy/smithy-client": "^1.0.3", - "@smithy/types": "^1.0.0", - "@smithy/url-parser": "^1.0.1", - "@smithy/util-base64": "^1.0.1", - "@smithy/util-body-length-browser": "^1.0.1", - "@smithy/util-body-length-node": "^1.0.1", - "@smithy/util-defaults-mode-browser": "^1.0.1", - "@smithy/util-defaults-mode-node": "^1.0.1", - "@smithy/util-retry": "^1.0.2", - "@smithy/util-utf8": "^1.0.1", + "@smithy/node-http-handler": "^1.0.2", + "@smithy/protocol-http": "^1.1.0", + "@smithy/smithy-client": "^1.0.3", + "@smithy/types": "^1.1.0", + "@smithy/url-parser": "^1.0.1", + "@smithy/util-base64": "^1.0.1", + "@smithy/util-body-length-browser": "^1.0.1", + "@smithy/util-body-length-node": "^1.0.1", + "@smithy/util-defaults-mode-browser": "^1.0.1", + "@smithy/util-defaults-mode-node": "^1.0.1", + "@smithy/util-retry": "^1.0.3", + "@smithy/util-utf8": "^1.0.1", + "fast-xml-parser": "4.2.5", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/credential-provider-env": { + "version": "3.370.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.370.0.tgz", + "integrity": "sha512-raR3yP/4GGbKFRPP5hUBNkEmTnzxI9mEc2vJAJrcv4G4J4i/UP6ELiLInQ5eO2/VcV/CeKGZA3t7d1tsJ+jhCg==", + "dependencies": { + "@aws-sdk/types": "3.370.0", + "@smithy/property-provider": "^1.0.1", + "@smithy/types": "^1.1.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.370.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.370.0.tgz", + "integrity": "sha512-eJyapFKa4NrC9RfTgxlXnXfS9InG/QMEUPPVL+VhG7YS6nKqetC1digOYgivnEeu+XSKE0DJ7uZuXujN2Y7VAQ==", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.370.0", + "@aws-sdk/credential-provider-process": "3.370.0", + "@aws-sdk/credential-provider-sso": "3.370.0", + "@aws-sdk/credential-provider-web-identity": "3.370.0", + "@aws-sdk/types": "3.370.0", + "@smithy/credential-provider-imds": "^1.0.1", + "@smithy/property-provider": "^1.0.1", + "@smithy/shared-ini-file-loader": "^1.0.1", + "@smithy/types": "^1.1.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/credential-provider-node": { + "version": "3.370.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.370.0.tgz", + "integrity": "sha512-gkFiotBFKE4Fcn8CzQnMeab9TAR06FEAD02T4ZRYW1xGrBJOowmje9dKqdwQFHSPgnWAP+8HoTA8iwbhTLvjNA==", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.370.0", + "@aws-sdk/credential-provider-ini": "3.370.0", + "@aws-sdk/credential-provider-process": "3.370.0", + "@aws-sdk/credential-provider-sso": "3.370.0", + "@aws-sdk/credential-provider-web-identity": "3.370.0", + "@aws-sdk/types": "3.370.0", + "@smithy/credential-provider-imds": "^1.0.1", + "@smithy/property-provider": "^1.0.1", + "@smithy/shared-ini-file-loader": "^1.0.1", + "@smithy/types": "^1.1.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/credential-provider-process": { + "version": "3.370.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.370.0.tgz", + "integrity": "sha512-0BKFFZmUO779Xdw3u7wWnoWhYA4zygxJbgGVSyjkOGBvdkbPSTTcdwT1KFkaQy2kOXYeZPl+usVVRXs+ph4ejg==", + "dependencies": { + "@aws-sdk/types": "3.370.0", + "@smithy/property-provider": "^1.0.1", + "@smithy/shared-ini-file-loader": "^1.0.1", + "@smithy/types": "^1.1.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.370.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.370.0.tgz", + "integrity": "sha512-PFroYm5hcPSfC/jkZnCI34QFL3I7WVKveVk6/F3fud/cnP8hp6YjA9NiTNbqdFSzsyoiN/+e5fZgNKih8vVPTA==", + "dependencies": { + "@aws-sdk/client-sso": "3.370.0", + "@aws-sdk/token-providers": "3.370.0", + "@aws-sdk/types": "3.370.0", + "@smithy/property-provider": "^1.0.1", + "@smithy/shared-ini-file-loader": "^1.0.1", + "@smithy/types": "^1.1.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.370.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.370.0.tgz", + "integrity": "sha512-CFaBMLRudwhjv1sDzybNV93IaT85IwS+L8Wq6VRMa0mro1q9rrWsIZO811eF+k0NEPfgU1dLH+8Vc2qhw4SARQ==", + "dependencies": { + "@aws-sdk/types": "3.370.0", + "@smithy/property-provider": "^1.0.1", + "@smithy/types": "^1.1.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/middleware-host-header": { + "version": "3.370.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.370.0.tgz", + "integrity": "sha512-CPXOm/TnOFC7KyXcJglICC7OiA7Kj6mT3ChvEijr56TFOueNHvJdV4aNIFEQy0vGHOWtY12qOWLNto/wYR1BAQ==", + "dependencies": { + "@aws-sdk/types": "3.370.0", + "@smithy/protocol-http": "^1.1.0", + "@smithy/types": "^1.1.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/middleware-logger": { + "version": "3.370.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.370.0.tgz", + "integrity": "sha512-cQMq9SaZ/ORmTJPCT6VzMML7OxFdQzNkhMAgKpTDl+tdPWynlHF29E5xGoSzROnThHlQPCjogU0NZ8AxI0SWPA==", + "dependencies": { + "@aws-sdk/types": "3.370.0", + "@smithy/types": "^1.1.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.370.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.370.0.tgz", + "integrity": "sha512-L7ZF/w0lAAY/GK1khT8VdoU0XB7nWHk51rl/ecAg64J70dHnMOAg8n+5FZ9fBu/xH1FwUlHOkwlodJOgzLJjtg==", + "dependencies": { + "@aws-sdk/types": "3.370.0", + "@smithy/protocol-http": "^1.1.0", + "@smithy/types": "^1.1.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/middleware-sdk-sts": { + "version": "3.370.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.370.0.tgz", + "integrity": "sha512-ykbsoVy0AJtVbuhAlTAMcaz/tCE3pT8nAp0L7CQQxSoanRCvOux7au0KwMIQVhxgnYid4dWVF6d00SkqU5MXRA==", + "dependencies": { + "@aws-sdk/middleware-signing": "3.370.0", + "@aws-sdk/types": "3.370.0", + "@smithy/types": "^1.1.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/middleware-signing": { + "version": "3.370.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.370.0.tgz", + "integrity": "sha512-Dwr/RTCWOXdm394wCwICGT2VNOTMRe4IGPsBRJAsM24pm+EEqQzSS3Xu/U/zF4exuxqpMta4wec4QpSarPNTxA==", + "dependencies": { + "@aws-sdk/types": "3.370.0", + "@smithy/property-provider": "^1.0.1", + "@smithy/protocol-http": "^1.1.0", + "@smithy/signature-v4": "^1.0.1", + "@smithy/types": "^1.1.0", + "@smithy/util-middleware": "^1.0.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.370.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.370.0.tgz", + "integrity": "sha512-2+3SB6MtMAq1+gVXhw0Y3ONXuljorh6ijnxgTpv+uQnBW5jHCUiAS8WDYiDEm7i9euJPbvJfM8WUrSMDMU6Cog==", + "dependencies": { + "@aws-sdk/types": "3.370.0", + "@aws-sdk/util-endpoints": "3.370.0", + "@smithy/protocol-http": "^1.1.0", + "@smithy/types": "^1.1.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/token-providers": { + "version": "3.370.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.370.0.tgz", + "integrity": "sha512-EyR2ZYr+lJeRiZU2/eLR+mlYU9RXLQvNyGFSAekJKgN13Rpq/h0syzXVFLP/RSod/oZenh/fhVZ2HwlZxuGBtQ==", + "dependencies": { + "@aws-sdk/client-sso-oidc": "3.370.0", + "@aws-sdk/types": "3.370.0", + "@smithy/property-provider": "^1.0.1", + "@smithy/shared-ini-file-loader": "^1.0.1", + "@smithy/types": "^1.1.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/util-endpoints": { + "version": "3.370.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.370.0.tgz", + "integrity": "sha512-5ltVAnM79nRlywwzZN5i8Jp4tk245OCGkKwwXbnDU+gq7zT3CIOsct1wNZvmpfZEPGt/bv7/NyRcjP+7XNsX/g==", + "dependencies": { + "@aws-sdk/types": "3.370.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.370.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.370.0.tgz", + "integrity": "sha512-028LxYZMQ0DANKhW+AKFQslkScZUeYlPmSphrCIXgdIItRZh6ZJHGzE7J/jDsEntZOrZJsjI4z0zZ5W2idj04w==", + "dependencies": { + "@aws-sdk/types": "3.370.0", + "@smithy/types": "^1.1.0", + "bowser": "^2.11.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.370.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.370.0.tgz", + "integrity": "sha512-33vxZUp8vxTT/DGYIR3PivQm07sSRGWI+4fCv63Rt7Q++fO24E0kQtmVAlikRY810I10poD6rwILVtITtFSzkg==", + "dependencies": { + "@aws-sdk/types": "3.370.0", + "@smithy/node-config-provider": "^1.0.1", + "@smithy/types": "^1.1.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } + } + }, + "node_modules/@aws-sdk/client-sso": { + "version": "3.414.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.414.0.tgz", + "integrity": "sha512-GvRwQ7wA3edzsQEKS70ZPhkOUZ62PAiXasjp6GxrsADEb8sV1z4FxXNl9Un/7fQxKkh9QYaK1Wu1PmhLi9MLMg==", + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/middleware-host-header": "3.413.0", + "@aws-sdk/middleware-logger": "3.413.0", + "@aws-sdk/middleware-recursion-detection": "3.413.0", + "@aws-sdk/middleware-user-agent": "3.413.0", + "@aws-sdk/region-config-resolver": "3.413.0", + "@aws-sdk/types": "3.413.0", + "@aws-sdk/util-endpoints": "3.413.0", + "@aws-sdk/util-user-agent-browser": "3.413.0", + "@aws-sdk/util-user-agent-node": "3.413.0", + "@smithy/config-resolver": "^2.0.8", + "@smithy/fetch-http-handler": "^2.1.3", + "@smithy/hash-node": "^2.0.7", + "@smithy/invalid-dependency": "^2.0.7", + "@smithy/middleware-content-length": "^2.0.9", + "@smithy/middleware-endpoint": "^2.0.7", + "@smithy/middleware-retry": "^2.0.10", + "@smithy/middleware-serde": "^2.0.7", + "@smithy/middleware-stack": "^2.0.0", + "@smithy/node-config-provider": "^2.0.10", + "@smithy/node-http-handler": "^2.1.3", + "@smithy/protocol-http": "^3.0.3", + "@smithy/smithy-client": "^2.1.4", + "@smithy/types": "^2.3.1", + "@smithy/url-parser": "^2.0.7", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-body-length-browser": "^2.0.0", + "@smithy/util-body-length-node": "^2.1.0", + "@smithy/util-defaults-mode-browser": "^2.0.8", + "@smithy/util-defaults-mode-node": "^2.0.10", + "@smithy/util-retry": "^2.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@aws-sdk/types": { + "version": "3.413.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.413.0.tgz", + "integrity": "sha512-j1xib0f/TazIFc5ySIKOlT1ujntRbaoG4LJFeEezz4ji03/wSJMI8Vi4KjzpBp8J1tTu0oRDnsxRIGixsUBeYQ==", + "dependencies": { + "@smithy/types": "^2.3.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/abort-controller": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-2.0.8.tgz", + "integrity": "sha512-2SOdVj5y0zE37Y9scSXoizoxgi6mgnDabi7a/SOfhl0p+50I0rIkuJTfyAuTPDtQ7e5dD6tSZPCLB3c/YM6Zig==", + "dependencies": { + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/config-resolver": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-2.0.9.tgz", + "integrity": "sha512-QBkGPLUqyPmis9Erz8v4q5lo/ErnF7+GD5WZHa6JZiXopUPfaaM+B21n8gzS5xCkIXZmnwzNQhObP9xQPu8oqQ==", + "dependencies": { + "@smithy/node-config-provider": "^2.0.11", + "@smithy/types": "^2.3.2", + "@smithy/util-config-provider": "^2.0.0", + "@smithy/util-middleware": "^2.0.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/credential-provider-imds": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-2.0.11.tgz", + "integrity": "sha512-uJJs8dnM5iXkn8a2GaKvlKMhcOJ+oJPYqY9gY3CM/EieCVObIDjxUtR/g8lU/k/A+OauA78GzScAfulmFjPOYA==", + "dependencies": { + "@smithy/node-config-provider": "^2.0.11", + "@smithy/property-provider": "^2.0.9", + "@smithy/types": "^2.3.2", + "@smithy/url-parser": "^2.0.8", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/fetch-http-handler": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-2.1.4.tgz", + "integrity": "sha512-SL24M9W5ERByoXaVicRx+bj9GJVujDnPn+QO7GY7adhY0mPGa6DSF58pVKsgIh4r5Tx/k3SWCPlH4BxxSxA/fQ==", + "dependencies": { + "@smithy/protocol-http": "^3.0.4", + "@smithy/querystring-builder": "^2.0.8", + "@smithy/types": "^2.3.2", + "@smithy/util-base64": "^2.0.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/hash-node": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-2.0.8.tgz", + "integrity": "sha512-yZL/nmxZzjZV5/QX5JWSgXlt0HxuMTwFO89CS++jOMMPiCMZngf6VYmtNdccs8IIIAMmfQeTzwu07XgUE/Zd3Q==", + "dependencies": { + "@smithy/types": "^2.3.2", + "@smithy/util-buffer-from": "^2.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/invalid-dependency": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-2.0.8.tgz", + "integrity": "sha512-88VOS7W3KzUz/bNRc+Sl/F/CDIasFspEE4G39YZRHIh9YmsXF7GUyVaAKURfMNulTie62ayk6BHC9O0nOBAVgQ==", + "dependencies": { + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/is-array-buffer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.0.0.tgz", + "integrity": "sha512-z3PjFjMyZNI98JFRJi/U0nGoLWMSJlDjAW4QUX2WNZLas5C0CmVV6LJ01JI0k90l7FvpmixjWxPFmENSClQ7ug==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/middleware-content-length": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-2.0.10.tgz", + "integrity": "sha512-EGSbysyA4jH0p3xI6G0jdXoj9Iz9GUnAta6aEaHtXm3wVWtenRf80y2TeVvNkVSr5jwKOdSCjKIRI2l1A/oZLA==", + "dependencies": { + "@smithy/protocol-http": "^3.0.4", + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/middleware-endpoint": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-2.0.8.tgz", + "integrity": "sha512-yOpogfG2d2V0cbJdAJ6GLAWkNOc9pVsL5hZUfXcxJu408N3CUCsXzIAFF6+70ZKSE+lCfG3GFErcSXv/UfUbjw==", + "dependencies": { + "@smithy/middleware-serde": "^2.0.8", + "@smithy/types": "^2.3.2", + "@smithy/url-parser": "^2.0.8", + "@smithy/util-middleware": "^2.0.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/middleware-retry": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-2.0.11.tgz", + "integrity": "sha512-pknfokumZ+wvBERSuKAI2vVr+aK3ZgPiWRg6+0ZG4kKJogBRpPmDGWw+Jht0izS9ZaEbIobNzueIb4wD33JJVg==", + "dependencies": { + "@smithy/node-config-provider": "^2.0.11", + "@smithy/protocol-http": "^3.0.4", + "@smithy/service-error-classification": "^2.0.1", + "@smithy/types": "^2.3.2", + "@smithy/util-middleware": "^2.0.1", + "@smithy/util-retry": "^2.0.1", + "tslib": "^2.5.0", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/middleware-serde": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-2.0.8.tgz", + "integrity": "sha512-Is0sm+LiNlgsc0QpstDzifugzL9ehno1wXp109GgBgpnKTK3j+KphiparBDI4hWTtH9/7OUsxuspNqai2yyhcg==", + "dependencies": { + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/middleware-stack": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-2.0.1.tgz", + "integrity": "sha512-UexsfY6/oQZRjTQL56s9AKtMcR60tBNibSgNYX1I2WXaUaXg97W9JCkFyth85TzBWKDBTyhLfenrukS/kyu54A==", + "dependencies": { + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/node-config-provider": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-2.0.11.tgz", + "integrity": "sha512-CaR1dciSSGKttjhcefpytYjsfI/Yd5mqL8am4wfmyFCDxSiPsvnEWHl8UjM/RbcAjX0klt+CeIKPSHEc0wGvJA==", + "dependencies": { + "@smithy/property-provider": "^2.0.9", + "@smithy/shared-ini-file-loader": "^2.0.10", + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/node-http-handler": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-2.1.4.tgz", + "integrity": "sha512-8Rw/AusvWDyC6SK8esAcVBeTlQHf94NMFv805suFUJCQ2gwlh0oLDNh+6s2MDOrxcjvLxjjzv1mytM0Mt+0cPQ==", + "dependencies": { + "@smithy/abort-controller": "^2.0.8", + "@smithy/protocol-http": "^3.0.4", + "@smithy/querystring-builder": "^2.0.8", + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/property-provider": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.0.9.tgz", + "integrity": "sha512-25pPZ8f8DeRwYI5wbPRZaoMoR+3vrw8DwbA0TjP+GsdiB2KxScndr4HQehiJ5+WJ0giOTWhLz0bd+7Djv1qpUQ==", + "dependencies": { + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/protocol-http": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.0.4.tgz", + "integrity": "sha512-CGfSWk6TRlbwa8YgrSXdn80Yu7pov3EV/h7TSfiCHhq6/LO3WymmqnzgH1f0qV2bdTDipIkTNp5dGCGN3Af/5g==", + "dependencies": { + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/querystring-builder": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-2.0.8.tgz", + "integrity": "sha512-+vzIMwjC8Saz97/ptPn+IJRCRRZ+pP95ZIWDRqEqZV/a6hiKbaFoMSa2iCKsnKzR696U2JZXrDqMu3e/FD1+2g==", + "dependencies": { + "@smithy/types": "^2.3.2", + "@smithy/util-uri-escape": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/querystring-parser": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-2.0.8.tgz", + "integrity": "sha512-ArbanNuR7O/MmTd90ZqhDqGOPPDYmxx3huHxD+R3cuCnazcK/1tGQA+SnnR5307T7ZRb5WTpB6qBggERuibVSA==", + "dependencies": { + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/service-error-classification": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-2.0.1.tgz", + "integrity": "sha512-QHa9+t+v4s0cMuDCcbjIJN67mNZ42/+fc3jKe8P6ZMPXZl5ksKk6a8vhZ/m494GZng5eFTc3OePv+NF9cG83yg==", + "dependencies": { + "@smithy/types": "^2.3.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/shared-ini-file-loader": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.0.10.tgz", + "integrity": "sha512-jWASteSezRKohJ7GdA7pHDvmr7Q7tw3b5mu3xLHIkZy/ICftJ+O7aqNaF8wklhI7UNFoQ7flFRM3Rd0KA+1BbQ==", + "dependencies": { + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/smithy-client": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-2.1.5.tgz", + "integrity": "sha512-7S865uKzsxApM8W8Q6zkij7tcUFgaG8PuADMFdMt1yL/ku3d0+s6Zwrg3N7iXCPM08Gu/mf0BIfTXIu/9i450Q==", + "dependencies": { + "@smithy/middleware-stack": "^2.0.1", + "@smithy/types": "^2.3.2", + "@smithy/util-stream": "^2.0.11", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/types": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.3.2.tgz", + "integrity": "sha512-iH0cdKi7HQlzfAM3w2shFk/qZYKAqJWswtpmQpPtlruF+uFZeGEpMJjgDRyhWiddfVM4e2oP4nMaOBsMy6lXgg==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/url-parser": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-2.0.8.tgz", + "integrity": "sha512-wQw7j004ScCrBRJ+oNPXlLE9mtofxyadSZ9D8ov/rHkyurS7z1HTNuyaGRj6OvKsEk0SVQsuY0C9+EfM75XTkw==", + "dependencies": { + "@smithy/querystring-parser": "^2.0.8", + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-base64": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-2.0.0.tgz", + "integrity": "sha512-Zb1E4xx+m5Lud8bbeYi5FkcMJMnn+1WUnJF3qD7rAdXpaL7UjkFQLdmW5fHadoKbdHpwH9vSR8EyTJFHJs++tA==", + "dependencies": { + "@smithy/util-buffer-from": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-body-length-browser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-2.0.0.tgz", + "integrity": "sha512-JdDuS4ircJt+FDnaQj88TzZY3+njZ6O+D3uakS32f2VNnDo3vyEuNdBOh/oFd8Df1zSZOuH1HEChk2AOYDezZg==", + "dependencies": { + "tslib": "^2.5.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-body-length-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-2.1.0.tgz", + "integrity": "sha512-/li0/kj/y3fQ3vyzn36NTLGmUwAICb7Jbe/CsWCktW363gh1MOcpEcSO3mJ344Gv2dqz8YJCLQpb6hju/0qOWw==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-buffer-from": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.0.0.tgz", + "integrity": "sha512-/YNnLoHsR+4W4Vf2wL5lGv0ksg8Bmk3GEGxn2vEQt52AQaPSCuaO5PM5VM7lP1K9qHRKHwrPGktqVoAHKWHxzw==", + "dependencies": { + "@smithy/is-array-buffer": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-config-provider": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-2.0.0.tgz", + "integrity": "sha512-xCQ6UapcIWKxXHEU4Mcs2s7LcFQRiU3XEluM2WcCjjBtQkUN71Tb+ydGmJFPxMUrW/GWMgQEEGipLym4XG0jZg==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-defaults-mode-browser": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.0.9.tgz", + "integrity": "sha512-JONLJVQWT8165XoSV36ERn3SVlZLJJ4D6IeGsCSePv65Uxa93pzSLE0UMSR9Jwm4zix7rst9AS8W5QIypZWP8Q==", + "dependencies": { + "@smithy/property-provider": "^2.0.9", + "@smithy/smithy-client": "^2.1.5", + "@smithy/types": "^2.3.2", + "bowser": "^2.11.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-defaults-mode-node": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.0.11.tgz", + "integrity": "sha512-tmqjNsfj+bgZN6jXBe6efZnukzILA7BUytHkzqikuRLNtR+0VVchQHvawD0w6vManh76rO81ydhioe7i4oBzuA==", + "dependencies": { + "@smithy/config-resolver": "^2.0.9", + "@smithy/credential-provider-imds": "^2.0.11", + "@smithy/node-config-provider": "^2.0.11", + "@smithy/property-provider": "^2.0.9", + "@smithy/smithy-client": "^2.1.5", + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-hex-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-2.0.0.tgz", + "integrity": "sha512-c5xY+NUnFqG6d7HFh1IFfrm3mGl29lC+vF+geHv4ToiuJCBmIfzx6IeHLg+OgRdPFKDXIw6pvi+p3CsscaMcMA==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-middleware": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-2.0.1.tgz", + "integrity": "sha512-LnsBMi0Mg3gfz/TpNGLv2Jjcz2ra1OX5HR/4IaCepIYmtPQzqMWDdhX/XTW1LS8OZ0xbQuyQPcHkQ+2XkhWOVQ==", + "dependencies": { + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-2.0.1.tgz", + "integrity": "sha512-naj4X0IafJ9yJnVJ58QgSMkCNLjyQOnyrnKh/T0f+0UOUxJiT8vuFn/hS7B/pNqbo2STY7PyJ4J4f+5YqxwNtA==", + "dependencies": { + "@smithy/service-error-classification": "^2.0.1", + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-stream": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-2.0.11.tgz", + "integrity": "sha512-2MeWfqSpZKdmEJ+tH8CJQSgzLWhH5cmdE24X7JB0hiamXrOmswWGGuPvyj/9sQCTclo57pNxLR2p7KrP8Ahiyg==", + "dependencies": { + "@smithy/fetch-http-handler": "^2.1.4", + "@smithy/node-http-handler": "^2.1.4", + "@smithy/types": "^2.3.2", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-buffer-from": "^2.0.0", + "@smithy/util-hex-encoding": "^2.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-uri-escape": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-2.0.0.tgz", + "integrity": "sha512-ebkxsqinSdEooQduuk9CbKcI+wheijxEb3utGXkCoYQkJnwTnLbH1JXGimJtUkQwNQbsbuYwG2+aFVyZf5TLaw==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-utf8": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.0.0.tgz", + "integrity": "sha512-rctU1VkziY84n5OXe3bPNpKR001ZCME2JCaBBFgtiM2hfKbHFudc/BkMuPab8hRbLd0j3vbnBTTZ1igBf0wgiQ==", + "dependencies": { + "@smithy/util-buffer-from": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/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==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@aws-sdk/client-sts": { + "version": "3.414.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.414.0.tgz", + "integrity": "sha512-xeYH3si6Imp1EWolWn1zuxJJu2AXKwXl1HDftQULwC5AWkm1mNFbXYSJN4hQul1IM+kn+JTRB0XRHByQkKhe+Q==", + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/credential-provider-node": "3.414.0", + "@aws-sdk/middleware-host-header": "3.413.0", + "@aws-sdk/middleware-logger": "3.413.0", + "@aws-sdk/middleware-recursion-detection": "3.413.0", + "@aws-sdk/middleware-sdk-sts": "3.413.0", + "@aws-sdk/middleware-signing": "3.413.0", + "@aws-sdk/middleware-user-agent": "3.413.0", + "@aws-sdk/region-config-resolver": "3.413.0", + "@aws-sdk/types": "3.413.0", + "@aws-sdk/util-endpoints": "3.413.0", + "@aws-sdk/util-user-agent-browser": "3.413.0", + "@aws-sdk/util-user-agent-node": "3.413.0", + "@smithy/config-resolver": "^2.0.8", + "@smithy/fetch-http-handler": "^2.1.3", + "@smithy/hash-node": "^2.0.7", + "@smithy/invalid-dependency": "^2.0.7", + "@smithy/middleware-content-length": "^2.0.9", + "@smithy/middleware-endpoint": "^2.0.7", + "@smithy/middleware-retry": "^2.0.10", + "@smithy/middleware-serde": "^2.0.7", + "@smithy/middleware-stack": "^2.0.0", + "@smithy/node-config-provider": "^2.0.10", + "@smithy/node-http-handler": "^2.1.3", + "@smithy/protocol-http": "^3.0.3", + "@smithy/smithy-client": "^2.1.4", + "@smithy/types": "^2.3.1", + "@smithy/url-parser": "^2.0.7", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-body-length-browser": "^2.0.0", + "@smithy/util-body-length-node": "^2.1.0", + "@smithy/util-defaults-mode-browser": "^2.0.8", + "@smithy/util-defaults-mode-node": "^2.0.10", + "@smithy/util-retry": "^2.0.0", + "@smithy/util-utf8": "^2.0.0", + "fast-xml-parser": "4.2.5", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/types": { + "version": "3.413.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.413.0.tgz", + "integrity": "sha512-j1xib0f/TazIFc5ySIKOlT1ujntRbaoG4LJFeEezz4ji03/wSJMI8Vi4KjzpBp8J1tTu0oRDnsxRIGixsUBeYQ==", + "dependencies": { + "@smithy/types": "^2.3.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sts/node_modules/@smithy/abort-controller": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-2.0.8.tgz", + "integrity": "sha512-2SOdVj5y0zE37Y9scSXoizoxgi6mgnDabi7a/SOfhl0p+50I0rIkuJTfyAuTPDtQ7e5dD6tSZPCLB3c/YM6Zig==", + "dependencies": { + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sts/node_modules/@smithy/config-resolver": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-2.0.9.tgz", + "integrity": "sha512-QBkGPLUqyPmis9Erz8v4q5lo/ErnF7+GD5WZHa6JZiXopUPfaaM+B21n8gzS5xCkIXZmnwzNQhObP9xQPu8oqQ==", + "dependencies": { + "@smithy/node-config-provider": "^2.0.11", + "@smithy/types": "^2.3.2", + "@smithy/util-config-provider": "^2.0.0", + "@smithy/util-middleware": "^2.0.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sts/node_modules/@smithy/credential-provider-imds": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-2.0.11.tgz", + "integrity": "sha512-uJJs8dnM5iXkn8a2GaKvlKMhcOJ+oJPYqY9gY3CM/EieCVObIDjxUtR/g8lU/k/A+OauA78GzScAfulmFjPOYA==", + "dependencies": { + "@smithy/node-config-provider": "^2.0.11", + "@smithy/property-provider": "^2.0.9", + "@smithy/types": "^2.3.2", + "@smithy/url-parser": "^2.0.8", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sts/node_modules/@smithy/fetch-http-handler": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-2.1.4.tgz", + "integrity": "sha512-SL24M9W5ERByoXaVicRx+bj9GJVujDnPn+QO7GY7adhY0mPGa6DSF58pVKsgIh4r5Tx/k3SWCPlH4BxxSxA/fQ==", + "dependencies": { + "@smithy/protocol-http": "^3.0.4", + "@smithy/querystring-builder": "^2.0.8", + "@smithy/types": "^2.3.2", + "@smithy/util-base64": "^2.0.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@aws-sdk/client-sts/node_modules/@smithy/hash-node": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-2.0.8.tgz", + "integrity": "sha512-yZL/nmxZzjZV5/QX5JWSgXlt0HxuMTwFO89CS++jOMMPiCMZngf6VYmtNdccs8IIIAMmfQeTzwu07XgUE/Zd3Q==", + "dependencies": { + "@smithy/types": "^2.3.2", + "@smithy/util-buffer-from": "^2.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sts/node_modules/@smithy/invalid-dependency": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-2.0.8.tgz", + "integrity": "sha512-88VOS7W3KzUz/bNRc+Sl/F/CDIasFspEE4G39YZRHIh9YmsXF7GUyVaAKURfMNulTie62ayk6BHC9O0nOBAVgQ==", + "dependencies": { + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + } + }, + "node_modules/@aws-sdk/client-sts/node_modules/@smithy/is-array-buffer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.0.0.tgz", + "integrity": "sha512-z3PjFjMyZNI98JFRJi/U0nGoLWMSJlDjAW4QUX2WNZLas5C0CmVV6LJ01JI0k90l7FvpmixjWxPFmENSClQ7ug==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sts/node_modules/@smithy/middleware-content-length": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-2.0.10.tgz", + "integrity": "sha512-EGSbysyA4jH0p3xI6G0jdXoj9Iz9GUnAta6aEaHtXm3wVWtenRf80y2TeVvNkVSr5jwKOdSCjKIRI2l1A/oZLA==", + "dependencies": { + "@smithy/protocol-http": "^3.0.4", + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sts/node_modules/@smithy/middleware-endpoint": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-2.0.8.tgz", + "integrity": "sha512-yOpogfG2d2V0cbJdAJ6GLAWkNOc9pVsL5hZUfXcxJu408N3CUCsXzIAFF6+70ZKSE+lCfG3GFErcSXv/UfUbjw==", + "dependencies": { + "@smithy/middleware-serde": "^2.0.8", + "@smithy/types": "^2.3.2", + "@smithy/url-parser": "^2.0.8", + "@smithy/util-middleware": "^2.0.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sts/node_modules/@smithy/middleware-retry": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-2.0.11.tgz", + "integrity": "sha512-pknfokumZ+wvBERSuKAI2vVr+aK3ZgPiWRg6+0ZG4kKJogBRpPmDGWw+Jht0izS9ZaEbIobNzueIb4wD33JJVg==", + "dependencies": { + "@smithy/node-config-provider": "^2.0.11", + "@smithy/protocol-http": "^3.0.4", + "@smithy/service-error-classification": "^2.0.1", + "@smithy/types": "^2.3.2", + "@smithy/util-middleware": "^2.0.1", + "@smithy/util-retry": "^2.0.1", + "tslib": "^2.5.0", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sts/node_modules/@smithy/middleware-serde": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-2.0.8.tgz", + "integrity": "sha512-Is0sm+LiNlgsc0QpstDzifugzL9ehno1wXp109GgBgpnKTK3j+KphiparBDI4hWTtH9/7OUsxuspNqai2yyhcg==", + "dependencies": { + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sts/node_modules/@smithy/middleware-stack": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-2.0.1.tgz", + "integrity": "sha512-UexsfY6/oQZRjTQL56s9AKtMcR60tBNibSgNYX1I2WXaUaXg97W9JCkFyth85TzBWKDBTyhLfenrukS/kyu54A==", + "dependencies": { + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sts/node_modules/@smithy/node-config-provider": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-2.0.11.tgz", + "integrity": "sha512-CaR1dciSSGKttjhcefpytYjsfI/Yd5mqL8am4wfmyFCDxSiPsvnEWHl8UjM/RbcAjX0klt+CeIKPSHEc0wGvJA==", + "dependencies": { + "@smithy/property-provider": "^2.0.9", + "@smithy/shared-ini-file-loader": "^2.0.10", + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sts/node_modules/@smithy/node-http-handler": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-2.1.4.tgz", + "integrity": "sha512-8Rw/AusvWDyC6SK8esAcVBeTlQHf94NMFv805suFUJCQ2gwlh0oLDNh+6s2MDOrxcjvLxjjzv1mytM0Mt+0cPQ==", + "dependencies": { + "@smithy/abort-controller": "^2.0.8", + "@smithy/protocol-http": "^3.0.4", + "@smithy/querystring-builder": "^2.0.8", + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sts/node_modules/@smithy/property-provider": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.0.9.tgz", + "integrity": "sha512-25pPZ8f8DeRwYI5wbPRZaoMoR+3vrw8DwbA0TjP+GsdiB2KxScndr4HQehiJ5+WJ0giOTWhLz0bd+7Djv1qpUQ==", + "dependencies": { + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sts/node_modules/@smithy/protocol-http": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.0.4.tgz", + "integrity": "sha512-CGfSWk6TRlbwa8YgrSXdn80Yu7pov3EV/h7TSfiCHhq6/LO3WymmqnzgH1f0qV2bdTDipIkTNp5dGCGN3Af/5g==", + "dependencies": { + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sts/node_modules/@smithy/querystring-builder": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-2.0.8.tgz", + "integrity": "sha512-+vzIMwjC8Saz97/ptPn+IJRCRRZ+pP95ZIWDRqEqZV/a6hiKbaFoMSa2iCKsnKzR696U2JZXrDqMu3e/FD1+2g==", + "dependencies": { + "@smithy/types": "^2.3.2", + "@smithy/util-uri-escape": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sts/node_modules/@smithy/querystring-parser": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-2.0.8.tgz", + "integrity": "sha512-ArbanNuR7O/MmTd90ZqhDqGOPPDYmxx3huHxD+R3cuCnazcK/1tGQA+SnnR5307T7ZRb5WTpB6qBggERuibVSA==", + "dependencies": { + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sts/node_modules/@smithy/service-error-classification": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-2.0.1.tgz", + "integrity": "sha512-QHa9+t+v4s0cMuDCcbjIJN67mNZ42/+fc3jKe8P6ZMPXZl5ksKk6a8vhZ/m494GZng5eFTc3OePv+NF9cG83yg==", + "dependencies": { + "@smithy/types": "^2.3.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sts/node_modules/@smithy/shared-ini-file-loader": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.0.10.tgz", + "integrity": "sha512-jWASteSezRKohJ7GdA7pHDvmr7Q7tw3b5mu3xLHIkZy/ICftJ+O7aqNaF8wklhI7UNFoQ7flFRM3Rd0KA+1BbQ==", + "dependencies": { + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sts/node_modules/@smithy/smithy-client": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-2.1.5.tgz", + "integrity": "sha512-7S865uKzsxApM8W8Q6zkij7tcUFgaG8PuADMFdMt1yL/ku3d0+s6Zwrg3N7iXCPM08Gu/mf0BIfTXIu/9i450Q==", + "dependencies": { + "@smithy/middleware-stack": "^2.0.1", + "@smithy/types": "^2.3.2", + "@smithy/util-stream": "^2.0.11", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sts/node_modules/@smithy/types": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.3.2.tgz", + "integrity": "sha512-iH0cdKi7HQlzfAM3w2shFk/qZYKAqJWswtpmQpPtlruF+uFZeGEpMJjgDRyhWiddfVM4e2oP4nMaOBsMy6lXgg==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sts/node_modules/@smithy/url-parser": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-2.0.8.tgz", + "integrity": "sha512-wQw7j004ScCrBRJ+oNPXlLE9mtofxyadSZ9D8ov/rHkyurS7z1HTNuyaGRj6OvKsEk0SVQsuY0C9+EfM75XTkw==", + "dependencies": { + "@smithy/querystring-parser": "^2.0.8", + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + } + }, + "node_modules/@aws-sdk/client-sts/node_modules/@smithy/util-base64": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-2.0.0.tgz", + "integrity": "sha512-Zb1E4xx+m5Lud8bbeYi5FkcMJMnn+1WUnJF3qD7rAdXpaL7UjkFQLdmW5fHadoKbdHpwH9vSR8EyTJFHJs++tA==", + "dependencies": { + "@smithy/util-buffer-from": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sts/node_modules/@smithy/util-body-length-browser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-2.0.0.tgz", + "integrity": "sha512-JdDuS4ircJt+FDnaQj88TzZY3+njZ6O+D3uakS32f2VNnDo3vyEuNdBOh/oFd8Df1zSZOuH1HEChk2AOYDezZg==", + "dependencies": { + "tslib": "^2.5.0" + } + }, + "node_modules/@aws-sdk/client-sts/node_modules/@smithy/util-body-length-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-2.1.0.tgz", + "integrity": "sha512-/li0/kj/y3fQ3vyzn36NTLGmUwAICb7Jbe/CsWCktW363gh1MOcpEcSO3mJ344Gv2dqz8YJCLQpb6hju/0qOWw==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sts/node_modules/@smithy/util-buffer-from": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.0.0.tgz", + "integrity": "sha512-/YNnLoHsR+4W4Vf2wL5lGv0ksg8Bmk3GEGxn2vEQt52AQaPSCuaO5PM5VM7lP1K9qHRKHwrPGktqVoAHKWHxzw==", + "dependencies": { + "@smithy/is-array-buffer": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sts/node_modules/@smithy/util-config-provider": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-2.0.0.tgz", + "integrity": "sha512-xCQ6UapcIWKxXHEU4Mcs2s7LcFQRiU3XEluM2WcCjjBtQkUN71Tb+ydGmJFPxMUrW/GWMgQEEGipLym4XG0jZg==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sts/node_modules/@smithy/util-defaults-mode-browser": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.0.9.tgz", + "integrity": "sha512-JONLJVQWT8165XoSV36ERn3SVlZLJJ4D6IeGsCSePv65Uxa93pzSLE0UMSR9Jwm4zix7rst9AS8W5QIypZWP8Q==", + "dependencies": { + "@smithy/property-provider": "^2.0.9", + "@smithy/smithy-client": "^2.1.5", + "@smithy/types": "^2.3.2", + "bowser": "^2.11.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/client-sts/node_modules/@smithy/util-defaults-mode-node": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.0.11.tgz", + "integrity": "sha512-tmqjNsfj+bgZN6jXBe6efZnukzILA7BUytHkzqikuRLNtR+0VVchQHvawD0w6vManh76rO81ydhioe7i4oBzuA==", + "dependencies": { + "@smithy/config-resolver": "^2.0.9", + "@smithy/credential-provider-imds": "^2.0.11", + "@smithy/node-config-provider": "^2.0.11", + "@smithy/property-provider": "^2.0.9", + "@smithy/smithy-client": "^2.1.5", + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/client-sts/node_modules/@smithy/util-hex-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-2.0.0.tgz", + "integrity": "sha512-c5xY+NUnFqG6d7HFh1IFfrm3mGl29lC+vF+geHv4ToiuJCBmIfzx6IeHLg+OgRdPFKDXIw6pvi+p3CsscaMcMA==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sts/node_modules/@smithy/util-middleware": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-2.0.1.tgz", + "integrity": "sha512-LnsBMi0Mg3gfz/TpNGLv2Jjcz2ra1OX5HR/4IaCepIYmtPQzqMWDdhX/XTW1LS8OZ0xbQuyQPcHkQ+2XkhWOVQ==", + "dependencies": { + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sts/node_modules/@smithy/util-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-2.0.1.tgz", + "integrity": "sha512-naj4X0IafJ9yJnVJ58QgSMkCNLjyQOnyrnKh/T0f+0UOUxJiT8vuFn/hS7B/pNqbo2STY7PyJ4J4f+5YqxwNtA==", + "dependencies": { + "@smithy/service-error-classification": "^2.0.1", + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@aws-sdk/client-sts/node_modules/@smithy/util-stream": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-2.0.11.tgz", + "integrity": "sha512-2MeWfqSpZKdmEJ+tH8CJQSgzLWhH5cmdE24X7JB0hiamXrOmswWGGuPvyj/9sQCTclo57pNxLR2p7KrP8Ahiyg==", + "dependencies": { + "@smithy/fetch-http-handler": "^2.1.4", + "@smithy/node-http-handler": "^2.1.4", + "@smithy/types": "^2.3.2", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-buffer-from": "^2.0.0", + "@smithy/util-hex-encoding": "^2.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sts/node_modules/@smithy/util-uri-escape": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-2.0.0.tgz", + "integrity": "sha512-ebkxsqinSdEooQduuk9CbKcI+wheijxEb3utGXkCoYQkJnwTnLbH1JXGimJtUkQwNQbsbuYwG2+aFVyZf5TLaw==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sts/node_modules/@smithy/util-utf8": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.0.0.tgz", + "integrity": "sha512-rctU1VkziY84n5OXe3bPNpKR001ZCME2JCaBBFgtiM2hfKbHFudc/BkMuPab8hRbLd0j3vbnBTTZ1igBf0wgiQ==", + "dependencies": { + "@smithy/util-buffer-from": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sts/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==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity": { + "version": "3.414.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.414.0.tgz", + "integrity": "sha512-sAbp5HVy0YmvXUKkkTt8Tr5a5XNQMxshxI+pmXHLCHNpRATS9A6i7YHVNMGmERKGriFWZG0Q8qgKh1E+rvN7fQ==", + "dependencies": { + "@aws-sdk/client-cognito-identity": "3.414.0", + "@aws-sdk/types": "3.413.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/types": "^2.3.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@aws-sdk/types": { + "version": "3.413.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.413.0.tgz", + "integrity": "sha512-j1xib0f/TazIFc5ySIKOlT1ujntRbaoG4LJFeEezz4ji03/wSJMI8Vi4KjzpBp8J1tTu0oRDnsxRIGixsUBeYQ==", + "dependencies": { + "@smithy/types": "^2.3.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/property-provider": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.0.9.tgz", + "integrity": "sha512-25pPZ8f8DeRwYI5wbPRZaoMoR+3vrw8DwbA0TjP+GsdiB2KxScndr4HQehiJ5+WJ0giOTWhLz0bd+7Djv1qpUQ==", + "dependencies": { + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/types": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.3.2.tgz", + "integrity": "sha512-iH0cdKi7HQlzfAM3w2shFk/qZYKAqJWswtpmQpPtlruF+uFZeGEpMJjgDRyhWiddfVM4e2oP4nMaOBsMy6lXgg==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-env": { + "version": "3.413.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.413.0.tgz", + "integrity": "sha512-yeMOkfG20/RlzfPMtQuDB647AcPEvFEVYOWZzAWVJfldYQ5ybKr0d7sBkgG9sdAzGkK3Aw9dE4rigYI8EIqc1Q==", + "dependencies": { + "@aws-sdk/types": "3.413.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/types": "^2.3.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-env/node_modules/@aws-sdk/types": { + "version": "3.413.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.413.0.tgz", + "integrity": "sha512-j1xib0f/TazIFc5ySIKOlT1ujntRbaoG4LJFeEezz4ji03/wSJMI8Vi4KjzpBp8J1tTu0oRDnsxRIGixsUBeYQ==", + "dependencies": { + "@smithy/types": "^2.3.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-env/node_modules/@smithy/property-provider": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.0.9.tgz", + "integrity": "sha512-25pPZ8f8DeRwYI5wbPRZaoMoR+3vrw8DwbA0TjP+GsdiB2KxScndr4HQehiJ5+WJ0giOTWhLz0bd+7Djv1qpUQ==", + "dependencies": { + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-env/node_modules/@smithy/types": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.3.2.tgz", + "integrity": "sha512-iH0cdKi7HQlzfAM3w2shFk/qZYKAqJWswtpmQpPtlruF+uFZeGEpMJjgDRyhWiddfVM4e2oP4nMaOBsMy6lXgg==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.414.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.414.0.tgz", + "integrity": "sha512-rlpLLx70roJL/t40opWC96LbIASejdMbRlgSCRpK8b/hKngYDe5A7SRVacaw08vYrAywxRiybxpQOwOt9b++rA==", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.413.0", + "@aws-sdk/credential-provider-process": "3.413.0", + "@aws-sdk/credential-provider-sso": "3.414.0", + "@aws-sdk/credential-provider-web-identity": "3.413.0", + "@aws-sdk/types": "3.413.0", + "@smithy/credential-provider-imds": "^2.0.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/types": "^2.3.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/types": { + "version": "3.413.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.413.0.tgz", + "integrity": "sha512-j1xib0f/TazIFc5ySIKOlT1ujntRbaoG4LJFeEezz4ji03/wSJMI8Vi4KjzpBp8J1tTu0oRDnsxRIGixsUBeYQ==", + "dependencies": { + "@smithy/types": "^2.3.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/credential-provider-imds": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-2.0.11.tgz", + "integrity": "sha512-uJJs8dnM5iXkn8a2GaKvlKMhcOJ+oJPYqY9gY3CM/EieCVObIDjxUtR/g8lU/k/A+OauA78GzScAfulmFjPOYA==", + "dependencies": { + "@smithy/node-config-provider": "^2.0.11", + "@smithy/property-provider": "^2.0.9", + "@smithy/types": "^2.3.2", + "@smithy/url-parser": "^2.0.8", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/node-config-provider": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-2.0.11.tgz", + "integrity": "sha512-CaR1dciSSGKttjhcefpytYjsfI/Yd5mqL8am4wfmyFCDxSiPsvnEWHl8UjM/RbcAjX0klt+CeIKPSHEc0wGvJA==", + "dependencies": { + "@smithy/property-provider": "^2.0.9", + "@smithy/shared-ini-file-loader": "^2.0.10", + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/property-provider": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.0.9.tgz", + "integrity": "sha512-25pPZ8f8DeRwYI5wbPRZaoMoR+3vrw8DwbA0TjP+GsdiB2KxScndr4HQehiJ5+WJ0giOTWhLz0bd+7Djv1qpUQ==", + "dependencies": { + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/querystring-parser": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-2.0.8.tgz", + "integrity": "sha512-ArbanNuR7O/MmTd90ZqhDqGOPPDYmxx3huHxD+R3cuCnazcK/1tGQA+SnnR5307T7ZRb5WTpB6qBggERuibVSA==", + "dependencies": { + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/shared-ini-file-loader": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.0.10.tgz", + "integrity": "sha512-jWASteSezRKohJ7GdA7pHDvmr7Q7tw3b5mu3xLHIkZy/ICftJ+O7aqNaF8wklhI7UNFoQ7flFRM3Rd0KA+1BbQ==", + "dependencies": { + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/types": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.3.2.tgz", + "integrity": "sha512-iH0cdKi7HQlzfAM3w2shFk/qZYKAqJWswtpmQpPtlruF+uFZeGEpMJjgDRyhWiddfVM4e2oP4nMaOBsMy6lXgg==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/url-parser": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-2.0.8.tgz", + "integrity": "sha512-wQw7j004ScCrBRJ+oNPXlLE9mtofxyadSZ9D8ov/rHkyurS7z1HTNuyaGRj6OvKsEk0SVQsuY0C9+EfM75XTkw==", + "dependencies": { + "@smithy/querystring-parser": "^2.0.8", + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + } + }, + "node_modules/@aws-sdk/credential-provider-node": { + "version": "3.414.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.414.0.tgz", + "integrity": "sha512-xlkcOUKeGHInxWKKrZKIPSBCUL/ozyCldJBjmMKEj7ZmBAEiDcjpMe3pZ//LibMkCSy0b/7jtyQBE/eaIT2o0A==", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.413.0", + "@aws-sdk/credential-provider-ini": "3.414.0", + "@aws-sdk/credential-provider-process": "3.413.0", + "@aws-sdk/credential-provider-sso": "3.414.0", + "@aws-sdk/credential-provider-web-identity": "3.413.0", + "@aws-sdk/types": "3.413.0", + "@smithy/credential-provider-imds": "^2.0.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/types": "^2.3.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-node/node_modules/@aws-sdk/types": { + "version": "3.413.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.413.0.tgz", + "integrity": "sha512-j1xib0f/TazIFc5ySIKOlT1ujntRbaoG4LJFeEezz4ji03/wSJMI8Vi4KjzpBp8J1tTu0oRDnsxRIGixsUBeYQ==", + "dependencies": { + "@smithy/types": "^2.3.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-node/node_modules/@smithy/credential-provider-imds": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-2.0.11.tgz", + "integrity": "sha512-uJJs8dnM5iXkn8a2GaKvlKMhcOJ+oJPYqY9gY3CM/EieCVObIDjxUtR/g8lU/k/A+OauA78GzScAfulmFjPOYA==", + "dependencies": { + "@smithy/node-config-provider": "^2.0.11", + "@smithy/property-provider": "^2.0.9", + "@smithy/types": "^2.3.2", + "@smithy/url-parser": "^2.0.8", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-node/node_modules/@smithy/node-config-provider": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-2.0.11.tgz", + "integrity": "sha512-CaR1dciSSGKttjhcefpytYjsfI/Yd5mqL8am4wfmyFCDxSiPsvnEWHl8UjM/RbcAjX0klt+CeIKPSHEc0wGvJA==", + "dependencies": { + "@smithy/property-provider": "^2.0.9", + "@smithy/shared-ini-file-loader": "^2.0.10", + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-node/node_modules/@smithy/property-provider": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.0.9.tgz", + "integrity": "sha512-25pPZ8f8DeRwYI5wbPRZaoMoR+3vrw8DwbA0TjP+GsdiB2KxScndr4HQehiJ5+WJ0giOTWhLz0bd+7Djv1qpUQ==", + "dependencies": { + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-node/node_modules/@smithy/querystring-parser": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-2.0.8.tgz", + "integrity": "sha512-ArbanNuR7O/MmTd90ZqhDqGOPPDYmxx3huHxD+R3cuCnazcK/1tGQA+SnnR5307T7ZRb5WTpB6qBggERuibVSA==", + "dependencies": { + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-node/node_modules/@smithy/shared-ini-file-loader": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.0.10.tgz", + "integrity": "sha512-jWASteSezRKohJ7GdA7pHDvmr7Q7tw3b5mu3xLHIkZy/ICftJ+O7aqNaF8wklhI7UNFoQ7flFRM3Rd0KA+1BbQ==", + "dependencies": { + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-node/node_modules/@smithy/types": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.3.2.tgz", + "integrity": "sha512-iH0cdKi7HQlzfAM3w2shFk/qZYKAqJWswtpmQpPtlruF+uFZeGEpMJjgDRyhWiddfVM4e2oP4nMaOBsMy6lXgg==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-node/node_modules/@smithy/url-parser": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-2.0.8.tgz", + "integrity": "sha512-wQw7j004ScCrBRJ+oNPXlLE9mtofxyadSZ9D8ov/rHkyurS7z1HTNuyaGRj6OvKsEk0SVQsuY0C9+EfM75XTkw==", + "dependencies": { + "@smithy/querystring-parser": "^2.0.8", + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + } + }, + "node_modules/@aws-sdk/credential-provider-process": { + "version": "3.413.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.413.0.tgz", + "integrity": "sha512-GFJdgS14GzJ1wc2DEnS44Z/34iBZ05CAkvDsLN2CMwcDgH4eZuif9/x0lwzIJBK3xVFHzYUeVvEzsqRPbCHRsw==", + "dependencies": { + "@aws-sdk/types": "3.413.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/types": "^2.3.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-process/node_modules/@aws-sdk/types": { + "version": "3.413.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.413.0.tgz", + "integrity": "sha512-j1xib0f/TazIFc5ySIKOlT1ujntRbaoG4LJFeEezz4ji03/wSJMI8Vi4KjzpBp8J1tTu0oRDnsxRIGixsUBeYQ==", + "dependencies": { + "@smithy/types": "^2.3.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-process/node_modules/@smithy/property-provider": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.0.9.tgz", + "integrity": "sha512-25pPZ8f8DeRwYI5wbPRZaoMoR+3vrw8DwbA0TjP+GsdiB2KxScndr4HQehiJ5+WJ0giOTWhLz0bd+7Djv1qpUQ==", + "dependencies": { + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-process/node_modules/@smithy/shared-ini-file-loader": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.0.10.tgz", + "integrity": "sha512-jWASteSezRKohJ7GdA7pHDvmr7Q7tw3b5mu3xLHIkZy/ICftJ+O7aqNaF8wklhI7UNFoQ7flFRM3Rd0KA+1BbQ==", + "dependencies": { + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-process/node_modules/@smithy/types": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.3.2.tgz", + "integrity": "sha512-iH0cdKi7HQlzfAM3w2shFk/qZYKAqJWswtpmQpPtlruF+uFZeGEpMJjgDRyhWiddfVM4e2oP4nMaOBsMy6lXgg==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.414.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.414.0.tgz", + "integrity": "sha512-w9g2hlkZn7WekWICRqk+L33py7KrjYMFryVpkKXOx2pjDchCfZDr6pL1ml782GZ0L3qsob4SbNpbtp13JprnWQ==", + "dependencies": { + "@aws-sdk/client-sso": "3.414.0", + "@aws-sdk/token-providers": "3.413.0", + "@aws-sdk/types": "3.413.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/types": "^2.3.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-sso/node_modules/@aws-sdk/types": { + "version": "3.413.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.413.0.tgz", + "integrity": "sha512-j1xib0f/TazIFc5ySIKOlT1ujntRbaoG4LJFeEezz4ji03/wSJMI8Vi4KjzpBp8J1tTu0oRDnsxRIGixsUBeYQ==", + "dependencies": { + "@smithy/types": "^2.3.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-sso/node_modules/@smithy/property-provider": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.0.9.tgz", + "integrity": "sha512-25pPZ8f8DeRwYI5wbPRZaoMoR+3vrw8DwbA0TjP+GsdiB2KxScndr4HQehiJ5+WJ0giOTWhLz0bd+7Djv1qpUQ==", + "dependencies": { + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-sso/node_modules/@smithy/shared-ini-file-loader": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.0.10.tgz", + "integrity": "sha512-jWASteSezRKohJ7GdA7pHDvmr7Q7tw3b5mu3xLHIkZy/ICftJ+O7aqNaF8wklhI7UNFoQ7flFRM3Rd0KA+1BbQ==", + "dependencies": { + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-sso/node_modules/@smithy/types": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.3.2.tgz", + "integrity": "sha512-iH0cdKi7HQlzfAM3w2shFk/qZYKAqJWswtpmQpPtlruF+uFZeGEpMJjgDRyhWiddfVM4e2oP4nMaOBsMy6lXgg==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.413.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.413.0.tgz", + "integrity": "sha512-5cdA1Iq9JeEHtg59ERV9fdMQ7cS0JF6gH/BWA7HYEUGdSVPXCuwyEggPtG64QgpNU7SmxH+QdDG+Ldxz09ycIA==", + "dependencies": { + "@aws-sdk/types": "3.413.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/types": "^2.3.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/@aws-sdk/types": { + "version": "3.413.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.413.0.tgz", + "integrity": "sha512-j1xib0f/TazIFc5ySIKOlT1ujntRbaoG4LJFeEezz4ji03/wSJMI8Vi4KjzpBp8J1tTu0oRDnsxRIGixsUBeYQ==", + "dependencies": { + "@smithy/types": "^2.3.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/@smithy/property-provider": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.0.9.tgz", + "integrity": "sha512-25pPZ8f8DeRwYI5wbPRZaoMoR+3vrw8DwbA0TjP+GsdiB2KxScndr4HQehiJ5+WJ0giOTWhLz0bd+7Djv1qpUQ==", + "dependencies": { + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/@smithy/types": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.3.2.tgz", + "integrity": "sha512-iH0cdKi7HQlzfAM3w2shFk/qZYKAqJWswtpmQpPtlruF+uFZeGEpMJjgDRyhWiddfVM4e2oP4nMaOBsMy6lXgg==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers": { + "version": "3.414.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.414.0.tgz", + "integrity": "sha512-xv3cN/lu+HRroGWYWtqwBQ+guykyjSKHzYq6FlyfBZyjC6u8hoeNSNilFobIooJOXfrDM0LKr9L+uUlPE+0+lg==", + "dependencies": { + "@aws-sdk/client-cognito-identity": "3.414.0", + "@aws-sdk/client-sso": "3.414.0", + "@aws-sdk/client-sts": "3.414.0", + "@aws-sdk/credential-provider-cognito-identity": "3.414.0", + "@aws-sdk/credential-provider-env": "3.413.0", + "@aws-sdk/credential-provider-ini": "3.414.0", + "@aws-sdk/credential-provider-node": "3.414.0", + "@aws-sdk/credential-provider-process": "3.413.0", + "@aws-sdk/credential-provider-sso": "3.414.0", + "@aws-sdk/credential-provider-web-identity": "3.413.0", + "@aws-sdk/types": "3.413.0", + "@smithy/credential-provider-imds": "^2.0.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/types": "^2.3.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/types": { + "version": "3.413.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.413.0.tgz", + "integrity": "sha512-j1xib0f/TazIFc5ySIKOlT1ujntRbaoG4LJFeEezz4ji03/wSJMI8Vi4KjzpBp8J1tTu0oRDnsxRIGixsUBeYQ==", + "dependencies": { + "@smithy/types": "^2.3.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/credential-provider-imds": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-2.0.11.tgz", + "integrity": "sha512-uJJs8dnM5iXkn8a2GaKvlKMhcOJ+oJPYqY9gY3CM/EieCVObIDjxUtR/g8lU/k/A+OauA78GzScAfulmFjPOYA==", + "dependencies": { + "@smithy/node-config-provider": "^2.0.11", + "@smithy/property-provider": "^2.0.9", + "@smithy/types": "^2.3.2", + "@smithy/url-parser": "^2.0.8", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/node-config-provider": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-2.0.11.tgz", + "integrity": "sha512-CaR1dciSSGKttjhcefpytYjsfI/Yd5mqL8am4wfmyFCDxSiPsvnEWHl8UjM/RbcAjX0klt+CeIKPSHEc0wGvJA==", + "dependencies": { + "@smithy/property-provider": "^2.0.9", + "@smithy/shared-ini-file-loader": "^2.0.10", + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/property-provider": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.0.9.tgz", + "integrity": "sha512-25pPZ8f8DeRwYI5wbPRZaoMoR+3vrw8DwbA0TjP+GsdiB2KxScndr4HQehiJ5+WJ0giOTWhLz0bd+7Djv1qpUQ==", + "dependencies": { + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/querystring-parser": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-2.0.8.tgz", + "integrity": "sha512-ArbanNuR7O/MmTd90ZqhDqGOPPDYmxx3huHxD+R3cuCnazcK/1tGQA+SnnR5307T7ZRb5WTpB6qBggERuibVSA==", + "dependencies": { + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/shared-ini-file-loader": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.0.10.tgz", + "integrity": "sha512-jWASteSezRKohJ7GdA7pHDvmr7Q7tw3b5mu3xLHIkZy/ICftJ+O7aqNaF8wklhI7UNFoQ7flFRM3Rd0KA+1BbQ==", + "dependencies": { + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/types": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.3.2.tgz", + "integrity": "sha512-iH0cdKi7HQlzfAM3w2shFk/qZYKAqJWswtpmQpPtlruF+uFZeGEpMJjgDRyhWiddfVM4e2oP4nMaOBsMy6lXgg==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/url-parser": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-2.0.8.tgz", + "integrity": "sha512-wQw7j004ScCrBRJ+oNPXlLE9mtofxyadSZ9D8ov/rHkyurS7z1HTNuyaGRj6OvKsEk0SVQsuY0C9+EfM75XTkw==", + "dependencies": { + "@smithy/querystring-parser": "^2.0.8", + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + } + }, + "node_modules/@aws-sdk/hash-blob-browser": { + "version": "3.370.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/hash-blob-browser/-/hash-blob-browser-3.370.0.tgz", + "integrity": "sha512-DyStaznfloyF9jN3KvG6puOAjt25alXoBNeHBF2FyLlEEbrOqUmso39JB5LVAw2/KB4UmCNsbAXFb6WktX/yHQ==", + "dependencies": { + "@aws-sdk/chunked-blob-reader": "3.310.0", + "@aws-sdk/chunked-blob-reader-native": "3.310.0", + "@aws-sdk/types": "3.370.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@aws-sdk/hash-stream-node": { + "version": "3.370.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/hash-stream-node/-/hash-stream-node-3.370.0.tgz", + "integrity": "sha512-ExsbBiIMiL9AN1VpWlD8+xaO5s0cXUZJC2UONiQbgMb1jz7Wq9fa1GmKUDyaGXOuQTT7DDhAmalb9fIpauZKuA==", + "dependencies": { + "@aws-sdk/types": "3.370.0", + "@aws-sdk/util-utf8": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/is-array-buffer": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/is-array-buffer/-/is-array-buffer-3.310.0.tgz", + "integrity": "sha512-urnbcCR+h9NWUnmOtet/s4ghvzsidFmspfhYaHAmSRdy9yDjdjBJMFjjsn85A1ODUktztm+cVncXjQ38WCMjMQ==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/lib-storage": { + "version": "3.414.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/lib-storage/-/lib-storage-3.414.0.tgz", + "integrity": "sha512-R2ZdLVWa+EhMYrta61c0fNgnRpsIWr4zj1rCnC0ZlTwP5J3jiAaRHPMVgd9Jgo1u91y8nHVYaLdIJ6EQDN0scg==", + "dependencies": { + "@smithy/abort-controller": "^2.0.1", + "@smithy/middleware-endpoint": "^2.0.7", + "@smithy/smithy-client": "^2.1.4", + "buffer": "5.6.0", + "events": "3.3.0", + "stream-browserify": "3.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-s3": "^3.0.0" + } + }, + "node_modules/@aws-sdk/lib-storage/node_modules/@smithy/abort-controller": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-2.0.8.tgz", + "integrity": "sha512-2SOdVj5y0zE37Y9scSXoizoxgi6mgnDabi7a/SOfhl0p+50I0rIkuJTfyAuTPDtQ7e5dD6tSZPCLB3c/YM6Zig==", + "dependencies": { + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/lib-storage/node_modules/@smithy/fetch-http-handler": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-2.1.4.tgz", + "integrity": "sha512-SL24M9W5ERByoXaVicRx+bj9GJVujDnPn+QO7GY7adhY0mPGa6DSF58pVKsgIh4r5Tx/k3SWCPlH4BxxSxA/fQ==", + "dependencies": { + "@smithy/protocol-http": "^3.0.4", + "@smithy/querystring-builder": "^2.0.8", + "@smithy/types": "^2.3.2", + "@smithy/util-base64": "^2.0.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@aws-sdk/lib-storage/node_modules/@smithy/is-array-buffer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.0.0.tgz", + "integrity": "sha512-z3PjFjMyZNI98JFRJi/U0nGoLWMSJlDjAW4QUX2WNZLas5C0CmVV6LJ01JI0k90l7FvpmixjWxPFmENSClQ7ug==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/lib-storage/node_modules/@smithy/middleware-endpoint": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-2.0.8.tgz", + "integrity": "sha512-yOpogfG2d2V0cbJdAJ6GLAWkNOc9pVsL5hZUfXcxJu408N3CUCsXzIAFF6+70ZKSE+lCfG3GFErcSXv/UfUbjw==", + "dependencies": { + "@smithy/middleware-serde": "^2.0.8", + "@smithy/types": "^2.3.2", + "@smithy/url-parser": "^2.0.8", + "@smithy/util-middleware": "^2.0.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/lib-storage/node_modules/@smithy/middleware-serde": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-2.0.8.tgz", + "integrity": "sha512-Is0sm+LiNlgsc0QpstDzifugzL9ehno1wXp109GgBgpnKTK3j+KphiparBDI4hWTtH9/7OUsxuspNqai2yyhcg==", + "dependencies": { + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/lib-storage/node_modules/@smithy/middleware-stack": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-2.0.1.tgz", + "integrity": "sha512-UexsfY6/oQZRjTQL56s9AKtMcR60tBNibSgNYX1I2WXaUaXg97W9JCkFyth85TzBWKDBTyhLfenrukS/kyu54A==", + "dependencies": { + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/lib-storage/node_modules/@smithy/node-http-handler": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-2.1.4.tgz", + "integrity": "sha512-8Rw/AusvWDyC6SK8esAcVBeTlQHf94NMFv805suFUJCQ2gwlh0oLDNh+6s2MDOrxcjvLxjjzv1mytM0Mt+0cPQ==", + "dependencies": { + "@smithy/abort-controller": "^2.0.8", + "@smithy/protocol-http": "^3.0.4", + "@smithy/querystring-builder": "^2.0.8", + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/lib-storage/node_modules/@smithy/protocol-http": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.0.4.tgz", + "integrity": "sha512-CGfSWk6TRlbwa8YgrSXdn80Yu7pov3EV/h7TSfiCHhq6/LO3WymmqnzgH1f0qV2bdTDipIkTNp5dGCGN3Af/5g==", + "dependencies": { + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/lib-storage/node_modules/@smithy/querystring-builder": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-2.0.8.tgz", + "integrity": "sha512-+vzIMwjC8Saz97/ptPn+IJRCRRZ+pP95ZIWDRqEqZV/a6hiKbaFoMSa2iCKsnKzR696U2JZXrDqMu3e/FD1+2g==", + "dependencies": { + "@smithy/types": "^2.3.2", + "@smithy/util-uri-escape": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/lib-storage/node_modules/@smithy/querystring-parser": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-2.0.8.tgz", + "integrity": "sha512-ArbanNuR7O/MmTd90ZqhDqGOPPDYmxx3huHxD+R3cuCnazcK/1tGQA+SnnR5307T7ZRb5WTpB6qBggERuibVSA==", + "dependencies": { + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/lib-storage/node_modules/@smithy/smithy-client": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-2.1.5.tgz", + "integrity": "sha512-7S865uKzsxApM8W8Q6zkij7tcUFgaG8PuADMFdMt1yL/ku3d0+s6Zwrg3N7iXCPM08Gu/mf0BIfTXIu/9i450Q==", + "dependencies": { + "@smithy/middleware-stack": "^2.0.1", + "@smithy/types": "^2.3.2", + "@smithy/util-stream": "^2.0.11", "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/types": { - "version": "3.357.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.357.0.tgz", - "integrity": "sha512-/riCRaXg3p71BeWnShrai0y0QTdXcouPSM0Cn1olZbzTf7s71aLEewrc96qFrL70XhY4XvnxMpqQh+r43XIL3g==", + "node_modules/@aws-sdk/lib-storage/node_modules/@smithy/types": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.3.2.tgz", + "integrity": "sha512-iH0cdKi7HQlzfAM3w2shFk/qZYKAqJWswtpmQpPtlruF+uFZeGEpMJjgDRyhWiddfVM4e2oP4nMaOBsMy6lXgg==", "dependencies": { "tslib": "^2.5.0" }, @@ -405,206 +4336,155 @@ "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/client-personalize": { - "version": "3.363.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-personalize/-/client-personalize-3.363.0.tgz", - "integrity": "sha512-SZ9QO3LLuIiAvT28F2Qo7ImbmAvedticrDMoFpvVQB2TJ/NR0wzu33udMqN4ZCy8bUY9eG1mhdo35YAhzVgjBQ==", + "node_modules/@aws-sdk/lib-storage/node_modules/@smithy/url-parser": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-2.0.8.tgz", + "integrity": "sha512-wQw7j004ScCrBRJ+oNPXlLE9mtofxyadSZ9D8ov/rHkyurS7z1HTNuyaGRj6OvKsEk0SVQsuY0C9+EfM75XTkw==", "dependencies": { - "@aws-crypto/sha256-browser": "3.0.0", - "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sts": "3.363.0", - "@aws-sdk/credential-provider-node": "3.363.0", - "@aws-sdk/middleware-host-header": "3.363.0", - "@aws-sdk/middleware-logger": "3.363.0", - "@aws-sdk/middleware-recursion-detection": "3.363.0", - "@aws-sdk/middleware-signing": "3.363.0", - "@aws-sdk/middleware-user-agent": "3.363.0", - "@aws-sdk/types": "3.357.0", - "@aws-sdk/util-endpoints": "3.357.0", - "@aws-sdk/util-user-agent-browser": "3.363.0", - "@aws-sdk/util-user-agent-node": "3.363.0", - "@smithy/config-resolver": "^1.0.1", - "@smithy/fetch-http-handler": "^1.0.1", - "@smithy/hash-node": "^1.0.1", - "@smithy/invalid-dependency": "^1.0.1", - "@smithy/middleware-content-length": "^1.0.1", - "@smithy/middleware-endpoint": "^1.0.1", - "@smithy/middleware-retry": "^1.0.2", - "@smithy/middleware-serde": "^1.0.1", - "@smithy/middleware-stack": "^1.0.1", - "@smithy/node-config-provider": "^1.0.1", - "@smithy/node-http-handler": "^1.0.2", - "@smithy/protocol-http": "^1.0.1", - "@smithy/smithy-client": "^1.0.3", - "@smithy/types": "^1.0.0", - "@smithy/url-parser": "^1.0.1", - "@smithy/util-base64": "^1.0.1", - "@smithy/util-body-length-browser": "^1.0.1", - "@smithy/util-body-length-node": "^1.0.1", - "@smithy/util-defaults-mode-browser": "^1.0.1", - "@smithy/util-defaults-mode-node": "^1.0.1", - "@smithy/util-retry": "^1.0.2", - "@smithy/util-utf8": "^1.0.1", + "@smithy/querystring-parser": "^2.0.8", + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + } + }, + "node_modules/@aws-sdk/lib-storage/node_modules/@smithy/util-base64": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-2.0.0.tgz", + "integrity": "sha512-Zb1E4xx+m5Lud8bbeYi5FkcMJMnn+1WUnJF3qD7rAdXpaL7UjkFQLdmW5fHadoKbdHpwH9vSR8EyTJFHJs++tA==", + "dependencies": { + "@smithy/util-buffer-from": "^2.0.0", "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/client-personalize/node_modules/@aws-sdk/types": { - "version": "3.357.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.357.0.tgz", - "integrity": "sha512-/riCRaXg3p71BeWnShrai0y0QTdXcouPSM0Cn1olZbzTf7s71aLEewrc96qFrL70XhY4XvnxMpqQh+r43XIL3g==", + "node_modules/@aws-sdk/lib-storage/node_modules/@smithy/util-buffer-from": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.0.0.tgz", + "integrity": "sha512-/YNnLoHsR+4W4Vf2wL5lGv0ksg8Bmk3GEGxn2vEQt52AQaPSCuaO5PM5VM7lP1K9qHRKHwrPGktqVoAHKWHxzw==", "dependencies": { + "@smithy/is-array-buffer": "^2.0.0", "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/client-s3": { + "node_modules/@aws-sdk/lib-storage/node_modules/@smithy/util-hex-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-2.0.0.tgz", + "integrity": "sha512-c5xY+NUnFqG6d7HFh1IFfrm3mGl29lC+vF+geHv4ToiuJCBmIfzx6IeHLg+OgRdPFKDXIw6pvi+p3CsscaMcMA==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/lib-storage/node_modules/@smithy/util-middleware": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-2.0.1.tgz", + "integrity": "sha512-LnsBMi0Mg3gfz/TpNGLv2Jjcz2ra1OX5HR/4IaCepIYmtPQzqMWDdhX/XTW1LS8OZ0xbQuyQPcHkQ+2XkhWOVQ==", + "dependencies": { + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/lib-storage/node_modules/@smithy/util-stream": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-2.0.11.tgz", + "integrity": "sha512-2MeWfqSpZKdmEJ+tH8CJQSgzLWhH5cmdE24X7JB0hiamXrOmswWGGuPvyj/9sQCTclo57pNxLR2p7KrP8Ahiyg==", + "dependencies": { + "@smithy/fetch-http-handler": "^2.1.4", + "@smithy/node-http-handler": "^2.1.4", + "@smithy/types": "^2.3.2", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-buffer-from": "^2.0.0", + "@smithy/util-hex-encoding": "^2.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/lib-storage/node_modules/@smithy/util-uri-escape": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-2.0.0.tgz", + "integrity": "sha512-ebkxsqinSdEooQduuk9CbKcI+wheijxEb3utGXkCoYQkJnwTnLbH1JXGimJtUkQwNQbsbuYwG2+aFVyZf5TLaw==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/lib-storage/node_modules/@smithy/util-utf8": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.0.0.tgz", + "integrity": "sha512-rctU1VkziY84n5OXe3bPNpKR001ZCME2JCaBBFgtiM2hfKbHFudc/BkMuPab8hRbLd0j3vbnBTTZ1igBf0wgiQ==", + "dependencies": { + "@smithy/util-buffer-from": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/md5-js": { "version": "3.370.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.370.0.tgz", - "integrity": "sha512-+b53hI+C+tIiE6OhIvaUXD5qC0zFrCWIu6EKT597W+4XzfFIZE0BGgolP8pC1lLDghPjCFSmAm9Efcb2a1sPvw==", + "resolved": "https://registry.npmjs.org/@aws-sdk/md5-js/-/md5-js-3.370.0.tgz", + "integrity": "sha512-wch3+hiRdFGsu5E+w3WU9qmumQErKshtgetd6wMgFYm2MPSksFU58rM/aiwiWRA6knpcaShKaPKMmGnuX3HwhQ==", "dependencies": { - "@aws-crypto/sha1-browser": "3.0.0", - "@aws-crypto/sha256-browser": "3.0.0", - "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sts": "3.370.0", - "@aws-sdk/credential-provider-node": "3.370.0", - "@aws-sdk/hash-blob-browser": "3.370.0", - "@aws-sdk/hash-stream-node": "3.370.0", - "@aws-sdk/md5-js": "3.370.0", - "@aws-sdk/middleware-bucket-endpoint": "3.370.0", - "@aws-sdk/middleware-expect-continue": "3.370.0", - "@aws-sdk/middleware-flexible-checksums": "3.370.0", - "@aws-sdk/middleware-host-header": "3.370.0", - "@aws-sdk/middleware-location-constraint": "3.370.0", - "@aws-sdk/middleware-logger": "3.370.0", - "@aws-sdk/middleware-recursion-detection": "3.370.0", - "@aws-sdk/middleware-sdk-s3": "3.370.0", - "@aws-sdk/middleware-signing": "3.370.0", - "@aws-sdk/middleware-ssec": "3.370.0", - "@aws-sdk/middleware-user-agent": "3.370.0", - "@aws-sdk/signature-v4-multi-region": "3.370.0", "@aws-sdk/types": "3.370.0", - "@aws-sdk/util-endpoints": "3.370.0", - "@aws-sdk/util-user-agent-browser": "3.370.0", - "@aws-sdk/util-user-agent-node": "3.370.0", - "@aws-sdk/xml-builder": "3.310.0", - "@smithy/config-resolver": "^1.0.1", - "@smithy/eventstream-serde-browser": "^1.0.1", - "@smithy/eventstream-serde-config-resolver": "^1.0.1", - "@smithy/eventstream-serde-node": "^1.0.1", - "@smithy/fetch-http-handler": "^1.0.1", - "@smithy/hash-node": "^1.0.1", - "@smithy/invalid-dependency": "^1.0.1", - "@smithy/middleware-content-length": "^1.0.1", - "@smithy/middleware-endpoint": "^1.0.2", - "@smithy/middleware-retry": "^1.0.3", - "@smithy/middleware-serde": "^1.0.1", - "@smithy/middleware-stack": "^1.0.1", - "@smithy/node-config-provider": "^1.0.1", - "@smithy/node-http-handler": "^1.0.2", + "@aws-sdk/util-utf8": "3.310.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@aws-sdk/middleware-bucket-endpoint": { + "version": "3.370.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.370.0.tgz", + "integrity": "sha512-B36+fOeJVO0D9cjR92Ob6Ki2FTzyTQ/uKk8w+xtur6W6zYVOPU4IQNpNZvN3Ykt4jitR2uUnVSlBb3sXHHhdFA==", + "dependencies": { + "@aws-sdk/types": "3.370.0", + "@aws-sdk/util-arn-parser": "3.310.0", "@smithy/protocol-http": "^1.1.0", - "@smithy/smithy-client": "^1.0.3", "@smithy/types": "^1.1.0", - "@smithy/url-parser": "^1.0.1", - "@smithy/util-base64": "^1.0.1", - "@smithy/util-body-length-browser": "^1.0.1", - "@smithy/util-body-length-node": "^1.0.1", - "@smithy/util-defaults-mode-browser": "^1.0.1", - "@smithy/util-defaults-mode-node": "^1.0.1", - "@smithy/util-retry": "^1.0.3", - "@smithy/util-stream": "^1.0.1", - "@smithy/util-utf8": "^1.0.1", - "@smithy/util-waiter": "^1.0.1", - "fast-xml-parser": "4.2.5", + "@smithy/util-config-provider": "^1.0.1", "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/client-sso": { + "node_modules/@aws-sdk/middleware-expect-continue": { "version": "3.370.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.370.0.tgz", - "integrity": "sha512-0Ty1iHuzNxMQtN7nahgkZr4Wcu1XvqGfrQniiGdKKif9jG/4elxsQPiydRuQpFqN6b+bg7wPP7crFP1uTxx2KQ==", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.370.0.tgz", + "integrity": "sha512-OlFIpXa53obLryHyrqedE2Cp8lp2k+1Vjd++hlZFDFJncRlWZMxoXSyl6shQPqhIiGnNW4vt7tG5xE4jg4NAvw==", "dependencies": { - "@aws-crypto/sha256-browser": "3.0.0", - "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/middleware-host-header": "3.370.0", - "@aws-sdk/middleware-logger": "3.370.0", - "@aws-sdk/middleware-recursion-detection": "3.370.0", - "@aws-sdk/middleware-user-agent": "3.370.0", "@aws-sdk/types": "3.370.0", - "@aws-sdk/util-endpoints": "3.370.0", - "@aws-sdk/util-user-agent-browser": "3.370.0", - "@aws-sdk/util-user-agent-node": "3.370.0", - "@smithy/config-resolver": "^1.0.1", - "@smithy/fetch-http-handler": "^1.0.1", - "@smithy/hash-node": "^1.0.1", - "@smithy/invalid-dependency": "^1.0.1", - "@smithy/middleware-content-length": "^1.0.1", - "@smithy/middleware-endpoint": "^1.0.2", - "@smithy/middleware-retry": "^1.0.3", - "@smithy/middleware-serde": "^1.0.1", - "@smithy/middleware-stack": "^1.0.1", - "@smithy/node-config-provider": "^1.0.1", - "@smithy/node-http-handler": "^1.0.2", "@smithy/protocol-http": "^1.1.0", - "@smithy/smithy-client": "^1.0.3", "@smithy/types": "^1.1.0", - "@smithy/url-parser": "^1.0.1", - "@smithy/util-base64": "^1.0.1", - "@smithy/util-body-length-browser": "^1.0.1", - "@smithy/util-body-length-node": "^1.0.1", - "@smithy/util-defaults-mode-browser": "^1.0.1", - "@smithy/util-defaults-mode-node": "^1.0.1", - "@smithy/util-retry": "^1.0.3", - "@smithy/util-utf8": "^1.0.1", "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/client-sso-oidc": { + "node_modules/@aws-sdk/middleware-flexible-checksums": { "version": "3.370.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.370.0.tgz", - "integrity": "sha512-jAYOO74lmVXylQylqkPrjLzxvUnMKw476JCUTvCO6Q8nv3LzCWd76Ihgv/m9Q4M2Tbqi1iP2roVK5bstsXzEjA==", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.370.0.tgz", + "integrity": "sha512-62fyW4hZxppvkQKSXdkzjHQ95dXyVCuL18Sfnlciy9pr9f/t5w6LhZIxsNIW+Ge9mbgc661SVRKTwxlZj6FuLQ==", "dependencies": { - "@aws-crypto/sha256-browser": "3.0.0", - "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/middleware-host-header": "3.370.0", - "@aws-sdk/middleware-logger": "3.370.0", - "@aws-sdk/middleware-recursion-detection": "3.370.0", - "@aws-sdk/middleware-user-agent": "3.370.0", + "@aws-crypto/crc32": "3.0.0", + "@aws-crypto/crc32c": "3.0.0", "@aws-sdk/types": "3.370.0", - "@aws-sdk/util-endpoints": "3.370.0", - "@aws-sdk/util-user-agent-browser": "3.370.0", - "@aws-sdk/util-user-agent-node": "3.370.0", - "@smithy/config-resolver": "^1.0.1", - "@smithy/fetch-http-handler": "^1.0.1", - "@smithy/hash-node": "^1.0.1", - "@smithy/invalid-dependency": "^1.0.1", - "@smithy/middleware-content-length": "^1.0.1", - "@smithy/middleware-endpoint": "^1.0.2", - "@smithy/middleware-retry": "^1.0.3", - "@smithy/middleware-serde": "^1.0.1", - "@smithy/middleware-stack": "^1.0.1", - "@smithy/node-config-provider": "^1.0.1", - "@smithy/node-http-handler": "^1.0.2", + "@smithy/is-array-buffer": "^1.0.1", "@smithy/protocol-http": "^1.1.0", - "@smithy/smithy-client": "^1.0.3", "@smithy/types": "^1.1.0", - "@smithy/url-parser": "^1.0.1", - "@smithy/util-base64": "^1.0.1", - "@smithy/util-body-length-browser": "^1.0.1", - "@smithy/util-body-length-node": "^1.0.1", - "@smithy/util-defaults-mode-browser": "^1.0.1", - "@smithy/util-defaults-mode-node": "^1.0.1", - "@smithy/util-retry": "^1.0.3", "@smithy/util-utf8": "^1.0.1", "tslib": "^2.5.0" }, @@ -612,160 +4492,160 @@ "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/client-sts": { - "version": "3.370.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.370.0.tgz", - "integrity": "sha512-utFxOPWIzbN+3kc415Je2o4J72hOLNhgR2Gt5EnRSggC3yOnkC4GzauxG8n7n5gZGBX45eyubHyPOXLOIyoqQA==", + "node_modules/@aws-sdk/middleware-host-header": { + "version": "3.413.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.413.0.tgz", + "integrity": "sha512-r9PQx468EzPHo9wRzZLfgROpKtVdbkteMrdhsuM12bifVHjU1OHr7yfhc1OdWv39X8Xiv6F8n5r+RBQEM0S6+g==", + "dependencies": { + "@aws-sdk/types": "3.413.0", + "@smithy/protocol-http": "^3.0.3", + "@smithy/types": "^2.3.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-host-header/node_modules/@aws-sdk/types": { + "version": "3.413.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.413.0.tgz", + "integrity": "sha512-j1xib0f/TazIFc5ySIKOlT1ujntRbaoG4LJFeEezz4ji03/wSJMI8Vi4KjzpBp8J1tTu0oRDnsxRIGixsUBeYQ==", + "dependencies": { + "@smithy/types": "^2.3.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-host-header/node_modules/@smithy/protocol-http": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.0.4.tgz", + "integrity": "sha512-CGfSWk6TRlbwa8YgrSXdn80Yu7pov3EV/h7TSfiCHhq6/LO3WymmqnzgH1f0qV2bdTDipIkTNp5dGCGN3Af/5g==", + "dependencies": { + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-host-header/node_modules/@smithy/types": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.3.2.tgz", + "integrity": "sha512-iH0cdKi7HQlzfAM3w2shFk/qZYKAqJWswtpmQpPtlruF+uFZeGEpMJjgDRyhWiddfVM4e2oP4nMaOBsMy6lXgg==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-location-constraint": { + "version": "3.370.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.370.0.tgz", + "integrity": "sha512-NlDZEbBOF1IN7svUTcjbLodkUctt9zsfDI8+DqNlklRs5lsPb91WYvahOfjFO/EvACixa+a5d3cCumMCaIq4Cw==", + "dependencies": { + "@aws-sdk/types": "3.370.0", + "@smithy/types": "^1.1.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-logger": { + "version": "3.413.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.413.0.tgz", + "integrity": "sha512-jqcXDubcKvoqBy+kkEa0WoNjG6SveDeyNy+gdGnTV+DEtYjkcHrHJei4q0W5zFl0mzc+dP+z8tJF44rv95ZY3Q==", "dependencies": { - "@aws-crypto/sha256-browser": "3.0.0", - "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/credential-provider-node": "3.370.0", - "@aws-sdk/middleware-host-header": "3.370.0", - "@aws-sdk/middleware-logger": "3.370.0", - "@aws-sdk/middleware-recursion-detection": "3.370.0", - "@aws-sdk/middleware-sdk-sts": "3.370.0", - "@aws-sdk/middleware-signing": "3.370.0", - "@aws-sdk/middleware-user-agent": "3.370.0", - "@aws-sdk/types": "3.370.0", - "@aws-sdk/util-endpoints": "3.370.0", - "@aws-sdk/util-user-agent-browser": "3.370.0", - "@aws-sdk/util-user-agent-node": "3.370.0", - "@smithy/config-resolver": "^1.0.1", - "@smithy/fetch-http-handler": "^1.0.1", - "@smithy/hash-node": "^1.0.1", - "@smithy/invalid-dependency": "^1.0.1", - "@smithy/middleware-content-length": "^1.0.1", - "@smithy/middleware-endpoint": "^1.0.2", - "@smithy/middleware-retry": "^1.0.3", - "@smithy/middleware-serde": "^1.0.1", - "@smithy/middleware-stack": "^1.0.1", - "@smithy/node-config-provider": "^1.0.1", - "@smithy/node-http-handler": "^1.0.2", - "@smithy/protocol-http": "^1.1.0", - "@smithy/smithy-client": "^1.0.3", - "@smithy/types": "^1.1.0", - "@smithy/url-parser": "^1.0.1", - "@smithy/util-base64": "^1.0.1", - "@smithy/util-body-length-browser": "^1.0.1", - "@smithy/util-body-length-node": "^1.0.1", - "@smithy/util-defaults-mode-browser": "^1.0.1", - "@smithy/util-defaults-mode-node": "^1.0.1", - "@smithy/util-retry": "^1.0.3", - "@smithy/util-utf8": "^1.0.1", - "fast-xml-parser": "4.2.5", + "@aws-sdk/types": "3.413.0", + "@smithy/types": "^2.3.1", "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/credential-provider-env": { - "version": "3.370.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.370.0.tgz", - "integrity": "sha512-raR3yP/4GGbKFRPP5hUBNkEmTnzxI9mEc2vJAJrcv4G4J4i/UP6ELiLInQ5eO2/VcV/CeKGZA3t7d1tsJ+jhCg==", + "node_modules/@aws-sdk/middleware-logger/node_modules/@aws-sdk/types": { + "version": "3.413.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.413.0.tgz", + "integrity": "sha512-j1xib0f/TazIFc5ySIKOlT1ujntRbaoG4LJFeEezz4ji03/wSJMI8Vi4KjzpBp8J1tTu0oRDnsxRIGixsUBeYQ==", "dependencies": { - "@aws-sdk/types": "3.370.0", - "@smithy/property-provider": "^1.0.1", - "@smithy/types": "^1.1.0", + "@smithy/types": "^2.3.1", "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.370.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.370.0.tgz", - "integrity": "sha512-eJyapFKa4NrC9RfTgxlXnXfS9InG/QMEUPPVL+VhG7YS6nKqetC1digOYgivnEeu+XSKE0DJ7uZuXujN2Y7VAQ==", + "node_modules/@aws-sdk/middleware-logger/node_modules/@smithy/types": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.3.2.tgz", + "integrity": "sha512-iH0cdKi7HQlzfAM3w2shFk/qZYKAqJWswtpmQpPtlruF+uFZeGEpMJjgDRyhWiddfVM4e2oP4nMaOBsMy6lXgg==", "dependencies": { - "@aws-sdk/credential-provider-env": "3.370.0", - "@aws-sdk/credential-provider-process": "3.370.0", - "@aws-sdk/credential-provider-sso": "3.370.0", - "@aws-sdk/credential-provider-web-identity": "3.370.0", - "@aws-sdk/types": "3.370.0", - "@smithy/credential-provider-imds": "^1.0.1", - "@smithy/property-provider": "^1.0.1", - "@smithy/shared-ini-file-loader": "^1.0.1", - "@smithy/types": "^1.1.0", "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/credential-provider-node": { - "version": "3.370.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.370.0.tgz", - "integrity": "sha512-gkFiotBFKE4Fcn8CzQnMeab9TAR06FEAD02T4ZRYW1xGrBJOowmje9dKqdwQFHSPgnWAP+8HoTA8iwbhTLvjNA==", + "node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.413.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.413.0.tgz", + "integrity": "sha512-C6k0IKJk/A4/VBGwUjxEPG+WOjjnmWAZVRBUzaeM7PqRh+g5rLcuIV356ntV3pREVxyiSTePTYVYIHU9YXkLKQ==", "dependencies": { - "@aws-sdk/credential-provider-env": "3.370.0", - "@aws-sdk/credential-provider-ini": "3.370.0", - "@aws-sdk/credential-provider-process": "3.370.0", - "@aws-sdk/credential-provider-sso": "3.370.0", - "@aws-sdk/credential-provider-web-identity": "3.370.0", - "@aws-sdk/types": "3.370.0", - "@smithy/credential-provider-imds": "^1.0.1", - "@smithy/property-provider": "^1.0.1", - "@smithy/shared-ini-file-loader": "^1.0.1", - "@smithy/types": "^1.1.0", + "@aws-sdk/types": "3.413.0", + "@smithy/protocol-http": "^3.0.3", + "@smithy/types": "^2.3.1", "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/credential-provider-process": { - "version": "3.370.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.370.0.tgz", - "integrity": "sha512-0BKFFZmUO779Xdw3u7wWnoWhYA4zygxJbgGVSyjkOGBvdkbPSTTcdwT1KFkaQy2kOXYeZPl+usVVRXs+ph4ejg==", + "node_modules/@aws-sdk/middleware-recursion-detection/node_modules/@aws-sdk/types": { + "version": "3.413.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.413.0.tgz", + "integrity": "sha512-j1xib0f/TazIFc5ySIKOlT1ujntRbaoG4LJFeEezz4ji03/wSJMI8Vi4KjzpBp8J1tTu0oRDnsxRIGixsUBeYQ==", "dependencies": { - "@aws-sdk/types": "3.370.0", - "@smithy/property-provider": "^1.0.1", - "@smithy/shared-ini-file-loader": "^1.0.1", - "@smithy/types": "^1.1.0", + "@smithy/types": "^2.3.1", "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.370.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.370.0.tgz", - "integrity": "sha512-PFroYm5hcPSfC/jkZnCI34QFL3I7WVKveVk6/F3fud/cnP8hp6YjA9NiTNbqdFSzsyoiN/+e5fZgNKih8vVPTA==", + "node_modules/@aws-sdk/middleware-recursion-detection/node_modules/@smithy/protocol-http": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.0.4.tgz", + "integrity": "sha512-CGfSWk6TRlbwa8YgrSXdn80Yu7pov3EV/h7TSfiCHhq6/LO3WymmqnzgH1f0qV2bdTDipIkTNp5dGCGN3Af/5g==", "dependencies": { - "@aws-sdk/client-sso": "3.370.0", - "@aws-sdk/token-providers": "3.370.0", - "@aws-sdk/types": "3.370.0", - "@smithy/property-provider": "^1.0.1", - "@smithy/shared-ini-file-loader": "^1.0.1", - "@smithy/types": "^1.1.0", + "@smithy/types": "^2.3.2", "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.370.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.370.0.tgz", - "integrity": "sha512-CFaBMLRudwhjv1sDzybNV93IaT85IwS+L8Wq6VRMa0mro1q9rrWsIZO811eF+k0NEPfgU1dLH+8Vc2qhw4SARQ==", + "node_modules/@aws-sdk/middleware-recursion-detection/node_modules/@smithy/types": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.3.2.tgz", + "integrity": "sha512-iH0cdKi7HQlzfAM3w2shFk/qZYKAqJWswtpmQpPtlruF+uFZeGEpMJjgDRyhWiddfVM4e2oP4nMaOBsMy6lXgg==", "dependencies": { - "@aws-sdk/types": "3.370.0", - "@smithy/property-provider": "^1.0.1", - "@smithy/types": "^1.1.0", "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/middleware-host-header": { + "node_modules/@aws-sdk/middleware-sdk-s3": { "version": "3.370.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.370.0.tgz", - "integrity": "sha512-CPXOm/TnOFC7KyXcJglICC7OiA7Kj6mT3ChvEijr56TFOueNHvJdV4aNIFEQy0vGHOWtY12qOWLNto/wYR1BAQ==", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.370.0.tgz", + "integrity": "sha512-DPYXtveWBDS5MzSHWTThg2KkLaOzZkCgPejjEuw3yl4ljsHawDs/ZIVCtmWXlBIS2lLCaBMpCV+t9psuJ/6/zQ==", "dependencies": { "@aws-sdk/types": "3.370.0", + "@aws-sdk/util-arn-parser": "3.310.0", "@smithy/protocol-http": "^1.1.0", "@smithy/types": "^1.1.0", "tslib": "^2.5.0" @@ -774,381 +4654,325 @@ "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/middleware-logger": { - "version": "3.370.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.370.0.tgz", - "integrity": "sha512-cQMq9SaZ/ORmTJPCT6VzMML7OxFdQzNkhMAgKpTDl+tdPWynlHF29E5xGoSzROnThHlQPCjogU0NZ8AxI0SWPA==", + "node_modules/@aws-sdk/middleware-sdk-sts": { + "version": "3.413.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.413.0.tgz", + "integrity": "sha512-t0u//JUyaEZRVnH5q+Ur3tWnuyIsTdwA0XOdDCZXcSlLYzGp2MI/tScLjn9IydRrceIFpFfmbjk4Nf/Q6TeBTQ==", "dependencies": { - "@aws-sdk/types": "3.370.0", - "@smithy/types": "^1.1.0", + "@aws-sdk/middleware-signing": "3.413.0", + "@aws-sdk/types": "3.413.0", + "@smithy/types": "^2.3.1", "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.370.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.370.0.tgz", - "integrity": "sha512-L7ZF/w0lAAY/GK1khT8VdoU0XB7nWHk51rl/ecAg64J70dHnMOAg8n+5FZ9fBu/xH1FwUlHOkwlodJOgzLJjtg==", + "node_modules/@aws-sdk/middleware-sdk-sts/node_modules/@aws-sdk/types": { + "version": "3.413.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.413.0.tgz", + "integrity": "sha512-j1xib0f/TazIFc5ySIKOlT1ujntRbaoG4LJFeEezz4ji03/wSJMI8Vi4KjzpBp8J1tTu0oRDnsxRIGixsUBeYQ==", "dependencies": { - "@aws-sdk/types": "3.370.0", - "@smithy/protocol-http": "^1.1.0", - "@smithy/types": "^1.1.0", + "@smithy/types": "^2.3.1", "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/middleware-sdk-sts": { - "version": "3.370.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.370.0.tgz", - "integrity": "sha512-ykbsoVy0AJtVbuhAlTAMcaz/tCE3pT8nAp0L7CQQxSoanRCvOux7au0KwMIQVhxgnYid4dWVF6d00SkqU5MXRA==", + "node_modules/@aws-sdk/middleware-sdk-sts/node_modules/@smithy/types": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.3.2.tgz", + "integrity": "sha512-iH0cdKi7HQlzfAM3w2shFk/qZYKAqJWswtpmQpPtlruF+uFZeGEpMJjgDRyhWiddfVM4e2oP4nMaOBsMy6lXgg==", "dependencies": { - "@aws-sdk/middleware-signing": "3.370.0", - "@aws-sdk/types": "3.370.0", - "@smithy/types": "^1.1.0", "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/middleware-signing": { - "version": "3.370.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.370.0.tgz", - "integrity": "sha512-Dwr/RTCWOXdm394wCwICGT2VNOTMRe4IGPsBRJAsM24pm+EEqQzSS3Xu/U/zF4exuxqpMta4wec4QpSarPNTxA==", - "dependencies": { - "@aws-sdk/types": "3.370.0", - "@smithy/property-provider": "^1.0.1", - "@smithy/protocol-http": "^1.1.0", - "@smithy/signature-v4": "^1.0.1", - "@smithy/types": "^1.1.0", - "@smithy/util-middleware": "^1.0.1", + "node_modules/@aws-sdk/middleware-signing": { + "version": "3.413.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.413.0.tgz", + "integrity": "sha512-QFEnVvIKYPCermM+ESxEztgUgXzGSKpnPnohMYNvSZySqmOLu/4VvxiZbRO/BX9J3ZHcUgaw4vKm5VBZRrycxw==", + "dependencies": { + "@aws-sdk/types": "3.413.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/protocol-http": "^3.0.3", + "@smithy/signature-v4": "^2.0.0", + "@smithy/types": "^2.3.1", + "@smithy/util-middleware": "^2.0.0", "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.370.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.370.0.tgz", - "integrity": "sha512-2+3SB6MtMAq1+gVXhw0Y3ONXuljorh6ijnxgTpv+uQnBW5jHCUiAS8WDYiDEm7i9euJPbvJfM8WUrSMDMU6Cog==", + "node_modules/@aws-sdk/middleware-signing/node_modules/@aws-sdk/types": { + "version": "3.413.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.413.0.tgz", + "integrity": "sha512-j1xib0f/TazIFc5ySIKOlT1ujntRbaoG4LJFeEezz4ji03/wSJMI8Vi4KjzpBp8J1tTu0oRDnsxRIGixsUBeYQ==", "dependencies": { - "@aws-sdk/types": "3.370.0", - "@aws-sdk/util-endpoints": "3.370.0", - "@smithy/protocol-http": "^1.1.0", - "@smithy/types": "^1.1.0", + "@smithy/types": "^2.3.1", "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/token-providers": { - "version": "3.370.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.370.0.tgz", - "integrity": "sha512-EyR2ZYr+lJeRiZU2/eLR+mlYU9RXLQvNyGFSAekJKgN13Rpq/h0syzXVFLP/RSod/oZenh/fhVZ2HwlZxuGBtQ==", + "node_modules/@aws-sdk/middleware-signing/node_modules/@smithy/eventstream-codec": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-2.0.8.tgz", + "integrity": "sha512-onO4to8ujCKn4m5XagReT9Nc6FlNG5vveuvjp1H7AtaG7njdet1LOl6/jmUOkskF2C/w+9jNw3r9Ak+ghOvN0A==", + "dependencies": { + "@aws-crypto/crc32": "3.0.0", + "@smithy/types": "^2.3.2", + "@smithy/util-hex-encoding": "^2.0.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@aws-sdk/middleware-signing/node_modules/@smithy/is-array-buffer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.0.0.tgz", + "integrity": "sha512-z3PjFjMyZNI98JFRJi/U0nGoLWMSJlDjAW4QUX2WNZLas5C0CmVV6LJ01JI0k90l7FvpmixjWxPFmENSClQ7ug==", "dependencies": { - "@aws-sdk/client-sso-oidc": "3.370.0", - "@aws-sdk/types": "3.370.0", - "@smithy/property-provider": "^1.0.1", - "@smithy/shared-ini-file-loader": "^1.0.1", - "@smithy/types": "^1.1.0", "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/util-endpoints": { - "version": "3.370.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.370.0.tgz", - "integrity": "sha512-5ltVAnM79nRlywwzZN5i8Jp4tk245OCGkKwwXbnDU+gq7zT3CIOsct1wNZvmpfZEPGt/bv7/NyRcjP+7XNsX/g==", + "node_modules/@aws-sdk/middleware-signing/node_modules/@smithy/property-provider": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.0.9.tgz", + "integrity": "sha512-25pPZ8f8DeRwYI5wbPRZaoMoR+3vrw8DwbA0TjP+GsdiB2KxScndr4HQehiJ5+WJ0giOTWhLz0bd+7Djv1qpUQ==", "dependencies": { - "@aws-sdk/types": "3.370.0", + "@smithy/types": "^2.3.2", "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.370.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.370.0.tgz", - "integrity": "sha512-028LxYZMQ0DANKhW+AKFQslkScZUeYlPmSphrCIXgdIItRZh6ZJHGzE7J/jDsEntZOrZJsjI4z0zZ5W2idj04w==", + "node_modules/@aws-sdk/middleware-signing/node_modules/@smithy/protocol-http": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.0.4.tgz", + "integrity": "sha512-CGfSWk6TRlbwa8YgrSXdn80Yu7pov3EV/h7TSfiCHhq6/LO3WymmqnzgH1f0qV2bdTDipIkTNp5dGCGN3Af/5g==", "dependencies": { - "@aws-sdk/types": "3.370.0", - "@smithy/types": "^1.1.0", - "bowser": "^2.11.0", + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-signing/node_modules/@smithy/signature-v4": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-2.0.8.tgz", + "integrity": "sha512-qrtiYMzaLlQ5HSJOaFwnyTQ3JLjmPY+3+pr9IBDpCVM6YtVj22cBLVB9bPOiZMIpkdI7ZRdxLBFlIjh5CO1Bhw==", + "dependencies": { + "@smithy/eventstream-codec": "^2.0.8", + "@smithy/is-array-buffer": "^2.0.0", + "@smithy/types": "^2.3.2", + "@smithy/util-hex-encoding": "^2.0.0", + "@smithy/util-middleware": "^2.0.1", + "@smithy/util-uri-escape": "^2.0.0", + "@smithy/util-utf8": "^2.0.0", "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.370.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.370.0.tgz", - "integrity": "sha512-33vxZUp8vxTT/DGYIR3PivQm07sSRGWI+4fCv63Rt7Q++fO24E0kQtmVAlikRY810I10poD6rwILVtITtFSzkg==", + "node_modules/@aws-sdk/middleware-signing/node_modules/@smithy/types": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.3.2.tgz", + "integrity": "sha512-iH0cdKi7HQlzfAM3w2shFk/qZYKAqJWswtpmQpPtlruF+uFZeGEpMJjgDRyhWiddfVM4e2oP4nMaOBsMy6lXgg==", "dependencies": { - "@aws-sdk/types": "3.370.0", - "@smithy/node-config-provider": "^1.0.1", - "@smithy/types": "^1.1.0", "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-signing/node_modules/@smithy/util-buffer-from": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.0.0.tgz", + "integrity": "sha512-/YNnLoHsR+4W4Vf2wL5lGv0ksg8Bmk3GEGxn2vEQt52AQaPSCuaO5PM5VM7lP1K9qHRKHwrPGktqVoAHKWHxzw==", + "dependencies": { + "@smithy/is-array-buffer": "^2.0.0", + "tslib": "^2.5.0" }, - "peerDependencies": { - "aws-crt": ">=1.0.0" + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-signing/node_modules/@smithy/util-hex-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-2.0.0.tgz", + "integrity": "sha512-c5xY+NUnFqG6d7HFh1IFfrm3mGl29lC+vF+geHv4ToiuJCBmIfzx6IeHLg+OgRdPFKDXIw6pvi+p3CsscaMcMA==", + "dependencies": { + "tslib": "^2.5.0" }, - "peerDependenciesMeta": { - "aws-crt": { - "optional": true - } + "engines": { + "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/client-sso": { - "version": "3.363.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.363.0.tgz", - "integrity": "sha512-PZ+HfKSgS4hlMnJzG+Ev8/mgHd/b/ETlJWPSWjC/f2NwVoBQkBnqHjdyEx7QjF6nksJozcVh5Q+kkYLKc/QwBQ==", + "node_modules/@aws-sdk/middleware-signing/node_modules/@smithy/util-middleware": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-2.0.1.tgz", + "integrity": "sha512-LnsBMi0Mg3gfz/TpNGLv2Jjcz2ra1OX5HR/4IaCepIYmtPQzqMWDdhX/XTW1LS8OZ0xbQuyQPcHkQ+2XkhWOVQ==", + "dependencies": { + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-signing/node_modules/@smithy/util-uri-escape": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-2.0.0.tgz", + "integrity": "sha512-ebkxsqinSdEooQduuk9CbKcI+wheijxEb3utGXkCoYQkJnwTnLbH1JXGimJtUkQwNQbsbuYwG2+aFVyZf5TLaw==", "dependencies": { - "@aws-crypto/sha256-browser": "3.0.0", - "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/middleware-host-header": "3.363.0", - "@aws-sdk/middleware-logger": "3.363.0", - "@aws-sdk/middleware-recursion-detection": "3.363.0", - "@aws-sdk/middleware-user-agent": "3.363.0", - "@aws-sdk/types": "3.357.0", - "@aws-sdk/util-endpoints": "3.357.0", - "@aws-sdk/util-user-agent-browser": "3.363.0", - "@aws-sdk/util-user-agent-node": "3.363.0", - "@smithy/config-resolver": "^1.0.1", - "@smithy/fetch-http-handler": "^1.0.1", - "@smithy/hash-node": "^1.0.1", - "@smithy/invalid-dependency": "^1.0.1", - "@smithy/middleware-content-length": "^1.0.1", - "@smithy/middleware-endpoint": "^1.0.1", - "@smithy/middleware-retry": "^1.0.2", - "@smithy/middleware-serde": "^1.0.1", - "@smithy/middleware-stack": "^1.0.1", - "@smithy/node-config-provider": "^1.0.1", - "@smithy/node-http-handler": "^1.0.2", - "@smithy/protocol-http": "^1.0.1", - "@smithy/smithy-client": "^1.0.3", - "@smithy/types": "^1.0.0", - "@smithy/url-parser": "^1.0.1", - "@smithy/util-base64": "^1.0.1", - "@smithy/util-body-length-browser": "^1.0.1", - "@smithy/util-body-length-node": "^1.0.1", - "@smithy/util-defaults-mode-browser": "^1.0.1", - "@smithy/util-defaults-mode-node": "^1.0.1", - "@smithy/util-retry": "^1.0.2", - "@smithy/util-utf8": "^1.0.1", "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/client-sso-oidc": { - "version": "3.363.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.363.0.tgz", - "integrity": "sha512-V3Ebiq/zNtDS/O92HUWGBa7MY59RYSsqWd+E0XrXv6VYTA00RlMTbNcseivNgp2UghOgB9a20Nkz6EqAeIN+RQ==", + "node_modules/@aws-sdk/middleware-signing/node_modules/@smithy/util-utf8": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.0.0.tgz", + "integrity": "sha512-rctU1VkziY84n5OXe3bPNpKR001ZCME2JCaBBFgtiM2hfKbHFudc/BkMuPab8hRbLd0j3vbnBTTZ1igBf0wgiQ==", "dependencies": { - "@aws-crypto/sha256-browser": "3.0.0", - "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/middleware-host-header": "3.363.0", - "@aws-sdk/middleware-logger": "3.363.0", - "@aws-sdk/middleware-recursion-detection": "3.363.0", - "@aws-sdk/middleware-user-agent": "3.363.0", - "@aws-sdk/types": "3.357.0", - "@aws-sdk/util-endpoints": "3.357.0", - "@aws-sdk/util-user-agent-browser": "3.363.0", - "@aws-sdk/util-user-agent-node": "3.363.0", - "@smithy/config-resolver": "^1.0.1", - "@smithy/fetch-http-handler": "^1.0.1", - "@smithy/hash-node": "^1.0.1", - "@smithy/invalid-dependency": "^1.0.1", - "@smithy/middleware-content-length": "^1.0.1", - "@smithy/middleware-endpoint": "^1.0.1", - "@smithy/middleware-retry": "^1.0.2", - "@smithy/middleware-serde": "^1.0.1", - "@smithy/middleware-stack": "^1.0.1", - "@smithy/node-config-provider": "^1.0.1", - "@smithy/node-http-handler": "^1.0.2", - "@smithy/protocol-http": "^1.0.1", - "@smithy/smithy-client": "^1.0.3", - "@smithy/types": "^1.0.0", - "@smithy/url-parser": "^1.0.1", - "@smithy/util-base64": "^1.0.1", - "@smithy/util-body-length-browser": "^1.0.1", - "@smithy/util-body-length-node": "^1.0.1", - "@smithy/util-defaults-mode-browser": "^1.0.1", - "@smithy/util-defaults-mode-node": "^1.0.1", - "@smithy/util-retry": "^1.0.2", - "@smithy/util-utf8": "^1.0.1", + "@smithy/util-buffer-from": "^2.0.0", "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/types": { - "version": "3.357.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.357.0.tgz", - "integrity": "sha512-/riCRaXg3p71BeWnShrai0y0QTdXcouPSM0Cn1olZbzTf7s71aLEewrc96qFrL70XhY4XvnxMpqQh+r43XIL3g==", + "node_modules/@aws-sdk/middleware-ssec": { + "version": "3.370.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.370.0.tgz", + "integrity": "sha512-NIosfLS7mxCNdGYnuy76W9qP3f3YWVTusUA+uv+s6rnwG+Z2UheXCf1wpnJKzxORA8pioSP7ylZ8w2A0reCgYQ==", "dependencies": { + "@aws-sdk/types": "3.370.0", + "@smithy/types": "^1.1.0", "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/client-sso/node_modules/@aws-sdk/types": { - "version": "3.357.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.357.0.tgz", - "integrity": "sha512-/riCRaXg3p71BeWnShrai0y0QTdXcouPSM0Cn1olZbzTf7s71aLEewrc96qFrL70XhY4XvnxMpqQh+r43XIL3g==", - "dependencies": { + "node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.413.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.413.0.tgz", + "integrity": "sha512-eVMJyeWxNBqerhfD+sE9sTjDtwQiECrfU6wpUQP5fGPhJD2cVVZPxuTuJGDZCu/4k/V61dF85IYlsPUNLdVQ6w==", + "dependencies": { + "@aws-sdk/types": "3.413.0", + "@aws-sdk/util-endpoints": "3.413.0", + "@smithy/protocol-http": "^3.0.3", + "@smithy/types": "^2.3.1", "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/client-sts": { - "version": "3.363.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.363.0.tgz", - "integrity": "sha512-0jj14WvBPJQ8xr72cL0mhlmQ90tF0O0wqXwSbtog6PsC8+KDE6Yf+WsxsumyI8E5O8u3eYijBL+KdqG07F/y/w==", + "node_modules/@aws-sdk/middleware-user-agent/node_modules/@aws-sdk/types": { + "version": "3.413.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.413.0.tgz", + "integrity": "sha512-j1xib0f/TazIFc5ySIKOlT1ujntRbaoG4LJFeEezz4ji03/wSJMI8Vi4KjzpBp8J1tTu0oRDnsxRIGixsUBeYQ==", "dependencies": { - "@aws-crypto/sha256-browser": "3.0.0", - "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/credential-provider-node": "3.363.0", - "@aws-sdk/middleware-host-header": "3.363.0", - "@aws-sdk/middleware-logger": "3.363.0", - "@aws-sdk/middleware-recursion-detection": "3.363.0", - "@aws-sdk/middleware-sdk-sts": "3.363.0", - "@aws-sdk/middleware-signing": "3.363.0", - "@aws-sdk/middleware-user-agent": "3.363.0", - "@aws-sdk/types": "3.357.0", - "@aws-sdk/util-endpoints": "3.357.0", - "@aws-sdk/util-user-agent-browser": "3.363.0", - "@aws-sdk/util-user-agent-node": "3.363.0", - "@smithy/config-resolver": "^1.0.1", - "@smithy/fetch-http-handler": "^1.0.1", - "@smithy/hash-node": "^1.0.1", - "@smithy/invalid-dependency": "^1.0.1", - "@smithy/middleware-content-length": "^1.0.1", - "@smithy/middleware-endpoint": "^1.0.1", - "@smithy/middleware-retry": "^1.0.1", - "@smithy/middleware-serde": "^1.0.1", - "@smithy/middleware-stack": "^1.0.1", - "@smithy/node-config-provider": "^1.0.1", - "@smithy/node-http-handler": "^1.0.1", - "@smithy/protocol-http": "^1.1.0", - "@smithy/smithy-client": "^1.0.2", - "@smithy/types": "^1.1.0", - "@smithy/url-parser": "^1.0.1", - "@smithy/util-base64": "^1.0.1", - "@smithy/util-body-length-browser": "^1.0.1", - "@smithy/util-body-length-node": "^1.0.1", - "@smithy/util-defaults-mode-browser": "^1.0.1", - "@smithy/util-defaults-mode-node": "^1.0.1", - "@smithy/util-retry": "^1.0.1", - "@smithy/util-utf8": "^1.0.1", - "fast-xml-parser": "4.2.5", + "@smithy/types": "^2.3.1", "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/types": { - "version": "3.357.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.357.0.tgz", - "integrity": "sha512-/riCRaXg3p71BeWnShrai0y0QTdXcouPSM0Cn1olZbzTf7s71aLEewrc96qFrL70XhY4XvnxMpqQh+r43XIL3g==", + "node_modules/@aws-sdk/middleware-user-agent/node_modules/@smithy/protocol-http": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.0.4.tgz", + "integrity": "sha512-CGfSWk6TRlbwa8YgrSXdn80Yu7pov3EV/h7TSfiCHhq6/LO3WymmqnzgH1f0qV2bdTDipIkTNp5dGCGN3Af/5g==", "dependencies": { + "@smithy/types": "^2.3.2", "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/credential-provider-cognito-identity": { - "version": "3.363.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.363.0.tgz", - "integrity": "sha512-5x42JvqEsBUrm6/qdf0WWe4mlmJjPItxamQhRjuOzeQD/BxsA2W5VS/7n0Ws0e27DNhlnUErcIJd+bBy6j1fqA==", + "node_modules/@aws-sdk/middleware-user-agent/node_modules/@smithy/types": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.3.2.tgz", + "integrity": "sha512-iH0cdKi7HQlzfAM3w2shFk/qZYKAqJWswtpmQpPtlruF+uFZeGEpMJjgDRyhWiddfVM4e2oP4nMaOBsMy6lXgg==", "dependencies": { - "@aws-sdk/client-cognito-identity": "3.363.0", - "@aws-sdk/types": "3.357.0", - "@smithy/property-provider": "^1.0.1", - "@smithy/types": "^1.1.0", "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@aws-sdk/types": { - "version": "3.357.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.357.0.tgz", - "integrity": "sha512-/riCRaXg3p71BeWnShrai0y0QTdXcouPSM0Cn1olZbzTf7s71aLEewrc96qFrL70XhY4XvnxMpqQh+r43XIL3g==", + "node_modules/@aws-sdk/region-config-resolver": { + "version": "3.413.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.413.0.tgz", + "integrity": "sha512-h90e6yyOhvoc+1F5vFk3C5mxwB8RSDEMKTO/fxexyur94seczZ1yxyYkTMZv30oc9RUiToABlHNrh/wxL7TZPQ==", "dependencies": { + "@smithy/node-config-provider": "^2.0.10", + "@smithy/types": "^2.3.1", + "@smithy/util-config-provider": "^2.0.0", + "@smithy/util-middleware": "^2.0.0", "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.363.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.363.0.tgz", - "integrity": "sha512-VAQ3zITT2Q0acht0HezouYnMFKZ2vIOa20X4zQA3WI0HfaP4D6ga6KaenbDcb/4VFiqfqiRHfdyXHP0ThcDRMA==", + "node_modules/@aws-sdk/region-config-resolver/node_modules/@smithy/node-config-provider": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-2.0.11.tgz", + "integrity": "sha512-CaR1dciSSGKttjhcefpytYjsfI/Yd5mqL8am4wfmyFCDxSiPsvnEWHl8UjM/RbcAjX0klt+CeIKPSHEc0wGvJA==", "dependencies": { - "@aws-sdk/types": "3.357.0", - "@smithy/property-provider": "^1.0.1", - "@smithy/types": "^1.1.0", + "@smithy/property-provider": "^2.0.9", + "@smithy/shared-ini-file-loader": "^2.0.10", + "@smithy/types": "^2.3.2", "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/credential-provider-env/node_modules/@aws-sdk/types": { - "version": "3.357.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.357.0.tgz", - "integrity": "sha512-/riCRaXg3p71BeWnShrai0y0QTdXcouPSM0Cn1olZbzTf7s71aLEewrc96qFrL70XhY4XvnxMpqQh+r43XIL3g==", + "node_modules/@aws-sdk/region-config-resolver/node_modules/@smithy/property-provider": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.0.9.tgz", + "integrity": "sha512-25pPZ8f8DeRwYI5wbPRZaoMoR+3vrw8DwbA0TjP+GsdiB2KxScndr4HQehiJ5+WJ0giOTWhLz0bd+7Djv1qpUQ==", "dependencies": { + "@smithy/types": "^2.3.2", "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.363.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.363.0.tgz", - "integrity": "sha512-ZYN+INoqyX5FVC3rqUxB6O8nOWkr0gHRRBm1suoOlmuFJ/WSlW/uUGthRBY5x1AQQnBF8cpdlxZzGHd41lFVNw==", - "dependencies": { - "@aws-sdk/credential-provider-env": "3.363.0", - "@aws-sdk/credential-provider-process": "3.363.0", - "@aws-sdk/credential-provider-sso": "3.363.0", - "@aws-sdk/credential-provider-web-identity": "3.363.0", - "@aws-sdk/types": "3.357.0", - "@smithy/credential-provider-imds": "^1.0.1", - "@smithy/property-provider": "^1.0.1", - "@smithy/shared-ini-file-loader": "^1.0.1", - "@smithy/types": "^1.1.0", + "node_modules/@aws-sdk/region-config-resolver/node_modules/@smithy/shared-ini-file-loader": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.0.10.tgz", + "integrity": "sha512-jWASteSezRKohJ7GdA7pHDvmr7Q7tw3b5mu3xLHIkZy/ICftJ+O7aqNaF8wklhI7UNFoQ7flFRM3Rd0KA+1BbQ==", + "dependencies": { + "@smithy/types": "^2.3.2", "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/types": { - "version": "3.357.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.357.0.tgz", - "integrity": "sha512-/riCRaXg3p71BeWnShrai0y0QTdXcouPSM0Cn1olZbzTf7s71aLEewrc96qFrL70XhY4XvnxMpqQh+r43XIL3g==", + "node_modules/@aws-sdk/region-config-resolver/node_modules/@smithy/types": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.3.2.tgz", + "integrity": "sha512-iH0cdKi7HQlzfAM3w2shFk/qZYKAqJWswtpmQpPtlruF+uFZeGEpMJjgDRyhWiddfVM4e2oP4nMaOBsMy6lXgg==", "dependencies": { "tslib": "^2.5.0" }, @@ -1156,146 +4980,190 @@ "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.363.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.363.0.tgz", - "integrity": "sha512-C1qXFIN2yMxD6pGgug0vR1UhScOki6VqdzuBHzXZAGu7MOjvgHNdscEcb3CpWnITHaPL2ztkiw75T1sZ7oIgQg==", - "dependencies": { - "@aws-sdk/credential-provider-env": "3.363.0", - "@aws-sdk/credential-provider-ini": "3.363.0", - "@aws-sdk/credential-provider-process": "3.363.0", - "@aws-sdk/credential-provider-sso": "3.363.0", - "@aws-sdk/credential-provider-web-identity": "3.363.0", - "@aws-sdk/types": "3.357.0", - "@smithy/credential-provider-imds": "^1.0.1", - "@smithy/property-provider": "^1.0.1", - "@smithy/shared-ini-file-loader": "^1.0.1", - "@smithy/types": "^1.1.0", + "node_modules/@aws-sdk/region-config-resolver/node_modules/@smithy/util-config-provider": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-2.0.0.tgz", + "integrity": "sha512-xCQ6UapcIWKxXHEU4Mcs2s7LcFQRiU3XEluM2WcCjjBtQkUN71Tb+ydGmJFPxMUrW/GWMgQEEGipLym4XG0jZg==", + "dependencies": { "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/credential-provider-node/node_modules/@aws-sdk/types": { - "version": "3.357.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.357.0.tgz", - "integrity": "sha512-/riCRaXg3p71BeWnShrai0y0QTdXcouPSM0Cn1olZbzTf7s71aLEewrc96qFrL70XhY4XvnxMpqQh+r43XIL3g==", + "node_modules/@aws-sdk/region-config-resolver/node_modules/@smithy/util-middleware": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-2.0.1.tgz", + "integrity": "sha512-LnsBMi0Mg3gfz/TpNGLv2Jjcz2ra1OX5HR/4IaCepIYmtPQzqMWDdhX/XTW1LS8OZ0xbQuyQPcHkQ+2XkhWOVQ==", "dependencies": { + "@smithy/types": "^2.3.2", "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.363.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.363.0.tgz", - "integrity": "sha512-fOKAINU7Rtj2T8pP13GdCt+u0Ml3gYynp8ki+1jMZIQ+Ju/MdDOqZpKMFKicMn3Z1ttUOgqr+grUdus6z8ceBQ==", + "node_modules/@aws-sdk/signature-v4-multi-region": { + "version": "3.370.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.370.0.tgz", + "integrity": "sha512-Q3NQopPDnHbJXMhtYl0Mfy5U2o76K6tzhdnYRcrYImY0ze/zOkCQI7KPC4588PuyvAXCdQ02cmCPPjYD55UeNg==", "dependencies": { - "@aws-sdk/types": "3.357.0", - "@smithy/property-provider": "^1.0.1", - "@smithy/shared-ini-file-loader": "^1.0.1", + "@aws-sdk/types": "3.370.0", + "@smithy/protocol-http": "^1.1.0", + "@smithy/signature-v4": "^1.0.1", "@smithy/types": "^1.1.0", "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" + }, + "peerDependencies": { + "@aws-sdk/signature-v4-crt": "^3.118.0" + }, + "peerDependenciesMeta": { + "@aws-sdk/signature-v4-crt": { + "optional": true + } } }, - "node_modules/@aws-sdk/credential-provider-process/node_modules/@aws-sdk/types": { - "version": "3.357.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.357.0.tgz", - "integrity": "sha512-/riCRaXg3p71BeWnShrai0y0QTdXcouPSM0Cn1olZbzTf7s71aLEewrc96qFrL70XhY4XvnxMpqQh+r43XIL3g==", + "node_modules/@aws-sdk/token-providers": { + "version": "3.413.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.413.0.tgz", + "integrity": "sha512-NfP1Ib9LAWVLMTOa/1aJwt4TRrlRrNyukCpVZGfNaMnNNEoP5Rakdbcs8KFVHe/MJzU+GdKVzxQ4TgRkLOGTrA==", "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/middleware-host-header": "3.413.0", + "@aws-sdk/middleware-logger": "3.413.0", + "@aws-sdk/middleware-recursion-detection": "3.413.0", + "@aws-sdk/middleware-user-agent": "3.413.0", + "@aws-sdk/types": "3.413.0", + "@aws-sdk/util-endpoints": "3.413.0", + "@aws-sdk/util-user-agent-browser": "3.413.0", + "@aws-sdk/util-user-agent-node": "3.413.0", + "@smithy/config-resolver": "^2.0.8", + "@smithy/fetch-http-handler": "^2.1.3", + "@smithy/hash-node": "^2.0.7", + "@smithy/invalid-dependency": "^2.0.7", + "@smithy/middleware-content-length": "^2.0.9", + "@smithy/middleware-endpoint": "^2.0.7", + "@smithy/middleware-retry": "^2.0.10", + "@smithy/middleware-serde": "^2.0.7", + "@smithy/middleware-stack": "^2.0.0", + "@smithy/node-config-provider": "^2.0.10", + "@smithy/node-http-handler": "^2.1.3", + "@smithy/property-provider": "^2.0.0", + "@smithy/protocol-http": "^3.0.3", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/smithy-client": "^2.1.4", + "@smithy/types": "^2.3.1", + "@smithy/url-parser": "^2.0.7", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-body-length-browser": "^2.0.0", + "@smithy/util-body-length-node": "^2.1.0", + "@smithy/util-defaults-mode-browser": "^2.0.8", + "@smithy/util-defaults-mode-node": "^2.0.10", + "@smithy/util-retry": "^2.0.0", + "@smithy/util-utf8": "^2.0.0", "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.363.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.363.0.tgz", - "integrity": "sha512-5RUZ5oM0lwZSo3EehT0dXggOjgtxFogpT3cZvoLGtIwrPBvm8jOQPXQUlaqCj10ThF1sYltEyukz/ovtDwYGew==", + "node_modules/@aws-sdk/token-providers/node_modules/@aws-sdk/types": { + "version": "3.413.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.413.0.tgz", + "integrity": "sha512-j1xib0f/TazIFc5ySIKOlT1ujntRbaoG4LJFeEezz4ji03/wSJMI8Vi4KjzpBp8J1tTu0oRDnsxRIGixsUBeYQ==", "dependencies": { - "@aws-sdk/client-sso": "3.363.0", - "@aws-sdk/token-providers": "3.363.0", - "@aws-sdk/types": "3.357.0", - "@smithy/property-provider": "^1.0.1", - "@smithy/shared-ini-file-loader": "^1.0.1", - "@smithy/types": "^1.1.0", + "@smithy/types": "^2.3.1", "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/credential-provider-sso/node_modules/@aws-sdk/types": { - "version": "3.357.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.357.0.tgz", - "integrity": "sha512-/riCRaXg3p71BeWnShrai0y0QTdXcouPSM0Cn1olZbzTf7s71aLEewrc96qFrL70XhY4XvnxMpqQh+r43XIL3g==", + "node_modules/@aws-sdk/token-providers/node_modules/@smithy/abort-controller": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-2.0.8.tgz", + "integrity": "sha512-2SOdVj5y0zE37Y9scSXoizoxgi6mgnDabi7a/SOfhl0p+50I0rIkuJTfyAuTPDtQ7e5dD6tSZPCLB3c/YM6Zig==", "dependencies": { + "@smithy/types": "^2.3.2", "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.363.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.363.0.tgz", - "integrity": "sha512-Z6w7fjgy79pAax580wdixbStQw10xfyZ+hOYLcPudoYFKjoNx0NQBejg5SwBzCF/HQL23Ksm9kDfbXDX9fkPhA==", + "node_modules/@aws-sdk/token-providers/node_modules/@smithy/config-resolver": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-2.0.9.tgz", + "integrity": "sha512-QBkGPLUqyPmis9Erz8v4q5lo/ErnF7+GD5WZHa6JZiXopUPfaaM+B21n8gzS5xCkIXZmnwzNQhObP9xQPu8oqQ==", "dependencies": { - "@aws-sdk/types": "3.357.0", - "@smithy/property-provider": "^1.0.1", - "@smithy/types": "^1.1.0", + "@smithy/node-config-provider": "^2.0.11", + "@smithy/types": "^2.3.2", + "@smithy/util-config-provider": "^2.0.0", + "@smithy/util-middleware": "^2.0.1", "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/@aws-sdk/types": { - "version": "3.357.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.357.0.tgz", - "integrity": "sha512-/riCRaXg3p71BeWnShrai0y0QTdXcouPSM0Cn1olZbzTf7s71aLEewrc96qFrL70XhY4XvnxMpqQh+r43XIL3g==", + "node_modules/@aws-sdk/token-providers/node_modules/@smithy/credential-provider-imds": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-2.0.11.tgz", + "integrity": "sha512-uJJs8dnM5iXkn8a2GaKvlKMhcOJ+oJPYqY9gY3CM/EieCVObIDjxUtR/g8lU/k/A+OauA78GzScAfulmFjPOYA==", "dependencies": { + "@smithy/node-config-provider": "^2.0.11", + "@smithy/property-provider": "^2.0.9", + "@smithy/types": "^2.3.2", + "@smithy/url-parser": "^2.0.8", "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/credential-providers": { - "version": "3.363.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.363.0.tgz", - "integrity": "sha512-hVa1DdYasnLud2EKjDAlDHiV/+H/Zq52chHU00c/R8XwPu1s0kZX3NMmlt0D2HhYqC1mUwtdmE58Jra2POviQQ==", - "dependencies": { - "@aws-sdk/client-cognito-identity": "3.363.0", - "@aws-sdk/client-sso": "3.363.0", - "@aws-sdk/client-sts": "3.363.0", - "@aws-sdk/credential-provider-cognito-identity": "3.363.0", - "@aws-sdk/credential-provider-env": "3.363.0", - "@aws-sdk/credential-provider-ini": "3.363.0", - "@aws-sdk/credential-provider-node": "3.363.0", - "@aws-sdk/credential-provider-process": "3.363.0", - "@aws-sdk/credential-provider-sso": "3.363.0", - "@aws-sdk/credential-provider-web-identity": "3.363.0", - "@aws-sdk/types": "3.357.0", - "@smithy/credential-provider-imds": "^1.0.1", - "@smithy/property-provider": "^1.0.1", - "@smithy/types": "^1.1.0", + "node_modules/@aws-sdk/token-providers/node_modules/@smithy/fetch-http-handler": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-2.1.4.tgz", + "integrity": "sha512-SL24M9W5ERByoXaVicRx+bj9GJVujDnPn+QO7GY7adhY0mPGa6DSF58pVKsgIh4r5Tx/k3SWCPlH4BxxSxA/fQ==", + "dependencies": { + "@smithy/protocol-http": "^3.0.4", + "@smithy/querystring-builder": "^2.0.8", + "@smithy/types": "^2.3.2", + "@smithy/util-base64": "^2.0.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@aws-sdk/token-providers/node_modules/@smithy/hash-node": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-2.0.8.tgz", + "integrity": "sha512-yZL/nmxZzjZV5/QX5JWSgXlt0HxuMTwFO89CS++jOMMPiCMZngf6VYmtNdccs8IIIAMmfQeTzwu07XgUE/Zd3Q==", + "dependencies": { + "@smithy/types": "^2.3.2", + "@smithy/util-buffer-from": "^2.0.0", + "@smithy/util-utf8": "^2.0.0", "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/types": { - "version": "3.357.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.357.0.tgz", - "integrity": "sha512-/riCRaXg3p71BeWnShrai0y0QTdXcouPSM0Cn1olZbzTf7s71aLEewrc96qFrL70XhY4XvnxMpqQh+r43XIL3g==", + "node_modules/@aws-sdk/token-providers/node_modules/@smithy/invalid-dependency": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-2.0.8.tgz", + "integrity": "sha512-88VOS7W3KzUz/bNRc+Sl/F/CDIasFspEE4G39YZRHIh9YmsXF7GUyVaAKURfMNulTie62ayk6BHC9O0nOBAVgQ==", + "dependencies": { + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + } + }, + "node_modules/@aws-sdk/token-providers/node_modules/@smithy/is-array-buffer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.0.0.tgz", + "integrity": "sha512-z3PjFjMyZNI98JFRJi/U0nGoLWMSJlDjAW4QUX2WNZLas5C0CmVV6LJ01JI0k90l7FvpmixjWxPFmENSClQ7ug==", "dependencies": { "tslib": "^2.5.0" }, @@ -1303,239 +5171,259 @@ "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/hash-blob-browser": { - "version": "3.370.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/hash-blob-browser/-/hash-blob-browser-3.370.0.tgz", - "integrity": "sha512-DyStaznfloyF9jN3KvG6puOAjt25alXoBNeHBF2FyLlEEbrOqUmso39JB5LVAw2/KB4UmCNsbAXFb6WktX/yHQ==", + "node_modules/@aws-sdk/token-providers/node_modules/@smithy/middleware-content-length": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-2.0.10.tgz", + "integrity": "sha512-EGSbysyA4jH0p3xI6G0jdXoj9Iz9GUnAta6aEaHtXm3wVWtenRf80y2TeVvNkVSr5jwKOdSCjKIRI2l1A/oZLA==", "dependencies": { - "@aws-sdk/chunked-blob-reader": "3.310.0", - "@aws-sdk/chunked-blob-reader-native": "3.310.0", - "@aws-sdk/types": "3.370.0", + "@smithy/protocol-http": "^3.0.4", + "@smithy/types": "^2.3.2", "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/hash-stream-node": { - "version": "3.370.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/hash-stream-node/-/hash-stream-node-3.370.0.tgz", - "integrity": "sha512-ExsbBiIMiL9AN1VpWlD8+xaO5s0cXUZJC2UONiQbgMb1jz7Wq9fa1GmKUDyaGXOuQTT7DDhAmalb9fIpauZKuA==", + "node_modules/@aws-sdk/token-providers/node_modules/@smithy/middleware-endpoint": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-2.0.8.tgz", + "integrity": "sha512-yOpogfG2d2V0cbJdAJ6GLAWkNOc9pVsL5hZUfXcxJu408N3CUCsXzIAFF6+70ZKSE+lCfG3GFErcSXv/UfUbjw==", "dependencies": { - "@aws-sdk/types": "3.370.0", - "@aws-sdk/util-utf8": "3.310.0", + "@smithy/middleware-serde": "^2.0.8", + "@smithy/types": "^2.3.2", + "@smithy/url-parser": "^2.0.8", + "@smithy/util-middleware": "^2.0.1", "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/is-array-buffer": { - "version": "3.310.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/is-array-buffer/-/is-array-buffer-3.310.0.tgz", - "integrity": "sha512-urnbcCR+h9NWUnmOtet/s4ghvzsidFmspfhYaHAmSRdy9yDjdjBJMFjjsn85A1ODUktztm+cVncXjQ38WCMjMQ==", + "node_modules/@aws-sdk/token-providers/node_modules/@smithy/middleware-retry": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-2.0.11.tgz", + "integrity": "sha512-pknfokumZ+wvBERSuKAI2vVr+aK3ZgPiWRg6+0ZG4kKJogBRpPmDGWw+Jht0izS9ZaEbIobNzueIb4wD33JJVg==", + "dependencies": { + "@smithy/node-config-provider": "^2.0.11", + "@smithy/protocol-http": "^3.0.4", + "@smithy/service-error-classification": "^2.0.1", + "@smithy/types": "^2.3.2", + "@smithy/util-middleware": "^2.0.1", + "@smithy/util-retry": "^2.0.1", + "tslib": "^2.5.0", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/token-providers/node_modules/@smithy/middleware-serde": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-2.0.8.tgz", + "integrity": "sha512-Is0sm+LiNlgsc0QpstDzifugzL9ehno1wXp109GgBgpnKTK3j+KphiparBDI4hWTtH9/7OUsxuspNqai2yyhcg==", "dependencies": { + "@smithy/types": "^2.3.2", "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/lib-storage": { - "version": "3.370.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/lib-storage/-/lib-storage-3.370.0.tgz", - "integrity": "sha512-vUdvd8jvusl81A0OdCz3y2E7Nhqwa57cxJviK6P262zqL2Ge5WlfR9djjv78sqdclvm7iXTxj7o1djMu1aScNg==", + "node_modules/@aws-sdk/token-providers/node_modules/@smithy/middleware-stack": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-2.0.1.tgz", + "integrity": "sha512-UexsfY6/oQZRjTQL56s9AKtMcR60tBNibSgNYX1I2WXaUaXg97W9JCkFyth85TzBWKDBTyhLfenrukS/kyu54A==", "dependencies": { - "@smithy/abort-controller": "^1.0.1", - "@smithy/middleware-endpoint": "^1.0.2", - "@smithy/smithy-client": "^1.0.3", - "buffer": "5.6.0", - "events": "3.3.0", - "stream-browserify": "3.0.0", + "@smithy/types": "^2.3.2", "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-s3": "^3.0.0" } }, - "node_modules/@aws-sdk/md5-js": { - "version": "3.370.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/md5-js/-/md5-js-3.370.0.tgz", - "integrity": "sha512-wch3+hiRdFGsu5E+w3WU9qmumQErKshtgetd6wMgFYm2MPSksFU58rM/aiwiWRA6knpcaShKaPKMmGnuX3HwhQ==", + "node_modules/@aws-sdk/token-providers/node_modules/@smithy/node-config-provider": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-2.0.11.tgz", + "integrity": "sha512-CaR1dciSSGKttjhcefpytYjsfI/Yd5mqL8am4wfmyFCDxSiPsvnEWHl8UjM/RbcAjX0klt+CeIKPSHEc0wGvJA==", "dependencies": { - "@aws-sdk/types": "3.370.0", - "@aws-sdk/util-utf8": "3.310.0", + "@smithy/property-provider": "^2.0.9", + "@smithy/shared-ini-file-loader": "^2.0.10", + "@smithy/types": "^2.3.2", "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/middleware-bucket-endpoint": { - "version": "3.370.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.370.0.tgz", - "integrity": "sha512-B36+fOeJVO0D9cjR92Ob6Ki2FTzyTQ/uKk8w+xtur6W6zYVOPU4IQNpNZvN3Ykt4jitR2uUnVSlBb3sXHHhdFA==", + "node_modules/@aws-sdk/token-providers/node_modules/@smithy/node-http-handler": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-2.1.4.tgz", + "integrity": "sha512-8Rw/AusvWDyC6SK8esAcVBeTlQHf94NMFv805suFUJCQ2gwlh0oLDNh+6s2MDOrxcjvLxjjzv1mytM0Mt+0cPQ==", "dependencies": { - "@aws-sdk/types": "3.370.0", - "@aws-sdk/util-arn-parser": "3.310.0", - "@smithy/protocol-http": "^1.1.0", - "@smithy/types": "^1.1.0", - "@smithy/util-config-provider": "^1.0.1", + "@smithy/abort-controller": "^2.0.8", + "@smithy/protocol-http": "^3.0.4", + "@smithy/querystring-builder": "^2.0.8", + "@smithy/types": "^2.3.2", "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/middleware-expect-continue": { - "version": "3.370.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.370.0.tgz", - "integrity": "sha512-OlFIpXa53obLryHyrqedE2Cp8lp2k+1Vjd++hlZFDFJncRlWZMxoXSyl6shQPqhIiGnNW4vt7tG5xE4jg4NAvw==", + "node_modules/@aws-sdk/token-providers/node_modules/@smithy/property-provider": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.0.9.tgz", + "integrity": "sha512-25pPZ8f8DeRwYI5wbPRZaoMoR+3vrw8DwbA0TjP+GsdiB2KxScndr4HQehiJ5+WJ0giOTWhLz0bd+7Djv1qpUQ==", "dependencies": { - "@aws-sdk/types": "3.370.0", - "@smithy/protocol-http": "^1.1.0", - "@smithy/types": "^1.1.0", + "@smithy/types": "^2.3.2", "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/middleware-flexible-checksums": { - "version": "3.370.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.370.0.tgz", - "integrity": "sha512-62fyW4hZxppvkQKSXdkzjHQ95dXyVCuL18Sfnlciy9pr9f/t5w6LhZIxsNIW+Ge9mbgc661SVRKTwxlZj6FuLQ==", + "node_modules/@aws-sdk/token-providers/node_modules/@smithy/protocol-http": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.0.4.tgz", + "integrity": "sha512-CGfSWk6TRlbwa8YgrSXdn80Yu7pov3EV/h7TSfiCHhq6/LO3WymmqnzgH1f0qV2bdTDipIkTNp5dGCGN3Af/5g==", "dependencies": { - "@aws-crypto/crc32": "3.0.0", - "@aws-crypto/crc32c": "3.0.0", - "@aws-sdk/types": "3.370.0", - "@smithy/is-array-buffer": "^1.0.1", - "@smithy/protocol-http": "^1.1.0", - "@smithy/types": "^1.1.0", - "@smithy/util-utf8": "^1.0.1", + "@smithy/types": "^2.3.2", "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/middleware-host-header": { - "version": "3.363.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.363.0.tgz", - "integrity": "sha512-FobpclDCf5Y1ueyJDmb9MqguAdPssNMlnqWQpujhYVABq69KHu73fSCWSauFPUrw7YOpV8kG1uagDF0POSxHzA==", + "node_modules/@aws-sdk/token-providers/node_modules/@smithy/querystring-builder": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-2.0.8.tgz", + "integrity": "sha512-+vzIMwjC8Saz97/ptPn+IJRCRRZ+pP95ZIWDRqEqZV/a6hiKbaFoMSa2iCKsnKzR696U2JZXrDqMu3e/FD1+2g==", "dependencies": { - "@aws-sdk/types": "3.357.0", - "@smithy/protocol-http": "^1.1.0", - "@smithy/types": "^1.1.0", + "@smithy/types": "^2.3.2", + "@smithy/util-uri-escape": "^2.0.0", "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/middleware-host-header/node_modules/@aws-sdk/types": { - "version": "3.357.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.357.0.tgz", - "integrity": "sha512-/riCRaXg3p71BeWnShrai0y0QTdXcouPSM0Cn1olZbzTf7s71aLEewrc96qFrL70XhY4XvnxMpqQh+r43XIL3g==", + "node_modules/@aws-sdk/token-providers/node_modules/@smithy/querystring-parser": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-2.0.8.tgz", + "integrity": "sha512-ArbanNuR7O/MmTd90ZqhDqGOPPDYmxx3huHxD+R3cuCnazcK/1tGQA+SnnR5307T7ZRb5WTpB6qBggERuibVSA==", "dependencies": { + "@smithy/types": "^2.3.2", "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/middleware-location-constraint": { - "version": "3.370.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.370.0.tgz", - "integrity": "sha512-NlDZEbBOF1IN7svUTcjbLodkUctt9zsfDI8+DqNlklRs5lsPb91WYvahOfjFO/EvACixa+a5d3cCumMCaIq4Cw==", + "node_modules/@aws-sdk/token-providers/node_modules/@smithy/service-error-classification": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-2.0.1.tgz", + "integrity": "sha512-QHa9+t+v4s0cMuDCcbjIJN67mNZ42/+fc3jKe8P6ZMPXZl5ksKk6a8vhZ/m494GZng5eFTc3OePv+NF9cG83yg==", "dependencies": { - "@aws-sdk/types": "3.370.0", - "@smithy/types": "^1.1.0", - "tslib": "^2.5.0" + "@smithy/types": "^2.3.2" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/middleware-logger": { - "version": "3.363.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.363.0.tgz", - "integrity": "sha512-SSGgthScYnFGTOw8EzbkvquqweFmvn7uJihkpFekbtBNGC/jGOGO+8ziHjTQ8t/iI/YKubEwv+LMi0f77HKSEg==", + "node_modules/@aws-sdk/token-providers/node_modules/@smithy/shared-ini-file-loader": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.0.10.tgz", + "integrity": "sha512-jWASteSezRKohJ7GdA7pHDvmr7Q7tw3b5mu3xLHIkZy/ICftJ+O7aqNaF8wklhI7UNFoQ7flFRM3Rd0KA+1BbQ==", "dependencies": { - "@aws-sdk/types": "3.357.0", - "@smithy/types": "^1.1.0", + "@smithy/types": "^2.3.2", "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/middleware-logger/node_modules/@aws-sdk/types": { - "version": "3.357.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.357.0.tgz", - "integrity": "sha512-/riCRaXg3p71BeWnShrai0y0QTdXcouPSM0Cn1olZbzTf7s71aLEewrc96qFrL70XhY4XvnxMpqQh+r43XIL3g==", + "node_modules/@aws-sdk/token-providers/node_modules/@smithy/smithy-client": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-2.1.5.tgz", + "integrity": "sha512-7S865uKzsxApM8W8Q6zkij7tcUFgaG8PuADMFdMt1yL/ku3d0+s6Zwrg3N7iXCPM08Gu/mf0BIfTXIu/9i450Q==", "dependencies": { + "@smithy/middleware-stack": "^2.0.1", + "@smithy/types": "^2.3.2", + "@smithy/util-stream": "^2.0.11", "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.363.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.363.0.tgz", - "integrity": "sha512-MWD/57QgI/N7fG8rtzDTUdSqNpYohQfgj9XCFAoVeI/bU4usrkOrew43L4smJG4XrDxlNT8lSJlDtd64tuiUZA==", + "node_modules/@aws-sdk/token-providers/node_modules/@smithy/types": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.3.2.tgz", + "integrity": "sha512-iH0cdKi7HQlzfAM3w2shFk/qZYKAqJWswtpmQpPtlruF+uFZeGEpMJjgDRyhWiddfVM4e2oP4nMaOBsMy6lXgg==", "dependencies": { - "@aws-sdk/types": "3.357.0", - "@smithy/protocol-http": "^1.1.0", - "@smithy/types": "^1.1.0", "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/middleware-recursion-detection/node_modules/@aws-sdk/types": { - "version": "3.357.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.357.0.tgz", - "integrity": "sha512-/riCRaXg3p71BeWnShrai0y0QTdXcouPSM0Cn1olZbzTf7s71aLEewrc96qFrL70XhY4XvnxMpqQh+r43XIL3g==", + "node_modules/@aws-sdk/token-providers/node_modules/@smithy/url-parser": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-2.0.8.tgz", + "integrity": "sha512-wQw7j004ScCrBRJ+oNPXlLE9mtofxyadSZ9D8ov/rHkyurS7z1HTNuyaGRj6OvKsEk0SVQsuY0C9+EfM75XTkw==", + "dependencies": { + "@smithy/querystring-parser": "^2.0.8", + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + } + }, + "node_modules/@aws-sdk/token-providers/node_modules/@smithy/util-base64": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-2.0.0.tgz", + "integrity": "sha512-Zb1E4xx+m5Lud8bbeYi5FkcMJMnn+1WUnJF3qD7rAdXpaL7UjkFQLdmW5fHadoKbdHpwH9vSR8EyTJFHJs++tA==", "dependencies": { + "@smithy/util-buffer-from": "^2.0.0", "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/middleware-sdk-s3": { - "version": "3.370.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.370.0.tgz", - "integrity": "sha512-DPYXtveWBDS5MzSHWTThg2KkLaOzZkCgPejjEuw3yl4ljsHawDs/ZIVCtmWXlBIS2lLCaBMpCV+t9psuJ/6/zQ==", + "node_modules/@aws-sdk/token-providers/node_modules/@smithy/util-body-length-browser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-2.0.0.tgz", + "integrity": "sha512-JdDuS4ircJt+FDnaQj88TzZY3+njZ6O+D3uakS32f2VNnDo3vyEuNdBOh/oFd8Df1zSZOuH1HEChk2AOYDezZg==", + "dependencies": { + "tslib": "^2.5.0" + } + }, + "node_modules/@aws-sdk/token-providers/node_modules/@smithy/util-body-length-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-2.1.0.tgz", + "integrity": "sha512-/li0/kj/y3fQ3vyzn36NTLGmUwAICb7Jbe/CsWCktW363gh1MOcpEcSO3mJ344Gv2dqz8YJCLQpb6hju/0qOWw==", "dependencies": { - "@aws-sdk/types": "3.370.0", - "@aws-sdk/util-arn-parser": "3.310.0", - "@smithy/protocol-http": "^1.1.0", - "@smithy/types": "^1.1.0", "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/middleware-sdk-sts": { - "version": "3.363.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.363.0.tgz", - "integrity": "sha512-1yy2Ac50FO8BrODaw5bPWvVrRhaVLqXTFH6iHB+dJLPUkwtY5zLM3Mp+9Ilm7kME+r7oIB1wuO6ZB1Lf4ZszIw==", + "node_modules/@aws-sdk/token-providers/node_modules/@smithy/util-buffer-from": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.0.0.tgz", + "integrity": "sha512-/YNnLoHsR+4W4Vf2wL5lGv0ksg8Bmk3GEGxn2vEQt52AQaPSCuaO5PM5VM7lP1K9qHRKHwrPGktqVoAHKWHxzw==", "dependencies": { - "@aws-sdk/middleware-signing": "3.363.0", - "@aws-sdk/types": "3.357.0", - "@smithy/types": "^1.1.0", + "@smithy/is-array-buffer": "^2.0.0", "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/middleware-sdk-sts/node_modules/@aws-sdk/types": { - "version": "3.357.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.357.0.tgz", - "integrity": "sha512-/riCRaXg3p71BeWnShrai0y0QTdXcouPSM0Cn1olZbzTf7s71aLEewrc96qFrL70XhY4XvnxMpqQh+r43XIL3g==", + "node_modules/@aws-sdk/token-providers/node_modules/@smithy/util-config-provider": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-2.0.0.tgz", + "integrity": "sha512-xCQ6UapcIWKxXHEU4Mcs2s7LcFQRiU3XEluM2WcCjjBtQkUN71Tb+ydGmJFPxMUrW/GWMgQEEGipLym4XG0jZg==", "dependencies": { "tslib": "^2.5.0" }, @@ -1543,123 +5431,123 @@ "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/middleware-signing": { - "version": "3.363.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.363.0.tgz", - "integrity": "sha512-/7qia715pt9JKYIPDGu22WmdZxD8cfF/5xB+1kmILg7ZtjO0pPuTaCNJ7xiIuFd7Dn7JXp5lop08anX/GOhNRQ==", + "node_modules/@aws-sdk/token-providers/node_modules/@smithy/util-defaults-mode-browser": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.0.9.tgz", + "integrity": "sha512-JONLJVQWT8165XoSV36ERn3SVlZLJJ4D6IeGsCSePv65Uxa93pzSLE0UMSR9Jwm4zix7rst9AS8W5QIypZWP8Q==", "dependencies": { - "@aws-sdk/types": "3.357.0", - "@smithy/property-provider": "^1.0.1", - "@smithy/protocol-http": "^1.1.0", - "@smithy/signature-v4": "^1.0.1", - "@smithy/types": "^1.1.0", - "@smithy/util-middleware": "^1.0.1", + "@smithy/property-provider": "^2.0.9", + "@smithy/smithy-client": "^2.1.5", + "@smithy/types": "^2.3.2", + "bowser": "^2.11.0", "tslib": "^2.5.0" }, "engines": { - "node": ">=14.0.0" + "node": ">= 10.0.0" } }, - "node_modules/@aws-sdk/middleware-signing/node_modules/@aws-sdk/types": { - "version": "3.357.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.357.0.tgz", - "integrity": "sha512-/riCRaXg3p71BeWnShrai0y0QTdXcouPSM0Cn1olZbzTf7s71aLEewrc96qFrL70XhY4XvnxMpqQh+r43XIL3g==", - "dependencies": { + "node_modules/@aws-sdk/token-providers/node_modules/@smithy/util-defaults-mode-node": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.0.11.tgz", + "integrity": "sha512-tmqjNsfj+bgZN6jXBe6efZnukzILA7BUytHkzqikuRLNtR+0VVchQHvawD0w6vManh76rO81ydhioe7i4oBzuA==", + "dependencies": { + "@smithy/config-resolver": "^2.0.9", + "@smithy/credential-provider-imds": "^2.0.11", + "@smithy/node-config-provider": "^2.0.11", + "@smithy/property-provider": "^2.0.9", + "@smithy/smithy-client": "^2.1.5", + "@smithy/types": "^2.3.2", "tslib": "^2.5.0" }, "engines": { - "node": ">=14.0.0" + "node": ">= 10.0.0" } }, - "node_modules/@aws-sdk/middleware-ssec": { - "version": "3.370.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.370.0.tgz", - "integrity": "sha512-NIosfLS7mxCNdGYnuy76W9qP3f3YWVTusUA+uv+s6rnwG+Z2UheXCf1wpnJKzxORA8pioSP7ylZ8w2A0reCgYQ==", + "node_modules/@aws-sdk/token-providers/node_modules/@smithy/util-hex-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-2.0.0.tgz", + "integrity": "sha512-c5xY+NUnFqG6d7HFh1IFfrm3mGl29lC+vF+geHv4ToiuJCBmIfzx6IeHLg+OgRdPFKDXIw6pvi+p3CsscaMcMA==", "dependencies": { - "@aws-sdk/types": "3.370.0", - "@smithy/types": "^1.1.0", "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.363.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.363.0.tgz", - "integrity": "sha512-ri8YaQvXP6odteVTMfxPqFR26Q0h9ejtqhUDv47P34FaKXedEM4nC6ix6o+5FEYj6l8syGyktftZ5O70NoEhug==", + "node_modules/@aws-sdk/token-providers/node_modules/@smithy/util-middleware": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-2.0.1.tgz", + "integrity": "sha512-LnsBMi0Mg3gfz/TpNGLv2Jjcz2ra1OX5HR/4IaCepIYmtPQzqMWDdhX/XTW1LS8OZ0xbQuyQPcHkQ+2XkhWOVQ==", "dependencies": { - "@aws-sdk/types": "3.357.0", - "@aws-sdk/util-endpoints": "3.357.0", - "@smithy/protocol-http": "^1.1.0", - "@smithy/types": "^1.1.0", + "@smithy/types": "^2.3.2", "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/middleware-user-agent/node_modules/@aws-sdk/types": { - "version": "3.357.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.357.0.tgz", - "integrity": "sha512-/riCRaXg3p71BeWnShrai0y0QTdXcouPSM0Cn1olZbzTf7s71aLEewrc96qFrL70XhY4XvnxMpqQh+r43XIL3g==", + "node_modules/@aws-sdk/token-providers/node_modules/@smithy/util-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-2.0.1.tgz", + "integrity": "sha512-naj4X0IafJ9yJnVJ58QgSMkCNLjyQOnyrnKh/T0f+0UOUxJiT8vuFn/hS7B/pNqbo2STY7PyJ4J4f+5YqxwNtA==", "dependencies": { + "@smithy/service-error-classification": "^2.0.1", + "@smithy/types": "^2.3.2", "tslib": "^2.5.0" }, "engines": { - "node": ">=14.0.0" + "node": ">= 14.0.0" } }, - "node_modules/@aws-sdk/signature-v4-multi-region": { - "version": "3.370.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.370.0.tgz", - "integrity": "sha512-Q3NQopPDnHbJXMhtYl0Mfy5U2o76K6tzhdnYRcrYImY0ze/zOkCQI7KPC4588PuyvAXCdQ02cmCPPjYD55UeNg==", - "dependencies": { - "@aws-sdk/types": "3.370.0", - "@smithy/protocol-http": "^1.1.0", - "@smithy/signature-v4": "^1.0.1", - "@smithy/types": "^1.1.0", + "node_modules/@aws-sdk/token-providers/node_modules/@smithy/util-stream": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-2.0.11.tgz", + "integrity": "sha512-2MeWfqSpZKdmEJ+tH8CJQSgzLWhH5cmdE24X7JB0hiamXrOmswWGGuPvyj/9sQCTclo57pNxLR2p7KrP8Ahiyg==", + "dependencies": { + "@smithy/fetch-http-handler": "^2.1.4", + "@smithy/node-http-handler": "^2.1.4", + "@smithy/types": "^2.3.2", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-buffer-from": "^2.0.0", + "@smithy/util-hex-encoding": "^2.0.0", + "@smithy/util-utf8": "^2.0.0", "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" - }, - "peerDependencies": { - "@aws-sdk/signature-v4-crt": "^3.118.0" - }, - "peerDependenciesMeta": { - "@aws-sdk/signature-v4-crt": { - "optional": true - } } }, - "node_modules/@aws-sdk/token-providers": { - "version": "3.363.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.363.0.tgz", - "integrity": "sha512-6+0aJ1zugNgsMmhTtW2LBWxOVSaXCUk2q3xyTchSXkNzallYaRiZMRkieW+pKNntnu0g5H1T0zyfCO0tbXwxEA==", + "node_modules/@aws-sdk/token-providers/node_modules/@smithy/util-uri-escape": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-2.0.0.tgz", + "integrity": "sha512-ebkxsqinSdEooQduuk9CbKcI+wheijxEb3utGXkCoYQkJnwTnLbH1JXGimJtUkQwNQbsbuYwG2+aFVyZf5TLaw==", "dependencies": { - "@aws-sdk/client-sso-oidc": "3.363.0", - "@aws-sdk/types": "3.357.0", - "@smithy/property-provider": "^1.0.1", - "@smithy/shared-ini-file-loader": "^1.0.1", - "@smithy/types": "^1.1.0", "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/token-providers/node_modules/@aws-sdk/types": { - "version": "3.357.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.357.0.tgz", - "integrity": "sha512-/riCRaXg3p71BeWnShrai0y0QTdXcouPSM0Cn1olZbzTf7s71aLEewrc96qFrL70XhY4XvnxMpqQh+r43XIL3g==", + "node_modules/@aws-sdk/token-providers/node_modules/@smithy/util-utf8": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.0.0.tgz", + "integrity": "sha512-rctU1VkziY84n5OXe3bPNpKR001ZCME2JCaBBFgtiM2hfKbHFudc/BkMuPab8hRbLd0j3vbnBTTZ1igBf0wgiQ==", "dependencies": { + "@smithy/util-buffer-from": "^2.0.0", "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, + "node_modules/@aws-sdk/token-providers/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==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/@aws-sdk/types": { "version": "3.370.0", "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.370.0.tgz", @@ -1708,11 +5596,11 @@ } }, "node_modules/@aws-sdk/util-endpoints": { - "version": "3.357.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.357.0.tgz", - "integrity": "sha512-XHKyS5JClT9su9hDif715jpZiWHQF9gKZXER8tW0gOizU3R9cyWc9EsJ2BRhFNhi7nt/JF/CLUEc5qDx3ETbUw==", + "version": "3.413.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.413.0.tgz", + "integrity": "sha512-VAwr7cITNb1L6/2XUPIbCOuhKGm0VtKCRblurrfUF2bxqG/wtuw/2Fm4ahYJPyxklOSXAMSq+RHdFWcir0YB/g==", "dependencies": { - "@aws-sdk/types": "3.357.0", + "@aws-sdk/types": "3.413.0", "tslib": "^2.5.0" }, "engines": { @@ -1720,9 +5608,21 @@ } }, "node_modules/@aws-sdk/util-endpoints/node_modules/@aws-sdk/types": { - "version": "3.357.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.357.0.tgz", - "integrity": "sha512-/riCRaXg3p71BeWnShrai0y0QTdXcouPSM0Cn1olZbzTf7s71aLEewrc96qFrL70XhY4XvnxMpqQh+r43XIL3g==", + "version": "3.413.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.413.0.tgz", + "integrity": "sha512-j1xib0f/TazIFc5ySIKOlT1ujntRbaoG4LJFeEezz4ji03/wSJMI8Vi4KjzpBp8J1tTu0oRDnsxRIGixsUBeYQ==", + "dependencies": { + "@smithy/types": "^2.3.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-endpoints/node_modules/@smithy/types": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.3.2.tgz", + "integrity": "sha512-iH0cdKi7HQlzfAM3w2shFk/qZYKAqJWswtpmQpPtlruF+uFZeGEpMJjgDRyhWiddfVM4e2oP4nMaOBsMy6lXgg==", "dependencies": { "tslib": "^2.5.0" }, @@ -1742,20 +5642,32 @@ } }, "node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.363.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.363.0.tgz", - "integrity": "sha512-fk9ymBUIYbxiGm99Cn+kAAXmvMCWTf/cHAcB79oCXV4ELXdPa9lN5xQhZRFNxLUeXG4OAMEuCAUUuZEj8Fnc1Q==", + "version": "3.413.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.413.0.tgz", + "integrity": "sha512-7j/qWcRO2OBZBre2fC6V6M0PAS9n7k6i+VtofPkkhxC2DZszLJElqnooF9hGmVGYK3zR47Np4WjURXKIEZclWg==", "dependencies": { - "@aws-sdk/types": "3.357.0", - "@smithy/types": "^1.1.0", + "@aws-sdk/types": "3.413.0", + "@smithy/types": "^2.3.1", "bowser": "^2.11.0", "tslib": "^2.5.0" } }, "node_modules/@aws-sdk/util-user-agent-browser/node_modules/@aws-sdk/types": { - "version": "3.357.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.357.0.tgz", - "integrity": "sha512-/riCRaXg3p71BeWnShrai0y0QTdXcouPSM0Cn1olZbzTf7s71aLEewrc96qFrL70XhY4XvnxMpqQh+r43XIL3g==", + "version": "3.413.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.413.0.tgz", + "integrity": "sha512-j1xib0f/TazIFc5ySIKOlT1ujntRbaoG4LJFeEezz4ji03/wSJMI8Vi4KjzpBp8J1tTu0oRDnsxRIGixsUBeYQ==", + "dependencies": { + "@smithy/types": "^2.3.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-user-agent-browser/node_modules/@smithy/types": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.3.2.tgz", + "integrity": "sha512-iH0cdKi7HQlzfAM3w2shFk/qZYKAqJWswtpmQpPtlruF+uFZeGEpMJjgDRyhWiddfVM4e2oP4nMaOBsMy6lXgg==", "dependencies": { "tslib": "^2.5.0" }, @@ -1764,13 +5676,13 @@ } }, "node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.363.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.363.0.tgz", - "integrity": "sha512-Fli/dvgGA9hdnQUrYb1//wNSFlK2jAfdJcfNXA6SeBYzSeH5pVGYF4kXF0FCdnMA3Fef+Zn1zAP/hw9v8VJHWQ==", + "version": "3.413.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.413.0.tgz", + "integrity": "sha512-vHm9TVZIzfWMeDvdmoOky6VarqOt8Pr68CESHN0jyuO6XbhCDnr9rpaXiBhbSR+N1Qm7R/AfJgAhQyTMu2G1OA==", "dependencies": { - "@aws-sdk/types": "3.357.0", - "@smithy/node-config-provider": "^1.0.1", - "@smithy/types": "^1.1.0", + "@aws-sdk/types": "3.413.0", + "@smithy/node-config-provider": "^2.0.10", + "@smithy/types": "^2.3.1", "tslib": "^2.5.0" }, "engines": { @@ -1786,9 +5698,59 @@ } }, "node_modules/@aws-sdk/util-user-agent-node/node_modules/@aws-sdk/types": { - "version": "3.357.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.357.0.tgz", - "integrity": "sha512-/riCRaXg3p71BeWnShrai0y0QTdXcouPSM0Cn1olZbzTf7s71aLEewrc96qFrL70XhY4XvnxMpqQh+r43XIL3g==", + "version": "3.413.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.413.0.tgz", + "integrity": "sha512-j1xib0f/TazIFc5ySIKOlT1ujntRbaoG4LJFeEezz4ji03/wSJMI8Vi4KjzpBp8J1tTu0oRDnsxRIGixsUBeYQ==", + "dependencies": { + "@smithy/types": "^2.3.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-user-agent-node/node_modules/@smithy/node-config-provider": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-2.0.11.tgz", + "integrity": "sha512-CaR1dciSSGKttjhcefpytYjsfI/Yd5mqL8am4wfmyFCDxSiPsvnEWHl8UjM/RbcAjX0klt+CeIKPSHEc0wGvJA==", + "dependencies": { + "@smithy/property-provider": "^2.0.9", + "@smithy/shared-ini-file-loader": "^2.0.10", + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-user-agent-node/node_modules/@smithy/property-provider": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.0.9.tgz", + "integrity": "sha512-25pPZ8f8DeRwYI5wbPRZaoMoR+3vrw8DwbA0TjP+GsdiB2KxScndr4HQehiJ5+WJ0giOTWhLz0bd+7Djv1qpUQ==", + "dependencies": { + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-user-agent-node/node_modules/@smithy/shared-ini-file-loader": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.0.10.tgz", + "integrity": "sha512-jWASteSezRKohJ7GdA7pHDvmr7Q7tw3b5mu3xLHIkZy/ICftJ+O7aqNaF8wklhI7UNFoQ7flFRM3Rd0KA+1BbQ==", + "dependencies": { + "@smithy/types": "^2.3.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-user-agent-node/node_modules/@smithy/types": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.3.2.tgz", + "integrity": "sha512-iH0cdKi7HQlzfAM3w2shFk/qZYKAqJWswtpmQpPtlruF+uFZeGEpMJjgDRyhWiddfVM4e2oP4nMaOBsMy6lXgg==", "dependencies": { "tslib": "^2.5.0" }, @@ -3660,6 +7622,25 @@ "node": ">= 0.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==", + "dependencies": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, "node_modules/@ndhoule/extend": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@ndhoule/extend/-/extend-2.0.0.tgz", @@ -3719,6 +7700,135 @@ "node": ">=14" } }, + "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==" + }, + "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==" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" + }, + "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==", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "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==" + }, + "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==" + }, + "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==" + }, + "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==" + }, + "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==" + }, + "node_modules/@pyroscope/nodejs": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/@pyroscope/nodejs/-/nodejs-0.2.6.tgz", + "integrity": "sha512-F37ROH//HzO7zKm2S7CtNG8OAp+i4ADg4erQR9D57BrSgi8+3Jjp5s5PWqyJABC6IzsABgGrentPobBDr8QdsA==", + "dependencies": { + "axios": "^0.26.1", + "debug": "^4.3.3", + "form-data": "^4.0.0", + "pprof": "^3.2.0", + "regenerator-runtime": "^0.13.11", + "source-map": "^0.7.3" + }, + "engines": { + "node": "^12.20.0 || >=14.13.1" + } + }, + "node_modules/@pyroscope/nodejs/node_modules/axios": { + "version": "0.26.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz", + "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==", + "dependencies": { + "follow-redirects": "^1.14.8" + } + }, + "node_modules/@pyroscope/nodejs/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@rudderstack/json-template-engine": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@rudderstack/json-template-engine/-/json-template-engine-0.5.5.tgz", + "integrity": "sha512-p3HdTqgZiJjjZmjaHN2paa1e87ifGE5UjkA4zdvge4bBzJbKKMQNWqRg6I96SwoA+hsxNkW/f9R83SPLU9t7LA==" + }, + "node_modules/@rudderstack/workflow-engine": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@rudderstack/workflow-engine/-/workflow-engine-0.5.7.tgz", + "integrity": "sha512-qR4eSiSFgYdOMtldR0rJ5kLGiTfnyufDfkMHNXFybxPb3jpjxBEGapj2lRiiTiRPgSUef7vuKyJ8BzY/VR4noA==", + "dependencies": { + "@aws-crypto/sha256-js": "^4.0.0", + "@rudderstack/json-template-engine": "^0.5.5", + "js-yaml": "^4.1.0", + "jsonata": "^2.0.3", + "lodash": "^4.17.21", + "object-sizeof": "^2.6.3" + } + }, + "node_modules/@rudderstack/workflow-engine/node_modules/@aws-crypto/sha256-js": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-4.0.0.tgz", + "integrity": "sha512-MHGJyjE7TX9aaqXj7zk2ppnFUOhaDs5sP+HtNS0evOxn72c+5njUmyJmpGd7TfyoDznZlHMmdo/xGUdu2NIjNQ==", + "dependencies": { + "@aws-crypto/util": "^4.0.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@rudderstack/workflow-engine/node_modules/@aws-crypto/util": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-4.0.0.tgz", + "integrity": "sha512-2EnmPy2gsFZ6m8bwUQN4jq+IyXV3quHAcwPOS6ZA3k+geujiqI8aRokO2kFJe+idJ/P3v4qWI186rVMo0+zLDQ==", + "dependencies": { + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@rudderstack/workflow-engine/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/@sideway/address": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", @@ -4967,6 +9077,11 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "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==" + }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -5114,7 +9229,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, "engines": { "node": ">=8" } @@ -5159,6 +9273,36 @@ "integrity": "sha512-gkco+qxENJV+8vFcDiiFhuoSvRXb2a/QPqpSoWhVz829VNJfOTnELbBmPmNKFxf3xdNnw4DWCkzkDaavcX/1YQ==", "dev": true }, + "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==" + }, + "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==", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10" + } + }, + "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==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/arg": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", @@ -5305,7 +9449,6 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", - "dev": true, "engines": { "node": ">= 0.4" }, @@ -5318,6 +9461,57 @@ "resolved": "https://registry.npmjs.org/await-handler/-/await-handler-1.1.2.tgz", "integrity": "sha512-dihteGhwbJpT89kVbacWiyKeAZr+En0YGK6pAKQJLR0En9ZxSH2H4TTvfG4bBjzFq9gDAma4y9BrpDns6j5UiQ==" }, + "node_modules/aws-sdk": { + "version": "2.1460.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1460.0.tgz", + "integrity": "sha512-7K+aTMKtCAyR3cWxyGFd9YP1U4go4IaRsiFO8JLNpy2fSqlGC5XENGyLhmIQQOBwqb2WOwz5e1BftaKycmreWw==", + "dependencies": { + "buffer": "4.9.2", + "events": "1.1.1", + "ieee754": "1.1.13", + "jmespath": "0.16.0", + "querystring": "0.2.0", + "sax": "1.2.1", + "url": "0.10.3", + "util": "^0.12.4", + "uuid": "8.0.0", + "xml2js": "0.5.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/aws-sdk/node_modules/buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "dependencies": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "node_modules/aws-sdk/node_modules/events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw==", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/aws-sdk/node_modules/ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" + }, + "node_modules/aws-sdk/node_modules/uuid": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.0.0.tgz", + "integrity": "sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/axios": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz", @@ -5459,6 +9653,14 @@ "node": ">=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==", + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, "node_modules/bintrees": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bintrees/-/bintrees-1.0.2.tgz", @@ -5846,7 +10048,15 @@ "integrity": "sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==", "dev": true, "engines": { - "node": ">= 0.8.0" + "node": ">= 0.8.0" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "engines": { + "node": ">=10" } }, "node_modules/ci-info": { @@ -6096,6 +10306,14 @@ "simple-swizzle": "^0.2.2" } }, + "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==", + "bin": { + "color-support": "bin.js" + } + }, "node_modules/color/node_modules/color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -6326,6 +10544,11 @@ "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", "dev": true }, + "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==" + }, "node_modules/content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", @@ -8356,6 +12579,14 @@ "node": ">=8" } }, + "node_modules/detect-libc": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", + "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==", + "engines": { + "node": ">=8" + } + }, "node_modules/detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", @@ -9729,6 +13960,11 @@ "node": "^10.12.0 || >=12.0.0" } }, + "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==" + }, "node_modules/filing-cabinet": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/filing-cabinet/-/filing-cabinet-3.3.1.tgz", @@ -9819,6 +14055,14 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/findit2": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/findit2/-/findit2-2.2.3.tgz", + "integrity": "sha512-lg/Moejf4qXovVutL0Lz4IsaPoNYMuxt4PA0nGqFxnJ1CTTGGlEO2wKgoDpwknhvZ8k4Q2F+eesgkLbG2Mxfog==", + "engines": { + "node": ">=0.8.22" + } + }, "node_modules/findup-sync": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-4.0.0.tgz", @@ -9896,7 +14140,6 @@ "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, "dependencies": { "is-callable": "^1.1.3" } @@ -9990,6 +14233,33 @@ "node": ">=10" } }, + "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==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 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==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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==" + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -10041,6 +14311,25 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -10507,7 +14796,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, "dependencies": { "get-intrinsic": "^1.1.3" }, @@ -10707,6 +14995,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "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==" + }, "node_modules/has-value": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/has-value/-/has-value-2.0.2.tgz", @@ -11148,6 +15441,21 @@ "node": "*" } }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-array-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.1.tgz", @@ -11219,7 +15527,6 @@ "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, "engines": { "node": ">= 0.4" }, @@ -11547,7 +15854,6 @@ "version": "1.1.10", "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", - "dev": true, "dependencies": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", @@ -11634,8 +15940,7 @@ "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 + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" }, "node_modules/iserror": { "version": "0.0.2", @@ -12386,6 +16691,14 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/jmespath": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.16.0.tgz", + "integrity": "sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw==", + "engines": { + "node": ">= 0.6.0" + } + }, "node_modules/joi": { "version": "17.9.2", "resolved": "https://registry.npmjs.org/joi/-/joi-17.9.2.tgz", @@ -13211,6 +17524,11 @@ "triple-beam": "^1.3.0" } }, + "node_modules/long": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" + }, "node_modules/longest": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/longest/-/longest-2.0.1.tgz", @@ -13312,7 +17630,6 @@ "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==", - "dev": true, "dependencies": { "semver": "^6.0.0" }, @@ -13327,7 +17644,6 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, "bin": { "semver": "bin/semver.js" } @@ -13558,6 +17874,45 @@ "node": ">=16 || 14 >=14.17" } }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 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==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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==" + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/mocked-env": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/mocked-env/-/mocked-env-1.3.5.tgz", @@ -13906,6 +18261,11 @@ "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", "dev": true }, + "node_modules/nan": { + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", + "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==" + }, "node_modules/nanoid": { "version": "3.3.4", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", @@ -13955,9 +18315,9 @@ } }, "node_modules/node-fetch": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", - "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", + "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==", "dependencies": { "whatwg-url": "^5.0.0" }, @@ -14049,6 +18409,20 @@ "node": ">=6.0" } }, + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/normalize-package-data": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", @@ -14099,6 +18473,17 @@ "node": ">=8" } }, + "node_modules/npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "dependencies": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, "node_modules/number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", @@ -14117,7 +18502,6 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -14147,6 +18531,37 @@ "node": ">= 0.4" } }, + "node_modules/object-sizeof": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/object-sizeof/-/object-sizeof-2.6.3.tgz", + "integrity": "sha512-GNkVRrLh11Qr5BGr73dwwPE200/78QG2rbx30cnXPnMvt7UuttH4Dup5t+LtcQhARkg8Hbr0c8Kiz52+CFxYmw==", + "dependencies": { + "buffer": "^6.0.3" + } + }, + "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", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, "node_modules/object.assign": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", @@ -14582,6 +18997,17 @@ "node": ">=0.10" } }, + "node_modules/pify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz", + "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/pinkie": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", @@ -14726,11 +19152,40 @@ "postcss": "^8.2.9" } }, + "node_modules/pprof": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/pprof/-/pprof-3.2.1.tgz", + "integrity": "sha512-KnextTM3EHQ2zqN8fUjB0VpE+njcVR7cOfo7DjJSLKzIbKTPelDtokI04ScR/Vd8CLDj+M99tsaKV+K6FHzpzA==", + "hasInstallScript": true, + "dependencies": { + "@mapbox/node-pre-gyp": "^1.0.0", + "bindings": "^1.2.1", + "delay": "^5.0.0", + "findit2": "^2.2.3", + "nan": "^2.14.0", + "p-limit": "^3.0.0", + "pify": "^5.0.0", + "protobufjs": "~7.2.4", + "source-map": "^0.7.3", + "split": "^1.0.1" + }, + "engines": { + "node": ">=10.4.1" + } + }, "node_modules/pprof-format": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/pprof-format/-/pprof-format-2.0.7.tgz", "integrity": "sha512-1qWaGAzwMpaXJP9opRa23nPnt2Egi7RMNoNBptEE/XwHbcn4fC2b/4U4bKc5arkGkIh2ZabpF2bEb+c5GNHEKA==" }, + "node_modules/pprof/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "engines": { + "node": ">= 8" + } + }, "node_modules/precinct": { "version": "8.3.1", "resolved": "https://registry.npmjs.org/precinct/-/precinct-8.3.1.tgz", @@ -15111,6 +19566,29 @@ "node": ">= 6" } }, + "node_modules/protobufjs": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.5.tgz", + "integrity": "sha512-gGXRSXvxQ7UiPgfw8gevrfRWcTlSbOFg+p/N+JVJEK5VhueL2miT6qTymqAmjr1Q5WbOCyJbyrk6JfWKwlFn6A==", + "hasInstallScript": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", @@ -15187,6 +19665,15 @@ "node": ">=0.10.0" } }, + "node_modules/querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==", + "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", + "engines": { + "node": ">=0.4.x" + } + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -15452,6 +19939,11 @@ "node": ">=4" } }, + "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==" + }, "node_modules/regexp-tree": { "version": "0.1.24", "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.24.tgz", @@ -15691,7 +20183,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, "dependencies": { "glob": "^7.1.3" }, @@ -15706,7 +20197,6 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -15739,11 +20229,6 @@ "node": ">=12.0" } }, - "node_modules/rudder-json-template-engine": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/rudder-json-template-engine/-/rudder-json-template-engine-0.5.1.tgz", - "integrity": "sha512-D8zCcTXbhbFd2EhDmmgZKxw5uky6+DfikV/EW8I8HWdutMiyzdxgVMyH1dPo3feLgj3/0g2WNO9t4iPaegw4PQ==" - }, "node_modules/rudder-transformer-cdk": { "version": "1.4.11", "resolved": "https://registry.npmjs.org/rudder-transformer-cdk/-/rudder-transformer-cdk-1.4.11.tgz", @@ -15761,43 +20246,6 @@ "winston": "^3.8.1" } }, - "node_modules/rudder-workflow-engine": { - "version": "0.4.7", - "resolved": "https://registry.npmjs.org/rudder-workflow-engine/-/rudder-workflow-engine-0.4.7.tgz", - "integrity": "sha512-USJ/h4XGxtUmAhaTJgtz1MrICpiju6GTubaFyPS+5hgpjdIsZx/iOOishjrNcOrwHvxcfblccA8wv5JTC8eSpg==", - "dependencies": { - "@aws-crypto/sha256-js": "^4.0.0", - "js-yaml": "^4.1.0", - "jsonata": "^2.0.3", - "lodash": "^4.17.21", - "rudder-json-template-engine": "^0.5.1" - } - }, - "node_modules/rudder-workflow-engine/node_modules/@aws-crypto/sha256-js": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-4.0.0.tgz", - "integrity": "sha512-MHGJyjE7TX9aaqXj7zk2ppnFUOhaDs5sP+HtNS0evOxn72c+5njUmyJmpGd7TfyoDznZlHMmdo/xGUdu2NIjNQ==", - "dependencies": { - "@aws-crypto/util": "^4.0.0", - "@aws-sdk/types": "^3.222.0", - "tslib": "^1.11.1" - } - }, - "node_modules/rudder-workflow-engine/node_modules/@aws-crypto/util": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-4.0.0.tgz", - "integrity": "sha512-2EnmPy2gsFZ6m8bwUQN4jq+IyXV3quHAcwPOS6ZA3k+geujiqI8aRokO2kFJe+idJ/P3v4qWI186rVMo0+zLDQ==", - "dependencies": { - "@aws-sdk/types": "^3.222.0", - "@aws-sdk/util-utf8-browser": "^3.0.0", - "tslib": "^1.11.1" - } - }, - "node_modules/rudder-workflow-engine/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/run-async": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", @@ -15915,11 +20363,15 @@ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true }, + "node_modules/sax": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", + "integrity": "sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA==" + }, "node_modules/semver": { "version": "7.5.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", - "dev": true, "dependencies": { "lru-cache": "^6.0.0" }, @@ -15952,7 +20404,6 @@ "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, "dependencies": { "yallist": "^4.0.0" }, @@ -15963,14 +20414,12 @@ "node_modules/semver/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 + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "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==", - "dev": true + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" }, "node_modules/set-value": { "version": "4.1.0", @@ -16175,7 +20624,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", - "dev": true, "dependencies": { "through": "2" }, @@ -16506,7 +20954,6 @@ "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, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -16549,14 +20996,12 @@ "node_modules/string-width/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==", - "dev": true + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "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==", - "dev": true, "engines": { "node": ">=8" } @@ -16623,7 +21068,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -16960,6 +21404,35 @@ "node": ">=6" } }, + "node_modules/tar": { + "version": "6.1.15", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", + "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "engines": { + "node": ">=8" + } + }, + "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==" + }, "node_modules/tdigest": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/tdigest/-/tdigest-0.1.2.tgz", @@ -17025,8 +21498,7 @@ "node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" }, "node_modules/through2": { "version": "4.0.2", @@ -17521,6 +21993,15 @@ "punycode": "^2.1.0" } }, + "node_modules/url": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", + "integrity": "sha512-hzSUW2q06EqL1gKM/a+obYHLIO6ct2hwPuviqTTOcfFVc61UbfJ2Q32+uGL/HCPxKqrdGB5QUwIe7UqlDgwsOQ==", + "dependencies": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + }, "node_modules/url-parse-lax": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", @@ -17542,6 +22023,11 @@ "node": ">= 4" } }, + "node_modules/url/node_modules/punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==" + }, "node_modules/utf8-byte-length": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz", @@ -17552,6 +22038,18 @@ "resolved": "https://registry.npmjs.org/utf8-length/-/utf8-length-0.0.1.tgz", "integrity": "sha512-j/XH2ftofBiobnyApxlN/J6j/ixwT89WEjDcjT66d2i0+GIn9RZfzt8lpEXXE4jUe4NsjBSUq70kS2euQ4nnMw==" }, + "node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -17711,7 +22209,6 @@ "version": "1.1.9", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", - "dev": true, "dependencies": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", @@ -17727,6 +22224,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "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==", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, "node_modules/widest-line": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", @@ -17853,6 +22358,26 @@ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, + "node_modules/xml2js": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", + "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "engines": { + "node": ">=4.0" + } + }, "node_modules/xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", diff --git a/package.json b/package.json index 34cb1b4feb..5a17a4d524 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "rudder-transformer", - "version": "1.40.1", + "version": "1.41.1", "description": "", "homepage": "https://github.com/rudderlabs/rudder-transformer#readme", "bugs": { @@ -51,14 +51,19 @@ }, "dependencies": { "@amplitude/ua-parser-js": "^0.7.24", - "@aws-sdk/client-personalize": "^3.363.0", + "@aws-sdk/client-personalize": "^3.391.0", "@aws-sdk/client-s3": "^3.370.0", - "@aws-sdk/credential-providers": "^3.363.0", - "@aws-sdk/lib-storage": "^3.370.0", + "@aws-sdk/credential-providers": "^3.391.0", + "@aws-sdk/lib-storage": "^3.391.0", + "@aws-sdk/client-lambda": "^3.276.0", + "aws-sdk": "^2.1354.0", "@bugsnag/js": "^7.20.2", "@datadog/pprof": "^3.1.0", + "pprof": "^3.2.1", "@koa/router": "^12.0.0", "@ndhoule/extend": "^2.0.0", + "@pyroscope/nodejs": "^0.2.6", + "@rudderstack/workflow-engine": "^0.5.7", "ajv": "^8.12.0", "ajv-draft-04": "^1.0.0", "ajv-formats": "^2.1.1", @@ -91,14 +96,13 @@ "moment": "^2.29.4", "moment-timezone": "^0.5.43", "node-cache": "^5.1.2", - "node-fetch": "^2.6.9", + "node-fetch": "^2.6.12", "oauth-1.0a": "^2.2.6", "object-hash": "^3.0.0", "parse-static-imports": "^1.1.0", "prom-client": "^14.2.0", "qs": "^6.11.1", "rudder-transformer-cdk": "^1.4.11", - "rudder-workflow-engine": "^0.4.7", "set-value": "^4.1.0", "sha256": "^0.2.0", "stacktrace-parser": "^0.1.10", diff --git a/sample.env b/sample.env index 02ef06c9c6..71b11fbfca 100644 --- a/sample.env +++ b/sample.env @@ -9,3 +9,4 @@ REDIS_PORT = 6379 REDIS_PASSWORD = 123 REDIS_USERNAME = abc USE_REDIS_DB = true +REDIS_EXPIRY_TIME_IN_SEC = 3600 \ No newline at end of file diff --git a/src/adapters/networkhandler/authConstants.js b/src/adapters/networkhandler/authConstants.js index c9a6a57835..f88361107a 100644 --- a/src/adapters/networkhandler/authConstants.js +++ b/src/adapters/networkhandler/authConstants.js @@ -2,6 +2,6 @@ * This class is used for handling Auth related errors */ module.exports = { - DISABLE_DEST: 'DISABLE_DESTINATION', REFRESH_TOKEN: 'REFRESH_TOKEN', + AUTH_STATUS_INACTIVE: 'AUTH_STATUS_INACTIVE', }; diff --git a/src/cdk/v2/destinations/fullstory/procWorkflow.yaml b/src/cdk/v2/destinations/fullstory/procWorkflow.yaml new file mode 100644 index 0000000000..50ac2a8163 --- /dev/null +++ b/src/cdk/v2/destinations/fullstory/procWorkflow.yaml @@ -0,0 +1,104 @@ +bindings: + - name: EventType + path: ../../../../constants + - path: ../../bindings/jsontemplate + exportAll: true + - name: removeUndefinedAndNullValues + path: ../../../../v0/util + +steps: + - name: validateInput + template: | + $.assert(.message.type, "message Type is not present. Aborting message."); + $.assert(.message.type in {{$.EventType.([.TRACK, .IDENTIFY])}}, + "message type " + .message.type + " is not supported"); + - name: prepareContext + template: | + $.context.messageType = .message.type.toLowerCase(); + $.context.payload = {}; + $.context.finalHeaders = { + "authorization": "Basic " + .destination.Config.apiKey, + "content-type": "application/json" + }; + - name: identifyPayload + condition: $.context.messageType == "identify" + template: | + $.context.endpoint = "https://api.fullstory.com/v2/users"; + $.context.payload.properties = .message.traits ?? .message.context.traits; + $.context.payload.uid = .message.userId; + $.context.payload.email = .message.context.traits.email; + $.context.payload.display_name = .message.context.traits.name; + + - name: trackPayload + condition: $.context.messageType == "track" + template: | + $.context.endpoint = "https://api.fullstory.com/v2/events"; + $.context.payload.name = .message.event; + $.context.payload.properties = .message.properties; + $.context.payload.timestamp = .message.originalTimestamp; + $.context.payload.context = {}; + + - name: validateEventName + condition: $.context.messageType == "track" + template: | + $.assert(.message.event, "event is required for track call") + + - name: mapContextFieldsForTrack + condition: $.context.messageType == "track" + template: | + $.context.payload.context.browser = { + "url": .message.context.page.url, + "user_agent": .message.context.userAgent, + "initial_referrer": .message.context.page.initial_referrer, + }; + $.context.payload.context.mobile = { + "app_name": .message.context.app.name, + "app_version": .message.context.app.version, + }; + $.context.payload.context.device = { + "manufacturer": .message.context.device.manufacturer, + "model": .message.context.device.model, + }; + $.context.payload.context.location = { + "ip_address": .message.context.ip, + "latitude": .message.properties.latitude, + "longitude": .message.properties.longitude, + "city": .message.properties.city, + "region": .message.properties.region, + "country": .message.properties.country, + }; + + - name: mapIdsForTrack + condition: $.context.messageType == "track" + template: | + $.context.payload.session = { + "id": .message.properties.sessionId, + "use_most_recent": .message.properties.useMostRecent, + }; + $.context.payload.user = { + "id": .message.properties.userId ?? .message.userId, + } + + - 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": {} + }) + + + diff --git a/src/cdk/v2/destinations/launchdarkly_audience/config.js b/src/cdk/v2/destinations/launchdarkly_audience/config.js new file mode 100644 index 0000000000..a1ec48a43c --- /dev/null +++ b/src/cdk/v2/destinations/launchdarkly_audience/config.js @@ -0,0 +1,15 @@ +const SUPPORTED_EVENT_TYPE = 'audiencelist'; +const ACTION_TYPES = ['add', 'remove']; +const IDENTIFIER_KEY = 'identifier'; +// ref:- https://docs.launchdarkly.com/guides/integrations/build-synced-segments?q=othercapabilities#manifest-details +// ref:- https://docs.launchdarkly.com/home/segments#targeting-users-in-segments +const ENDPOINT = 'https://app.launchdarkly.com/api/v2/segment-targets/rudderstack'; +const MAX_IDENTIFIERS = 1000; + +module.exports = { + SUPPORTED_EVENT_TYPE, + ACTION_TYPES, + IDENTIFIER_KEY, + ENDPOINT, + MAX_IDENTIFIERS, +}; diff --git a/src/cdk/v2/destinations/launchdarkly_audience/procWorkflow.yaml b/src/cdk/v2/destinations/launchdarkly_audience/procWorkflow.yaml new file mode 100644 index 0000000000..48aad2bb79 --- /dev/null +++ b/src/cdk/v2/destinations/launchdarkly_audience/procWorkflow.yaml @@ -0,0 +1,67 @@ +bindings: + - name: EventType + path: ../../../../constants + - path: ../../bindings/jsontemplate + exportAll: true + - name: defaultRequestConfig + path: ../../../../v0/util + - name: removeUndefinedNullEmptyExclBoolInt + path: ../../../../v0/util + - path: ./config + exportAll: true + - path: ./utils + exportAll: true + +steps: + - name: validateInput + template: | + let messageType = .message.type; + $.assertConfig(.destination.Config.audienceId, "Audience Id is not present. Aborting"); + $.assertConfig(.destination.Config.audienceName, "Audience Name is not present. Aborting"); + $.assertConfig(.destination.Config.accessToken, "Access Token is not present. Aborting"); + $.assertConfig(.destination.Config.clientSideId, "Launch Darkly Client Side is not present. Aborting"); + $.assert(.message.type, "Message Type is not present. Aborting message."); + $.assert(.message.type.toLowerCase() === $.SUPPORTED_EVENT_TYPE, "Event type " + .message.type.toLowerCase() + " is not supported. Aborting message."); + $.assert(.message.properties, "Message properties is not present. Aborting message."); + $.assert(.message.properties.listData, "`listData` is not present inside properties. Aborting message."); + $.assert($.containsAll(Object.keys(.message.properties.listData), $.ACTION_TYPES), "Unsupported action type. Aborting message.") + $.assert(Object.keys(.message.properties.listData).length > 0, "`listData` is empty. Aborting message.") + + - name: batchIdentifiersList + description: batch identifiers list + template: | + const batchedList = $.batchIdentifiersList(.message.properties.listData); + $.assert(batchedList.length > 0, "`listData` is empty. Aborting message."); + batchedList; + + - name: prepareBasePayload + template: | + const payload = { + environmentId: .destination.Config.clientSideId, + cohortId: .destination.Config.audienceId, + cohortName: .destination.Config.audienceName, + contextKind: .destination.Config.audienceType + }; + $.removeUndefinedNullEmptyExclBoolInt(payload); + + - name: buildResponseForProcessTransformation + description: build multiplexed response depending upon batch size + template: | + $.outputs.batchIdentifiersList.().({ + "body": { + "JSON": {...$.outputs.prepareBasePayload, listData: .}, + "JSON_ARRAY": {}, + "XML": {}, + "FORM": {} + }, + "version": "1", + "type": "REST", + "method": "POST", + "endpoint": {{$.ENDPOINT}}, + "headers": { + "Authorization": ^.destination.Config.accessToken, + "Content-Type": "application/json" + }, + "params": {}, + "files": {} + })[] diff --git a/src/cdk/v2/destinations/launchdarkly_audience/utils.js b/src/cdk/v2/destinations/launchdarkly_audience/utils.js new file mode 100644 index 0000000000..5bbcdfb6a3 --- /dev/null +++ b/src/cdk/v2/destinations/launchdarkly_audience/utils.js @@ -0,0 +1,87 @@ +const _ = require('lodash'); +const { ACTION_TYPES, IDENTIFIER_KEY, MAX_IDENTIFIERS } = require('./config'); + +/** + * Prepares a list of identifiers based on the provided data and identifier key. + * @param {*} listData The data containing lists of members to be added or removed from the audience. + * @returns + * { + "add": [ + { + "id": "test@gmail.com" + } + ], + "remove": [] + } + */ +const prepareIdentifiersList = (listData) => { + const list = {}; + const processList = (actionData) => + actionData + .filter((member) => member.hasOwnProperty(IDENTIFIER_KEY) && member[IDENTIFIER_KEY]) + .map((member) => ({ id: member[IDENTIFIER_KEY] })); + ACTION_TYPES.forEach((action) => { + list[action] = listData?.[action] ? processList(listData[action]) : []; + }); + return list; +}; + +/** + * Batch the identifiers list based on the maximum number of identifiers allowed per request. + * @param {*} listData The data containing lists of members to be added or removed from the audience. + * @returns + * For MAX_IDENTIFIERS = 2 + * [ + { + "add": [ + { + "id": "test1@gmail.com" + } + ], + "remove": [ + { + "id": "test2@gmail.com" + } + ] + }, + { + "add": [ + { + "id": "test3@gmail.com" + } + ], + "remove": [] + } + ] + */ +const batchIdentifiersList = (listData) => { + const audienceList = prepareIdentifiersList(listData); + const combinedList = [ + ...audienceList.add.map((item) => ({ ...item, type: 'add' })), + ...audienceList.remove.map((item) => ({ ...item, type: 'remove' })), + ]; + + const chunkedData = _.chunk(combinedList, MAX_IDENTIFIERS); + + // Group the chunks by action type (add/remove) + const groupedData = chunkedData.map((chunk) => { + const groupedChunk = { + add: [], + remove: [], + }; + + chunk.forEach((item) => { + if (item.type === 'add') { + groupedChunk.add.push({ id: item.id }); + } else if (item.type === 'remove') { + groupedChunk.remove.push({ id: item.id }); + } + }); + + return groupedChunk; + }); + + return groupedData; +}; + +module.exports = { prepareIdentifiersList, batchIdentifiersList }; diff --git a/src/cdk/v2/destinations/launchdarkly_audience/utils.test.js b/src/cdk/v2/destinations/launchdarkly_audience/utils.test.js new file mode 100644 index 0000000000..8c06c99076 --- /dev/null +++ b/src/cdk/v2/destinations/launchdarkly_audience/utils.test.js @@ -0,0 +1,136 @@ +const { prepareIdentifiersList, batchIdentifiersList } = require('./utils'); + +jest.mock(`./config`, () => { + const originalConfig = jest.requireActual(`./config`); + return { + ...originalConfig, + MAX_IDENTIFIERS: 2, + }; +}); + +describe('Unit test cases for prepareIdentifiersList', () => { + it('should return an object with empty "add" and "remove" properties when no data is provided', () => { + const result = prepareIdentifiersList({}); + expect(result).toEqual({ add: [], remove: [] }); + }); + + it('should handle null input and return an object with empty "add" and "remove" identifiers list', () => { + const result = prepareIdentifiersList(null); + expect(result).toEqual({ add: [], remove: [] }); + }); + + it('should handle undefined input and return an object with empty "add" and "remove" identifiers list', () => { + const result = prepareIdentifiersList(undefined); + expect(result).toEqual({ add: [], remove: [] }); + }); + + it('should handle input with missing "add" or "remove" identifiers list and return an object with empty "add" and "remove" identifiers list', () => { + const result = prepareIdentifiersList({ add: [], remove: undefined }); + expect(result).toEqual({ add: [], remove: [] }); + }); + + it('should handle input with empty "add" or "remove" identifiers list and return an object with empty "add" and "remove" identifiers list', () => { + const result = prepareIdentifiersList({ add: [], remove: [] }); + expect(result).toEqual({ add: [], remove: [] }); + }); + + it('should handle input with non empty "add" or "remove" identifiers list and return an object non empty "add" and "remove" identifiers list', () => { + const result = prepareIdentifiersList({ + add: [{ identifier: 'test1@email.com' }, { identifier: 'test2@email.com' }], + remove: [{ identifier: 'test3@email.com' }], + }); + expect(result).toEqual({ + add: [{ id: 'test1@email.com' }, { id: 'test2@email.com' }], + remove: [{ id: 'test3@email.com' }], + }); + }); +}); + +describe('Unit test cases for batchIdentifiersList', () => { + it('should correctly batch a list containing both "add" and "remove" actions', () => { + const listData = { + add: [ + { identifier: 'test1@email.com' }, + { identifier: 'test2@email.com' }, + { identifier: 'test3@email.com' }, + ], + remove: [{ identifier: 'test4@email.com' }, { identifier: 'test5@email.com' }], + }; + + const expectedOutput = [ + { + add: [{ id: 'test1@email.com' }, { id: 'test2@email.com' }], + remove: [], + }, + { + add: [{ id: 'test3@email.com' }], + remove: [{ id: 'test4@email.com' }], + }, + { + add: [], + remove: [{ id: 'test5@email.com' }], + }, + ]; + + expect(batchIdentifiersList(listData)).toEqual(expectedOutput); + }); + + it('should correctly batch a list containing only "add" actions', () => { + const listData = { + add: [ + { identifier: 'test1@email.com' }, + { identifier: 'test2@email.com' }, + { identifier: 'test3@email.com' }, + ], + remove: [], + }; + + const expectedOutput = [ + { + add: [{ id: 'test1@email.com' }, { id: 'test2@email.com' }], + remove: [], + }, + { + add: [{ id: 'test3@email.com' }], + remove: [], + }, + ]; + + expect(batchIdentifiersList(listData)).toEqual(expectedOutput); + }); + + it('should correctly batch a list containing only "remove" actions', () => { + const listData = { + add: [], + remove: [ + { identifier: 'test1@email.com' }, + { identifier: 'test2@email.com' }, + { identifier: 'test3@email.com' }, + ], + }; + + const expectedOutput = [ + { + add: [], + remove: [{ id: 'test1@email.com' }, { id: 'test2@email.com' }], + }, + { + add: [], + remove: [{ id: 'test3@email.com' }], + }, + ]; + + expect(batchIdentifiersList(listData)).toEqual(expectedOutput); + }); + + it('should return an empty list for empty input list data', () => { + const listData = { + add: [{ identifier: '' }], + remove: [], + }; + + const expectedOutput = []; + + expect(batchIdentifiersList(listData)).toEqual(expectedOutput); + }); +}); diff --git a/src/cdk/v2/handler.ts b/src/cdk/v2/handler.ts index b4da9bc6bf..898e83f7b8 100644 --- a/src/cdk/v2/handler.ts +++ b/src/cdk/v2/handler.ts @@ -4,7 +4,7 @@ import { TemplateType, ExecutionBindings, StepOutput, -} from 'rudder-workflow-engine'; +} from '@rudderstack/workflow-engine'; import tags from '../../v0/util/tags'; diff --git a/src/cdk/v2/utils.ts b/src/cdk/v2/utils.ts index 096e5b7679..9d46f3dace 100644 --- a/src/cdk/v2/utils.ts +++ b/src/cdk/v2/utils.ts @@ -1,6 +1,10 @@ import path from 'path'; import fs from 'fs/promises'; -import { WorkflowExecutionError, WorkflowCreationError, StatusError } from 'rudder-workflow-engine'; +import { + WorkflowExecutionError, + WorkflowCreationError, + StatusError, +} from '@rudderstack/workflow-engine'; import logger from '../../logger'; import { generateErrorObject } from '../../v0/util'; import { PlatformError } from '../../v0/util/errorTypes'; diff --git a/src/controllers/misc.ts b/src/controllers/misc.ts index eff0eee244..92ec33f80f 100644 --- a/src/controllers/misc.ts +++ b/src/controllers/misc.ts @@ -25,4 +25,22 @@ export default class MiscController { ctx.status = 200; return ctx; } + + public static async getCPUProfile(ctx: Context) { + const { seconds } = ctx.query; + let secondsData = 10; + // if seconds is not null and is not array then parseInt + if (seconds && !Array.isArray(seconds)) { + secondsData = parseInt(seconds, 10); + } + ctx.body = await MiscService.getCPUProfile(secondsData); + ctx.status = 200; + return ctx; + } + + public static async getHeapProfile(ctx: Context) { + ctx.body = await MiscService.getHeapProfile(); + ctx.status = 200; + return ctx; + } } diff --git a/src/index.ts b/src/index.ts index 92c54befca..d1cc95cc36 100644 --- a/src/index.ts +++ b/src/index.ts @@ -7,7 +7,7 @@ import cluster from './util/cluster'; import { router } from './legacy/router'; import { testRouter } from './testRouter'; import { metricsRouter } from './routes/metricsRouter'; -import { addStatMiddleware, addRequestSizeMiddleware } from './middleware'; +import { addStatMiddleware, addRequestSizeMiddleware, initPyroscope } from './middleware'; import { logProcessInfo } from './util/utils'; import { applicationRoutes, addSwaggerRoutes } from './routes'; import { RedisDB } from './util/redis/redisConnector'; @@ -15,9 +15,11 @@ import { RedisDB } from './util/redis/redisConnector'; dotenv.config(); const clusterEnabled = process.env.CLUSTER_ENABLED !== 'false'; const useUpdatedRoutes = process.env.ENABLE_NEW_ROUTES !== 'false'; -const port = parseInt(process.env.PORT || '9090', 10); +const port = parseInt(process.env.PORT ?? '9090', 10); const metricsPort = parseInt(process.env.METRICS_PORT || '9091', 10); +initPyroscope(); + const app = new Koa(); addStatMiddleware(app); @@ -30,7 +32,6 @@ app.use( jsonLimit: '200mb', }), ); - addRequestSizeMiddleware(app); addSwaggerRoutes(app); diff --git a/src/middleware.js b/src/middleware.js index 26ba4ee3bc..53aabc90e3 100644 --- a/src/middleware.js +++ b/src/middleware.js @@ -1,5 +1,21 @@ +const Pyroscope = require('@pyroscope/nodejs'); const stats = require('./util/stats'); +function initPyroscope() { + Pyroscope.init({ + appName: 'rudder-transformer', + }); + Pyroscope.startHeapCollecting(); +} + +function getCPUProfile(seconds) { + return Pyroscope.collectCpu(seconds); +} + +function getHeapProfile() { + return Pyroscope.collectHeap(); +} + function durationMiddleware() { return async (ctx, next) => { const startTime = new Date(); @@ -45,4 +61,7 @@ function addRequestSizeMiddleware(app) { module.exports = { addStatMiddleware, addRequestSizeMiddleware, + getHeapProfile, + getCPUProfile, + initPyroscope, }; diff --git a/src/routes/misc.ts b/src/routes/misc.ts index 12ee09b8a9..3e30b9dd39 100644 --- a/src/routes/misc.ts +++ b/src/routes/misc.ts @@ -10,5 +10,7 @@ router.get('/transformerBuildVersion', MiscController.buildVersion); // depricia router.get('/buildVersion', MiscController.buildVersion); router.get('/version', MiscController.version); router.get('/features', MiscController.features); +router.get('/debug/pprof/profile', MiscController.getCPUProfile); +router.get('/debug/pprof/heap', MiscController.getHeapProfile); export const miscRoutes = router.routes(); diff --git a/src/services/misc.ts b/src/services/misc.ts index 6508ced809..2805f58584 100644 --- a/src/services/misc.ts +++ b/src/services/misc.ts @@ -3,6 +3,7 @@ import path from 'path'; import { Context } from 'koa'; import { DestHandlerMap } from '../constants/destinationCanonicalNames'; import { Metadata } from '../types'; +import { getCPUProfile, getHeapProfile, } from '../middleware'; export default class MiscService { public static getDestHandler(dest: string, version: string) { @@ -32,7 +33,7 @@ export default class MiscService { public static getMetaTags(metadata: Metadata) { if (!metadata) { - return {} + return {}; } return { sourceType: metadata.sourceType, @@ -62,4 +63,12 @@ export default class MiscService { const obj = JSON.parse(fs.readFileSync(path.resolve(__dirname, '../features.json'), 'utf8')); return JSON.stringify(obj); } + + public static async getCPUProfile(seconds: number) { + return getCPUProfile(seconds); + } + + public static async getHeapProfile() { + return getHeapProfile() + } } diff --git a/src/util/redis/redisConnector.js b/src/util/redis/redisConnector.js index 5a61e683b6..749e23ff83 100644 --- a/src/util/redis/redisConnector.js +++ b/src/util/redis/redisConnector.js @@ -32,7 +32,7 @@ const RedisDB = { log.error(`Redis is down at ${this.host}:${this.port}`); return false; // stop retrying }, - tls: {} + tls: {}, }); this.client.on('ready', () => { log.info(`Connected to redis at ${this.host}:${this.port}`); @@ -102,7 +102,7 @@ const RedisDB = { * @param {*} isValJson set to false if value is not a json object * */ - async setVal(key, value, expiryTimeInSec = 60 * 60) { + async setVal(key, value, expiryTimeInSec = process.env.REDIS_EXPIRY_TIME_IN_SEC || 3600) { try { await this.checkAndConnectConnection(); // check if redis is connected and if not, connect if (typeof value === 'object') { diff --git a/src/util/utils.js b/src/util/utils.js index ee4b0f46be..160bbae3c9 100644 --- a/src/util/utils.js +++ b/src/util/utils.js @@ -10,17 +10,22 @@ const stats = require('./stats'); const resolver = new Resolver(); -const LOCALHOST_IP = '127.0.0.1'; -const LOCALHOST_URL = `http://localhost`; +const BLOCK_HOST_NAMES = process.env.BLOCK_HOST_NAMES || ''; +const BLOCK_HOST_NAMES_LIST = BLOCK_HOST_NAMES.split(','); +const LOCAL_HOST_NAMES_LIST = ['localhost', '127.0.0.1', '[::]', '[::1]']; +const LOCALHOST_OCTET = '127.'; const RECORD_TYPE_A = 4; // ipv4 const staticLookup = (transformerVersionId) => async (hostname, _, cb) => { let ips; const resolveStartTime = new Date(); try { - ips = await resolver.resolve(hostname); + ips = await resolver.resolve4(hostname); } catch (error) { - stats.timing('fetch_dns_resolve_time', resolveStartTime, { transformerVersionId, error: 'true' }); + stats.timing('fetch_dns_resolve_time', resolveStartTime, { + transformerVersionId, + error: 'true', + }); cb(null, `unable to resolve IP address for ${hostname}`, RECORD_TYPE_A); return; } @@ -32,8 +37,8 @@ const staticLookup = (transformerVersionId) => async (hostname, _, cb) => { } for (const ip of ips) { - if (ip.includes(LOCALHOST_IP)) { - cb(null, `cannot use ${LOCALHOST_IP} as IP address`, RECORD_TYPE_A); + if (ip.startsWith(LOCALHOST_OCTET)) { + cb(null, `cannot use ${ip} as IP address`, RECORD_TYPE_A); return; } } @@ -47,8 +52,17 @@ const httpAgentWithDnsLookup = (scheme, transformerVersionId) => { }; const blockLocalhostRequests = (url) => { - if (url.includes(LOCALHOST_URL) || url.includes(LOCALHOST_IP)) { - throw new Error('localhost requests are not allowed'); + try { + const parseUrl = new URL(url); + const { hostname } = parseUrl; + if (LOCAL_HOST_NAMES_LIST.includes(hostname) || hostname.startsWith(LOCALHOST_OCTET)) { + throw new Error('localhost requests are not allowed'); + } + if (BLOCK_HOST_NAMES_LIST.includes(hostname)) { + throw new Error('blocked host requests are not allowed'); + } + } catch (error) { + throw new Error(`invalid url, ${error.message}`); } }; @@ -163,14 +177,14 @@ const extractStackTraceUptoLastSubstringMatch = (trace, stringLiterals) => { const traceLines = trace.split('\n'); let lastRelevantIndex = 0; - for(let i = traceLines.length - 1; i >= 0; i -= 1) { - if (stringLiterals.some(str => traceLines[i].includes(str))) { + for (let i = traceLines.length - 1; i >= 0; i -= 1) { + if (stringLiterals.some((str) => traceLines[i].includes(str))) { lastRelevantIndex = i; break; } } - return traceLines.slice(0, lastRelevantIndex + 1).join("\n"); + return traceLines.slice(0, lastRelevantIndex + 1).join('\n'); }; module.exports = { diff --git a/src/v0/destinations/adobe_analytics/transform.js b/src/v0/destinations/adobe_analytics/transform.js index 5daf11e62e..c477b4c93c 100644 --- a/src/v0/destinations/adobe_analytics/transform.js +++ b/src/v0/destinations/adobe_analytics/transform.js @@ -341,7 +341,7 @@ const handleTrack = (message, destinationConfig) => { let payload = null; // handle ecommerce events separately // generic events should go to the default - const event = rawEvent?.toLowerCase(); + const event = typeof rawEvent === 'string' ? rawEvent.toLowerCase() : rawEvent; switch (event) { case 'product viewed': case 'product list viewed': @@ -372,10 +372,10 @@ const handleTrack = (message, destinationConfig) => { payload = processTrackEvent(message, 'scOpen', destinationConfig); break; default: - if (destinationConfig.rudderEventsToAdobeEvents[event.toLowerCase()]) { + if (destinationConfig.rudderEventsToAdobeEvents[event]) { payload = processTrackEvent( message, - destinationConfig.rudderEventsToAdobeEvents[event.toLowerCase()].trim(), + destinationConfig.rudderEventsToAdobeEvents[event]?.trim(), destinationConfig, ); } else if (message?.properties?.overrideEventName) { diff --git a/src/v0/destinations/bqstream/util.js b/src/v0/destinations/bqstream/util.js index cc3aba78b2..2448d72d76 100644 --- a/src/v0/destinations/bqstream/util.js +++ b/src/v0/destinations/bqstream/util.js @@ -4,7 +4,10 @@ const { getDynamicErrorType, processAxiosResponse, } = require('../../../adapters/utils/networkUtils'); -const { DISABLE_DEST, REFRESH_TOKEN } = require('../../../adapters/networkhandler/authConstants'); +const { + REFRESH_TOKEN, + AUTH_STATUS_INACTIVE, +} = require('../../../adapters/networkhandler/authConstants'); const { isHttpStatusSuccess } = require('../../util'); const { proxyRequest } = require('../../../adapters/network'); const { UnhandledStatusCodeError, NetworkError, AbortedError } = require('../../util/errorTypes'); @@ -24,7 +27,7 @@ const trimBqStreamResponse = (response) => ({ * Obtains the Destination OAuth Error Category based on the error code obtained from destination * * - If an error code is such that the user will not be allowed inside the destination, - * such error codes fall under DISABLE_DESTINATION + * such error codes fall under AUTH_STATUS_INACTIVE * - If an error code is such that upon refresh we can get a new token which can be used to send event, * such error codes fall under REFRESH_TOKEN category * - If an error code doesn't fall under both categories, we can return an empty string @@ -34,7 +37,7 @@ const trimBqStreamResponse = (response) => ({ const getDestAuthCategory = (errorCategory) => { switch (errorCategory) { case 'PERMISSION_DENIED': - return DISABLE_DEST; + return AUTH_STATUS_INACTIVE; case 'UNAUTHENTICATED': return REFRESH_TOKEN; default: @@ -88,7 +91,7 @@ const getStatusAndCategory = (dresponse, status) => { * Retryable -> 5[0-9][02-9], 401(UNAUTHENTICATED) * "Special Cases": * status=200, resp.insertErrors.length > 0 === Failure - * 403 => AccessDenied -> DISABLE_DEST, other 403 => Just abort + * 403 => AccessDenied -> AUTH_STATUS_INACTIVE, other 403 => Just abort * */ const processResponse = ({ dresponse, status } = {}) => { diff --git a/src/v0/destinations/branch/transform.js b/src/v0/destinations/branch/transform.js index ae214819b2..362f6cc840 100644 --- a/src/v0/destinations/branch/transform.js +++ b/src/v0/destinations/branch/transform.js @@ -46,7 +46,11 @@ function getCategoryAndName(rudderEventName) { let requiredCategory = null; // eslint-disable-next-line array-callback-return Object.keys(category.name).find((branchKey) => { - if (branchKey.toLowerCase() === rudderEventName.toLowerCase()) { + if ( + typeof branchKey === 'string' && + typeof rudderEventName === 'string' && + branchKey.toLowerCase() === rudderEventName.toLowerCase() + ) { requiredName = category.name[branchKey]; requiredCategory = category; } diff --git a/src/v0/destinations/campaign_manager/networkHandler.js b/src/v0/destinations/campaign_manager/networkHandler.js index d324c6300b..a80fff6fe4 100644 --- a/src/v0/destinations/campaign_manager/networkHandler.js +++ b/src/v0/destinations/campaign_manager/networkHandler.js @@ -1,6 +1,5 @@ const { prepareProxyRequest, proxyRequest } = require('../../../adapters/network'); -const { isHttpStatusSuccess } = require('../../util/index'); -const { REFRESH_TOKEN } = require('../../../adapters/networkhandler/authConstants'); +const { isHttpStatusSuccess, getAuthErrCategoryFromStCode } = require('../../util/index'); const { processAxiosResponse, @@ -9,20 +8,6 @@ const { const { AbortedError, RetryableError, NetworkError } = require('../../util/errorTypes'); const tags = require('../../util/tags'); -/** - * This function helps to detarmine type of error occured. According to the response - * we set authErrorCategory to take decision if we need to refresh the access_token - * or need to disable the destination. - * @param {*} code - * @returns - */ -const getAuthErrCategory = (code) => { - if (code === 401) { - return REFRESH_TOKEN; - } - return ''; -}; - function checkIfFailuresAreRetryable(response) { try { if (Array.isArray(response.status) && Array.isArray(response.status[0].errors)) { @@ -73,7 +58,7 @@ const responseHandler = (destinationResponse) => { [tags.TAG_NAMES.ERROR_TYPE]: getDynamicErrorType(status), }, destinationResponse, - getAuthErrCategory(status), + getAuthErrCategoryFromStCode(status), ); }; diff --git a/src/v0/destinations/campaign_manager/transform.js b/src/v0/destinations/campaign_manager/transform.js index 93ec3e8ea3..99e5fe9c57 100644 --- a/src/v0/destinations/campaign_manager/transform.js +++ b/src/v0/destinations/campaign_manager/transform.js @@ -7,6 +7,7 @@ const { removeUndefinedAndNullValues, isDefinedAndNotNull, simpleProcessRouterDest, + getAccessToken, } = require('../../util'); const { @@ -17,16 +18,9 @@ const { EncryptionSource, } = require('./config'); -const { InstrumentationError, OAuthSecretError } = require('../../util/errorTypes'); +const { InstrumentationError } = require('../../util/errorTypes'); const { JSON_MIME_TYPE } = require('../../util/constant'); -const getAccessToken = ({ secret }) => { - if (!secret) { - throw new OAuthSecretError('[CAMPAIGN MANAGER (DCM)]:: OAuth - access token not found'); - } - return secret.access_token; -}; - function isEmptyObject(obj) { return Object.keys(obj).length === 0 && obj.constructor === Object; } @@ -36,7 +30,7 @@ function buildResponse(requestJson, metadata, endpointUrl, requestType, encrypti const response = defaultRequestConfig(); response.endpoint = endpointUrl; response.headers = { - Authorization: `Bearer ${getAccessToken(metadata)}`, + Authorization: `Bearer ${getAccessToken(metadata, 'access_token')}`, 'Content-Type': JSON_MIME_TYPE, }; response.method = defaultPostRequestConfig.requestMethod; diff --git a/src/v0/destinations/customerio/transform.js b/src/v0/destinations/customerio/transform.js index 1dd5b29973..5f953ee2f0 100644 --- a/src/v0/destinations/customerio/transform.js +++ b/src/v0/destinations/customerio/transform.js @@ -116,7 +116,7 @@ function processSingleMessage(message, destination) { const response = responseBuilder(message, evType, evName, destination, messageType); // replace default domain with EU data center domainc for EU based account - if (destination.Config.datacenterEU) { + if (destination.Config?.datacenter === 'EU' || destination.Config?.datacenterEU) { response.endpoint = response.endpoint.replace('track.customer.io', 'track-eu.customer.io'); } diff --git a/src/v0/destinations/fb/transform.js b/src/v0/destinations/fb/transform.js index a73bbdca8b..a6a8b71e8d 100644 --- a/src/v0/destinations/fb/transform.js +++ b/src/v0/destinations/fb/transform.js @@ -83,7 +83,11 @@ function sanityCheckPayloadForTypesAndModifications(updatedEvent) { case 'ud[ln]': case 'ud[st]': case 'ud[cn]': - if (clonedUpdatedEvent[prop] && clonedUpdatedEvent[prop] !== '') { + if ( + clonedUpdatedEvent[prop] && + typeof clonedUpdatedEvent[prop] === 'string' && + clonedUpdatedEvent[prop] !== '' + ) { isUDSet = true; clonedUpdatedEvent[prop] = sha256(clonedUpdatedEvent[prop].toLowerCase()); } @@ -105,8 +109,7 @@ function sanityCheckPayloadForTypesAndModifications(updatedEvent) { if (clonedUpdatedEvent[prop] && clonedUpdatedEvent[prop] !== '') { if (typeof clonedUpdatedEvent[prop] !== 'string') { delete clonedUpdatedEvent[prop]; - } - else { + } else { isUDSet = true; clonedUpdatedEvent[prop] = sha256( clonedUpdatedEvent[prop].toLowerCase() === 'female' ? 'f' : 'm', @@ -167,7 +170,8 @@ function getCorrectedTypedValue(pathToKey, value, originalPath) { } throw new InstrumentationError( - `${typeof originalPath === 'object' ? JSON.stringify(originalPath) : originalPath + `${ + typeof originalPath === 'object' ? JSON.stringify(originalPath) : originalPath } is not of valid type`, ); } diff --git a/src/v0/destinations/google_adwords_enhanced_conversions/config.js b/src/v0/destinations/google_adwords_enhanced_conversions/config.js index a86d0606a6..66d12c34d7 100644 --- a/src/v0/destinations/google_adwords_enhanced_conversions/config.js +++ b/src/v0/destinations/google_adwords_enhanced_conversions/config.js @@ -1,6 +1,6 @@ const { getMappingConfig } = require('../../util'); -const BASE_ENDPOINT = 'https://googleads.googleapis.com/v13/customers'; +const BASE_ENDPOINT = 'https://googleads.googleapis.com/v14/customers'; const CONFIG_CATEGORIES = { TRACK_CONFIG: { type: 'track', name: 'trackConfig' }, diff --git a/src/v0/destinations/google_adwords_enhanced_conversions/networkHandler.js b/src/v0/destinations/google_adwords_enhanced_conversions/networkHandler.js index 5349b74178..e79c568238 100644 --- a/src/v0/destinations/google_adwords_enhanced_conversions/networkHandler.js +++ b/src/v0/destinations/google_adwords_enhanced_conversions/networkHandler.js @@ -1,8 +1,10 @@ const { get, set } = require('lodash'); const sha256 = require('sha256'); const { prepareProxyRequest, handleHttpRequest } = require('../../../adapters/network'); -const { isHttpStatusSuccess } = require('../../util/index'); -const { REFRESH_TOKEN } = require('../../../adapters/networkhandler/authConstants'); +const { + isHttpStatusSuccess, + getAuthErrCategoryFromErrDetailsAndStCode, +} = require('../../util/index'); const { CONVERSION_ACTION_ID_CACHE_TTL } = require('./config'); const Cache = require('../../util/cache'); @@ -15,18 +17,6 @@ const { const { BASE_ENDPOINT } = require('./config'); const { NetworkError, NetworkInstrumentationError } = require('../../util/errorTypes'); const tags = require('../../util/tags'); -/** - * This function helps to detarmine type of error occured. According to the response - * we set authErrorCategory to take decision if we need to refresh the access_token - * or need to disable the destination. - * @param {*} code - * @param {*} response - * @returns - */ -const getAuthErrCategory = (code, response) => { - if (code === 401 && !get(response, 'error.details')) return REFRESH_TOKEN; - return ''; -}; /** * This function is used for collecting the conversionActionId using the conversion name @@ -68,7 +58,7 @@ const getConversionActionId = async (method, headers, params) => { [tags.TAG_NAMES.ERROR_TYPE]: getDynamicErrorType(gaecConversionActionIdResponse.status), }, gaecConversionActionIdResponse.response, - getAuthErrCategory( + getAuthErrCategoryFromErrDetailsAndStCode( get(gaecConversionActionIdResponse, 'status'), get(gaecConversionActionIdResponse, 'response[0].error.message'), ), @@ -134,7 +124,7 @@ const responseHandler = (destinationResponse) => { [tags.TAG_NAMES.ERROR_TYPE]: getDynamicErrorType(status), }, response, - getAuthErrCategory(status, response), + getAuthErrCategoryFromErrDetailsAndStCode(status, response), ); }; // eslint-disable-next-line func-names diff --git a/src/v0/destinations/google_adwords_enhanced_conversions/transform.js b/src/v0/destinations/google_adwords_enhanced_conversions/transform.js index 96ef089001..24993a3006 100644 --- a/src/v0/destinations/google_adwords_enhanced_conversions/transform.js +++ b/src/v0/destinations/google_adwords_enhanced_conversions/transform.js @@ -8,12 +8,12 @@ const { getValueFromMessage, removeHyphens, simpleProcessRouterDest, + getAccessToken, } = require('../../util'); const { InstrumentationError, ConfigurationError, - OAuthSecretError, } = require('../../util/errorTypes'); const { trackMapping, BASE_ENDPOINT } = require('./config'); @@ -36,34 +36,13 @@ const updateMappingJson = (mapping) => { 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; - // we would need to verify if secret is present and also if the access token field is present in secret - if (!secret || !secret.access_token) { - throw new OAuthSecretError('Empty/Invalid access token'); - } - 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); + const accessToken = getAccessToken(metadata, 'access_token'); response.headers = { Authorization: `Bearer ${accessToken}`, 'Content-Type': JSON_MIME_TYPE, diff --git a/src/v0/destinations/google_adwords_offline_conversions/config.js b/src/v0/destinations/google_adwords_offline_conversions/config.js index 1d77af02e6..a02732894f 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 = 'v13'; +const API_VERSION = 'v14'; const BASE_ENDPOINT = `https://googleads.googleapis.com/${API_VERSION}/customers/:customerId`; diff --git a/src/v0/destinations/google_adwords_offline_conversions/networkHandler.js b/src/v0/destinations/google_adwords_offline_conversions/networkHandler.js index 963721f024..71fdccff20 100644 --- a/src/v0/destinations/google_adwords_offline_conversions/networkHandler.js +++ b/src/v0/destinations/google_adwords_offline_conversions/networkHandler.js @@ -2,11 +2,11 @@ const set = require('set-value'); const get = require('get-value'); const sha256 = require('sha256'); const { prepareProxyRequest, httpSend, httpPOST } = require('../../../adapters/network'); -const { REFRESH_TOKEN } = require('../../../adapters/networkhandler/authConstants'); const { isHttpStatusSuccess, getHashFromArray, isDefinedAndNotNullAndNotEmpty, + getAuthErrCategoryFromStCode, } = require('../../util'); const { getConversionActionId } = require('./utils'); const Cache = require('../../util/cache'); @@ -24,21 +24,6 @@ const tags = require('../../util/tags'); const conversionCustomVariableCache = new Cache(CONVERSION_CUSTOM_VARIABLE_CACHE_TTL); -/** - * This function helps to determine the type of error occurred. We set the authErrorCategory - * as per the destination response that is received and take the decision whether - * to refresh the access_token or disable the destination. - * @param {*} status - * @returns - */ -const getAuthErrCategory = (status) => { - if (status === 401) { - // UNAUTHORIZED - return REFRESH_TOKEN; - } - return ''; -}; - const createJob = async (endpoint, headers, payload) => { const endPoint = `${endpoint}:create`; let createJobResponse = await httpPOST( @@ -57,7 +42,7 @@ const createJob = async (endpoint, headers, payload) => { `[Google Ads Offline Conversions]:: ${response?.error?.message} during google_ads_offline_store_conversions Job Creation`, status, response, - getAuthErrCategory(status), + getAuthErrCategoryFromStCode(status), ); } return response.resourceName.split('/')[3]; @@ -80,7 +65,7 @@ const addConversionToJob = async (endpoint, headers, jobId, payload) => { `[Google Ads Offline Conversions]:: ${addConversionToJobResponse.response?.error?.message} during google_ads_offline_store_conversions Add Conversion`, addConversionToJobResponse.status, addConversionToJobResponse.response, - getAuthErrCategory(get(addConversionToJobResponse, 'status')), + getAuthErrCategoryFromStCode(get(addConversionToJobResponse, 'status')), ); } return true; @@ -131,7 +116,7 @@ const getConversionCustomVariable = async (headers, params) => { [tags.TAG_NAMES.ERROR_TYPE]: getDynamicErrorType(searchStreamResponse.status), }, searchStreamResponse?.response || searchStreamResponse, - getAuthErrCategory(searchStreamResponse.status), + getAuthErrCategoryFromStCode(searchStreamResponse.status), ); } const conversionCustomVariable = get(searchStreamResponse, 'response.0.results'); @@ -292,7 +277,7 @@ const responseHandler = (destinationResponse) => { `[Google Ads Offline Conversions]:: ${response?.error?.message} during google_ads_offline_conversions response transformation`, status, response, - getAuthErrCategory(status), + getAuthErrCategoryFromStCode(status), ); }; diff --git a/src/v0/destinations/google_adwords_offline_conversions/utils.js b/src/v0/destinations/google_adwords_offline_conversions/utils.js index 6131b5dde7..37f17c9fd0 100644 --- a/src/v0/destinations/google_adwords_offline_conversions/utils.js +++ b/src/v0/destinations/google_adwords_offline_conversions/utils.js @@ -11,8 +11,9 @@ const { getFieldValueFromMessage, isDefinedAndNotNullAndNotEmpty, isDefinedAndNotNull, + getAuthErrCategoryFromStCode, + getAccessToken, } = require('../../util'); -const { REFRESH_TOKEN } = require('../../../adapters/networkhandler/authConstants'); const { SEARCH_STREAM, CONVERSION_ACTION_ID_CACHE_TTL, @@ -26,7 +27,6 @@ const { processAxiosResponse } = require('../../../adapters/utils/networkUtils') const Cache = require('../../util/cache'); const { AbortedError, - OAuthSecretError, ConfigurationError, InstrumentationError, } = require('../../util/errorTypes'); @@ -43,34 +43,6 @@ const validateDestinationConfig = ({ Config }) => { } }; -/** - * for OAuth destination - * get access_token from metadata.secret{ ... } - * @param {*} param0 - * @returns - */ -const getAccessToken = ({ secret }) => { - if (!secret) { - throw new OAuthSecretError('OAuth - access token not found'); - } - return secret.access_token; -}; - -/** - * This function helps to determine the type of error occured. We set the authErrorCategory - * as per the destination response that is received and take the decision whether - * to refresh the access_token or disable the destination. - * @param {*} status - * @returns - */ -const getAuthErrCategory = (status) => { - if (status === 401) { - // UNAUTHORIZED - return REFRESH_TOKEN; - } - return ''; -}; - /** * get conversionAction using the conversion name using searchStream endpoint * @param {*} customerId @@ -100,7 +72,7 @@ const getConversionActionId = async (headers, params) => { )} during google_ads_offline_conversions response transformation`, searchStreamResponse.status, searchStreamResponse.response, - getAuthErrCategory(get(searchStreamResponse, 'status')), + getAuthErrCategoryFromStCode(get(searchStreamResponse, 'status')), ); } const conversionAction = get( @@ -194,7 +166,7 @@ const requestBuilder = ( } response.body.JSON = payload; response.headers = { - Authorization: `Bearer ${getAccessToken(metadata)}`, + Authorization: `Bearer ${getAccessToken(metadata, 'access_token')}`, 'Content-Type': 'application/json', 'developer-token': get(metadata, 'secret.developer_token'), }; @@ -390,7 +362,6 @@ const getClickConversionPayloadAndEndpoint = (message, Config, filteredCustomerI module.exports = { validateDestinationConfig, generateItemListFromProducts, - getAccessToken, getConversionActionId, removeHashToSha256TypeFromMappingJson, getStoreConversionPayload, 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 775e123cfe..8deaa3ab0a 100644 --- a/src/v0/destinations/google_adwords_offline_conversions/utils.test.js +++ b/src/v0/destinations/google_adwords_offline_conversions/utils.test.js @@ -161,7 +161,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/v13/customers/9625812972:uploadClickConversions', + endpoint: 'https://googleads.googleapis.com/v14/customers/9625812972:uploadClickConversions', payload: { conversions: [ { @@ -187,7 +187,7 @@ describe('getClickConversionPayloadAndEndpoint util tests', () => { delete fittingPayload.traits.email; delete fittingPayload.properties.email; let expectedOutput = { - endpoint: 'https://googleads.googleapis.com/v13/customers/9625812972:uploadClickConversions', + endpoint: 'https://googleads.googleapis.com/v14/customers/9625812972:uploadClickConversions', payload: { conversions: [ { @@ -215,7 +215,7 @@ describe('getClickConversionPayloadAndEndpoint util tests', () => { delete fittingPayload.traits.phone; delete fittingPayload.properties.email; let expectedOutput = { - endpoint: 'https://googleads.googleapis.com/v13/customers/9625812972:uploadClickConversions', + endpoint: 'https://googleads.googleapis.com/v14/customers/9625812972:uploadClickConversions', payload: { conversions: [ { @@ -251,7 +251,7 @@ describe('getClickConversionPayloadAndEndpoint util tests', () => { }, ]; let expectedOutput = { - endpoint: 'https://googleads.googleapis.com/v13/customers/9625812972:uploadClickConversions', + endpoint: 'https://googleads.googleapis.com/v14/customers/9625812972:uploadClickConversions', payload: { conversions: [ { diff --git a/src/v0/destinations/google_adwords_remarketing_lists/config.js b/src/v0/destinations/google_adwords_remarketing_lists/config.js index 902ac1cbff..94059c69f1 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 BASE_ENDPOINT = 'https://googleads.googleapis.com/v13/customers'; +const BASE_ENDPOINT = 'https://googleads.googleapis.com/v14/customers'; const CONFIG_CATEGORIES = { AUDIENCE_LIST: { type: 'audienceList', name: 'offlineDataJobs' }, ADDRESSINFO: { type: 'addressInfo', name: 'addressInfo' }, diff --git a/src/v0/destinations/google_adwords_remarketing_lists/networkHandler.js b/src/v0/destinations/google_adwords_remarketing_lists/networkHandler.js index ceea51f6a2..979f263fcc 100644 --- a/src/v0/destinations/google_adwords_remarketing_lists/networkHandler.js +++ b/src/v0/destinations/google_adwords_remarketing_lists/networkHandler.js @@ -1,7 +1,8 @@ const { httpSend, prepareProxyRequest } = require('../../../adapters/network'); -const { isHttpStatusSuccess } = require('../../util/index'); - -const { REFRESH_TOKEN } = require('../../../adapters/networkhandler/authConstants'); +const { + isHttpStatusSuccess, + getAuthErrCategoryFromErrDetailsAndStCode, +} = require('../../util/index'); const { processAxiosResponse, @@ -117,19 +118,6 @@ const gaAudienceProxyRequest = async (request) => { return thirdResponse; }; -/** - * This function helps to detarmine type of error occured. According to the response - * we set authErrorCategory to take decision if we need to refresh the access_token - * or need to disable the destination. - * @param {*} code - * @param {*} response - * @returns - */ -const getAuthErrCategory = (code, response) => { - if (code === 401 && !response.error.details) return REFRESH_TOKEN; - return ''; -}; - const gaAudienceRespHandler = (destResponse, stageMsg) => { const { status, response } = destResponse; // const respAttributes = response["@attributes"] || null; @@ -142,7 +130,7 @@ const gaAudienceRespHandler = (destResponse, stageMsg) => { [tags.TAG_NAMES.ERROR_TYPE]: getDynamicErrorType(status), }, response, - getAuthErrCategory(status, response), + getAuthErrCategoryFromErrDetailsAndStCode(status, response), ); }; diff --git a/src/v0/destinations/google_adwords_remarketing_lists/transform.js b/src/v0/destinations/google_adwords_remarketing_lists/transform.js index e847e9f72a..f8cd7c7037 100644 --- a/src/v0/destinations/google_adwords_remarketing_lists/transform.js +++ b/src/v0/destinations/google_adwords_remarketing_lists/transform.js @@ -1,6 +1,6 @@ const sha256 = require('sha256'); -const logger = require('../../../logger'); const get = require('get-value'); +const logger = require('../../../logger'); const { isDefinedAndNotNullAndNotEmpty, returnArrayOfSubarrays, @@ -11,13 +11,10 @@ const { removeHyphens, simpleProcessRouterDest, getDestinationExternalIDInfoForRetl, + getAccessToken, } = require('../../util'); -const { - InstrumentationError, - ConfigurationError, - OAuthSecretError, -} = require('../../util/errorTypes'); +const { InstrumentationError, ConfigurationError } = require('../../util/errorTypes'); const { offlineDataJobsMapping, addressInfoMapping, @@ -38,27 +35,6 @@ const hashEncrypt = (object) => { }); }; -/** - * 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; - // we would need to verify if secret is present and also if the access token field is present in secret - if (!secret || !secret.access_token) { - throw new OAuthSecretError('Empty/Invalid access token'); - } - 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 @@ -73,11 +49,14 @@ const responseBuilder = (metadata, body, { Config }, message) => { const filteredCustomerId = removeHyphens(Config.customerId); response.endpoint = `${BASE_ENDPOINT}/${filteredCustomerId}/offlineUserDataJobs`; response.body.JSON = removeUndefinedAndNullValues(payload); - const accessToken = getAccessToken(metadata); + const accessToken = getAccessToken(metadata, 'access_token'); let operationAudienceId = Config.audienceId || Config.listId; const mappedToDestination = get(message, MappedToDestinationKey); if (!operationAudienceId && mappedToDestination) { - const { objectType } = getDestinationExternalIDInfoForRetl(message, 'GOOGLE_ADWORDS_REMARKETING_LISTS'); + const { objectType } = getDestinationExternalIDInfoForRetl( + message, + 'GOOGLE_ADWORDS_REMARKETING_LISTS', + ); operationAudienceId = objectType; } if (!isDefinedAndNotNullAndNotEmpty(operationAudienceId)) { diff --git a/src/v0/destinations/hs/util.js b/src/v0/destinations/hs/util.js index 63c3eb118f..11f7a892d5 100644 --- a/src/v0/destinations/hs/util.js +++ b/src/v0/destinations/hs/util.js @@ -429,7 +429,9 @@ const getEventAndPropertiesFromConfig = (message, destination, payload) => { }); if (!hubspotEventFound) { - throw new ConfigurationError(`'${event}' event name not found`); + throw new ConfigurationError( + `Event name '${event}' mappings are not configured in the destination`, + ); } // 2. fetch event properties from webapp config diff --git a/src/v0/destinations/iterable/data/IterableTrackConfig.json b/src/v0/destinations/iterable/data/IterableTrackConfig.json index 1a751e2fe4..28fdcaecc7 100644 --- a/src/v0/destinations/iterable/data/IterableTrackConfig.json +++ b/src/v0/destinations/iterable/data/IterableTrackConfig.json @@ -21,6 +21,11 @@ ], "required": false }, + { + "destKey": "id", + "sourceKeys": ["properties.id", "properties.event_id"], + "required": false + }, { "destKey": "eventName", "sourceKeys": "event", diff --git a/src/v0/destinations/iterable/data/IterableTrackPurchaseConfig.json b/src/v0/destinations/iterable/data/IterableTrackPurchaseConfig.json index 08014dec3f..00e83d0125 100644 --- a/src/v0/destinations/iterable/data/IterableTrackPurchaseConfig.json +++ b/src/v0/destinations/iterable/data/IterableTrackPurchaseConfig.json @@ -6,7 +6,12 @@ }, { "destKey": "id", - "sourceKeys": "properties.orderId", + "sourceKeys": [ + "properties.order_id", + "properties.orderId", + "properties.id", + "properties.event_id" + ], "required": false }, { diff --git a/src/v0/destinations/iterable/transform.js b/src/v0/destinations/iterable/transform.js index 907030db9f..af666044d3 100644 --- a/src/v0/destinations/iterable/transform.js +++ b/src/v0/destinations/iterable/transform.js @@ -1,7 +1,6 @@ const _ = require('lodash'); const get = require('get-value'); const { - batchEvents, getCatalogEndpoint, hasMultipleResponses, pageEventPayloadBuilder, @@ -23,6 +22,7 @@ const { handleRtTfSingleEventError, removeUndefinedAndNullValues, getDestinationExternalIDInfoForRetl, + groupEventsByType: batchEvents, } = require('../../util'); const { JSON_MIME_TYPE } = require('../../util/constant'); const { mappingConfig, ConfigCategory } = require('./config'); diff --git a/src/v0/destinations/iterable/util.js b/src/v0/destinations/iterable/util.js index abff7f2838..3fe793d561 100644 --- a/src/v0/destinations/iterable/util.js +++ b/src/v0/destinations/iterable/util.js @@ -736,41 +736,7 @@ const filterEventsAndPrepareBatchRequests = (transformedEvents) => { return prepareBatchRequests(filteredEvents); }; -/** - * Groups events with the same message type together in batches. - * Each batch contains events that have the same message type and are from different users. - * - * @param {Array} inputs - An array of events - * @returns {Array} - An array of batches - */ -const batchEvents = (inputs) => { - const batches = []; - let currentInputsArray = inputs; - while (currentInputsArray.length > 0) { - const remainingInputsArray = []; - const userOrderTracker = {}; - const event = currentInputsArray.shift(); - const messageType = event.message.type; - const batch = [event]; - currentInputsArray.forEach((currentInput) => { - const currentMessageType = currentInput.message.type; - const currentUser = currentInput.metadata.userId; - if (currentMessageType === messageType && !userOrderTracker[currentUser]) { - batch.push(currentInput); - } else { - remainingInputsArray.push(currentInput); - userOrderTracker[currentUser] = true; - } - }); - batches.push(batch); - currentInputsArray = remainingInputsArray; - } - - return batches; -}; - module.exports = { - batchEvents, getCatalogEndpoint, hasMultipleResponses, pageEventPayloadBuilder, diff --git a/src/v0/destinations/iterable/util.test.js b/src/v0/destinations/iterable/util.test.js index e7a1ea5862..098960ac77 100644 --- a/src/v0/destinations/iterable/util.test.js +++ b/src/v0/destinations/iterable/util.test.js @@ -1,5 +1,4 @@ const { - batchEvents, pageEventPayloadBuilder, trackEventPayloadBuilder, screenEventPayloadBuilder, @@ -108,103 +107,6 @@ const getTestEcommMessage = () => { return message; }; -const orderEventsFuncData = [ - { - inputs: [ - { message: { type: 'identify' }, metadata: { userId: '1' } }, - { message: { type: 'track' }, metadata: { userId: '1' } }, - { message: { type: 'identify' }, metadata: { userId: '2' } }, - { message: { type: 'track' }, metadata: { userId: '2' } }, - { message: { type: 'track' }, metadata: { userId: '2' } }, - { message: { type: 'identify' }, metadata: { userId: '3' } }, - { message: { type: 'track' }, metadata: { userId: '3' } }, - { message: { type: 'identify' }, metadata: { userId: '4' } }, - { message: { type: 'track' }, metadata: { userId: '4' } }, - { message: { type: 'identify' }, metadata: { userId: '5' } }, - { message: { type: 'track' }, metadata: { userId: '5' } }, - { message: { type: 'identify' }, metadata: { userId: '5' } }, - { message: { type: 'identify' }, metadata: { userId: '6' } }, - { message: { type: 'identify' }, metadata: { userId: '6' } }, - { message: { type: 'identify' }, metadata: { userId: '6' } }, - ], - output: [ - [ - { message: { type: 'identify' }, metadata: { userId: '1' } }, - { message: { type: 'identify' }, metadata: { userId: '2' } }, - { message: { type: 'identify' }, metadata: { userId: '3' } }, - { message: { type: 'identify' }, metadata: { userId: '4' } }, - { message: { type: 'identify' }, metadata: { userId: '5' } }, - { message: { type: 'identify' }, metadata: { userId: '6' } }, - { message: { type: 'identify' }, metadata: { userId: '6' } }, - { message: { type: 'identify' }, metadata: { userId: '6' } }, - ], - [ - { message: { type: 'track' }, metadata: { userId: '1' } }, - { message: { type: 'track' }, metadata: { userId: '2' } }, - { message: { type: 'track' }, metadata: { userId: '2' } }, - { message: { type: 'track' }, metadata: { userId: '3' } }, - { message: { type: 'track' }, metadata: { userId: '4' } }, - { message: { type: 'track' }, metadata: { userId: '5' } }, - ], - [ - { message: { type: 'identify' }, metadata: { userId: '5' } }, - ] - ] - }, - { - inputs: [ - { message: { type: 'track' }, metadata: { userId: '3' } }, - { message: { type: 'identify' }, metadata: { userId: '3' } }, - { message: { type: 'identify' }, metadata: { userId: '1' } }, - { message: { type: 'track' }, metadata: { userId: '1' } }, - { message: { type: 'identify' }, metadata: { userId: '5' } }, - { message: { type: 'track' }, metadata: { userId: '5' } }, - { message: { type: 'identify' }, metadata: { userId: '5' } }, - { message: { type: 'identify' }, metadata: { userId: '2' } }, - { message: { type: 'track' }, metadata: { userId: '2' } }, - { message: { type: 'track' }, metadata: { userId: '2' } }, - { message: { type: 'track' }, metadata: { userId: '4' } }, - { message: { type: 'identify' }, metadata: { userId: '4' } }, - { message: { type: 'identify' }, metadata: { userId: '6' } }, - { message: { type: 'identify' }, metadata: { userId: '6' } }, - { message: { type: 'identify' }, metadata: { userId: '6' } }, - ], - output: [ - [ - { message: { type: 'track' }, metadata: { userId: '3' } }, - { message: { type: 'track' }, metadata: { userId: '4' } }, - ], - [ - { message: { type: 'identify' }, metadata: { userId: '3' } }, - { message: { type: 'identify' }, metadata: { userId: '1' } }, - { message: { type: 'identify' }, metadata: { userId: '5' } }, - { message: { type: 'identify' }, metadata: { userId: '2' } }, - { message: { type: 'identify' }, metadata: { userId: '4' } }, - { message: { type: 'identify' }, metadata: { userId: '6' } }, - { message: { type: 'identify' }, metadata: { userId: '6' } }, - { message: { type: 'identify' }, metadata: { userId: '6' } }, - ], - [ - { message: { type: 'track' }, metadata: { userId: '1' } }, - { message: { type: 'track' }, metadata: { userId: '5' } }, - { message: { type: 'track' }, metadata: { userId: '2' } }, - { message: { type: 'track' }, metadata: { userId: '2' } }, - ], - [ - { message: { type: 'identify' }, metadata: { userId: '5' } }, - ] - ] - } -] - -describe('Order Event Tests', () => { - it('Order Event func tests', () => { - orderEventsFuncData.forEach((data) => { - expect(batchEvents(data.inputs)).toEqual(data.output); - }) - }); -}); - describe('iterable utils test', () => { describe('Unit test cases for iterable registerDeviceTokenEventPayloadBuilder', () => { it('for no device type', async () => { diff --git a/src/v0/destinations/klaviyo/transform.js b/src/v0/destinations/klaviyo/transform.js index d7170ce789..bb19c5f8fd 100644 --- a/src/v0/destinations/klaviyo/transform.js +++ b/src/v0/destinations/klaviyo/transform.js @@ -42,9 +42,10 @@ const { JSON_MIME_TYPE } = require('../../util/constant'); /** * Main Identify request handler func * The function is used to create/update new users and also for adding/subscribing - * members to the list depending on conditons.If listId is there member is added to that list & - * if subscribe is true member is subscribed to that list else not. - * DOCS: https://www.klaviyo.com/docs/http-api + * users to the list. + * DOCS: 1. https://developers.klaviyo.com/en/v2023-02-22/reference/create_profile + * 2. https://developers.klaviyo.com/en/v2023-02-22/reference/update_profile + * 3. https://developers.klaviyo.com/en/v2023-02-22/reference/subscribe_profiles * @param {*} message * @param {*} category * @param {*} destination @@ -123,7 +124,7 @@ const identifyRequestHandler = async (message, category, destination) => { // ---------------------- // 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 +// DOCS: https://developers.klaviyo.com/en/v2023-02-22/reference/create_event // ---------------------- const trackRequestHandler = (message, category, destination) => { @@ -138,10 +139,6 @@ const trackRequestHandler = (message, category, destination) => { attributes.metric = { name: eventName }; const categ = CONFIG_CATEGORIES[eventMap]; attributes.properties = constructPayload(message.properties, MAPPING_CONFIG[categ.name]); - attributes.properties = { - ...attributes.properties, - ...populateCustomFieldsFromTraits(message), - }; // products mapping using Items.json // mapping properties.items to payload.properties.items and using properties.products as a fallback to properties.items @@ -191,17 +188,21 @@ const trackRequestHandler = (message, category, destination) => { if (value) { attributes.value = value; } - attributes.properties = { - ...attributes.properties, - ...populateCustomFieldsFromTraits(message), - }; } // if flattenProperties is enabled from UI, flatten the event properties attributes.properties = flattenProperties ? flattenJson(attributes.properties, '.', 'normal', false) : attributes.properties; // Map user properties to profile object - attributes.profile = createCustomerProperties(message, destination.Config); + attributes.profile = { + ...createCustomerProperties(message, destination.Config), + ...populateCustomFieldsFromTraits(message), + }; + + attributes.profile = flattenProperties + ? flattenJson(attributes.profile, '.', 'normal', false) + : attributes.profile; + if (message.timestamp) { attributes.time = message.timestamp; } @@ -222,9 +223,9 @@ const trackRequestHandler = (message, category, destination) => { // ---------------------- // Main handlerfunc for group request -// we will map user to list (subscribe and/or member) +// we will add/subscribe users to the list // based on property sent -// DOCS: https://www.klaviyo.com/docs/api/v2/lists +// DOCS: https://developers.klaviyo.com/en/v2023-02-22/reference/subscribe_profiles // ---------------------- const groupRequestHandler = (message, category, destination) => { if (!message.groupId) { diff --git a/src/v0/destinations/klaviyo/util.js b/src/v0/destinations/klaviyo/util.js index 8fb9f0e875..3c4882b834 100644 --- a/src/v0/destinations/klaviyo/util.js +++ b/src/v0/destinations/klaviyo/util.js @@ -96,7 +96,7 @@ const profileUpdateResponseBuilder = (payload, profileId, category, privateApiKe /** * This function is used for creating response for subscribing users to a particular list. - * DOCS: https://www.klaviyo.com/docs/api/v2/lists + * DOCS: https://developers.klaviyo.com/en/v2023-02-22/reference/subscribe_profiles */ const subscribeUserToList = (message, traitsInfo, destination) => { // listId from message properties are preferred over Config listId diff --git a/src/v0/destinations/marketo/util.js b/src/v0/destinations/marketo/util.js index ab39aafc15..0de14e2072 100644 --- a/src/v0/destinations/marketo/util.js +++ b/src/v0/destinations/marketo/util.js @@ -19,6 +19,8 @@ const tags = require('../../util/tags'); * https://developers.marketo.com/rest-api/error-codes/ */ +const ERROR_CODE_TO_PASS = ['1015']; + const MARKETO_RETRYABLE_CODES = ['601', '602', '604', '611']; const MARKETO_ABORTABLE_CODES = [ '600', @@ -34,29 +36,28 @@ const MARKETO_ABORTABLE_CODES = [ ]; const MARKETO_THROTTLED_CODES = ['502', '606', '607', '608', '615']; -const RECORD_LEVEL_ABORTBALE_ERRORS = [ - '1001', - '1002', - '1003', - '1004', - '1005', - '1006', - '1007', - '1008', - '1011', - '1013', - '1014', - '1015', - '1016', - '1017', - '1018', - '1021', - '1026', - '1027', - '1028', - '1036', - '1049', -]; +// Keeping here for reference const RECORD_LEVEL_ABORTBALE_ERRORS = [ +// '1001', +// '1002', +// '1003', +// '1004', +// '1005', +// '1006', +// '1007', +// '1008', +// '1011', +// '1013', +// '1014', +// '1016', +// '1017', +// '1018', +// '1021', +// '1026', +// '1027', +// '1028', +// '1036', +// '1049', +// ]; const { DESTINATION } = require('./config'); const logger = require('../../../logger'); @@ -86,7 +87,7 @@ const marketoApplicationErrorHandler = (marketoResponse, sourceMessage, destinat }; /** * this function checks the status of individual responses and throws error if any - * response ststus does not match the expected status + * response status does not match the expected status * doc1: https://developers.marketo.com/rest-api/lead-database/custom-objects/#create_and_update * doc2: https://developers.marketo.com/rest-api/lead-database/#create_and_update * Structure of marketoResponse: { @@ -122,20 +123,32 @@ const marketoApplicationErrorHandler = (marketoResponse, sourceMessage, destinat const nestedResponseHandler = (marketoResponse, sourceMessage) => { const checkStatus = (res) => { const { status } = res; - if (status && status !== 'updated' && status !== 'created' && status !== 'added') { + const allowedStatus = ['updated', 'added', 'removed', 'created']; + if ( + status && + !allowedStatus.includes(status) + // we need to check the case where the id are not in list + ) { const { reasons } = res; let statusCode = 400; - if (reasons && RECORD_LEVEL_ABORTBALE_ERRORS.includes(reasons[0].code)) { - statusCode = 400; - } else if (reasons && MARKETO_ABORTABLE_CODES.includes(reasons[0].code)) { - statusCode = 400; - } else if (reasons && MARKETO_THROTTLED_CODES.includes(reasons[0].code)) { - statusCode = 429; - } else if (reasons && MARKETO_RETRYABLE_CODES.includes(reasons[0].code)) { - statusCode = 500; + if (reasons) { + const errorCodesFromDest = reasons.map((reason) => reason.code); + const filteredErrorCode = errorCodesFromDest.find( + (errorCode) => !ERROR_CODE_TO_PASS.includes(errorCode), + ); + if (!filteredErrorCode) { + return; + } + if (MARKETO_THROTTLED_CODES.includes(filteredErrorCode)) { + statusCode = 429; + } else if (MARKETO_RETRYABLE_CODES.includes(filteredErrorCode)) { + statusCode = 500; + } } throw new InstrumentationError( - `Request failed during: ${sourceMessage}, error: ${JSON.stringify(reasons)}`, + `Request failed during: ${sourceMessage}, error: ${ + JSON.stringify(reasons) || 'Reason(s) not Found' + }`, statusCode, { [tags.TAG_NAMES.ERROR_TYPE]: getDynamicErrorType(statusCode), diff --git a/src/v0/destinations/marketo_bulk_upload/fileUpload.js b/src/v0/destinations/marketo_bulk_upload/fileUpload.js index 40b3c64a20..2c77cd6e29 100644 --- a/src/v0/destinations/marketo_bulk_upload/fileUpload.js +++ b/src/v0/destinations/marketo_bulk_upload/fileUpload.js @@ -6,8 +6,9 @@ const { getMarketoFilePath, handleFileUploadResponse, getFieldSchemaMap, + hydrateStatusForServer, } = require('./util'); -const { isHttpStatusSuccess, hydrateStatusForServer } = require('../../util'); +const { isHttpStatusSuccess } = require('../../util'); const { MARKETO_FILE_SIZE, UPLOAD_FILE } = require('./config'); const { getHashFromArray, @@ -249,7 +250,7 @@ const responseHandler = async (input, config) => { const response = { statusCode: 200, importId, - metadata + metadata, }; return response; } diff --git a/src/v0/destinations/mp/transform.js b/src/v0/destinations/mp/transform.js index 0cb06aad93..6f31c5b2ab 100644 --- a/src/v0/destinations/mp/transform.js +++ b/src/v0/destinations/mp/transform.js @@ -1,3 +1,4 @@ +const _ = require('lodash'); const get = require('get-value'); const { EventType } = require('../../../constants'); const { @@ -14,9 +15,7 @@ const { getFieldValueFromMessage, checkInvalidRtTfEvents, handleRtTfSingleEventError, - batchMultiplexedEvents, - getSuccessRespEvents, - defaultBatchRequestConfig, + groupEventsByType, } = require('../../util'); const { ConfigCategory, @@ -32,6 +31,8 @@ const { createIdentifyResponse, isImportAuthCredentialsAvailable, combineBatchRequestsWithSameJobIds, + groupEventsByEndpoint, + batchEvents, } = require('./util'); const { InstrumentationError, ConfigurationError } = require('../../util/errorTypes'); const { CommonUtils } = require('../../../util/common'); @@ -130,6 +131,37 @@ const processRevenueEvents = (message, destination, revenueValue) => { return responseBuilderSimple(payload, message, 'revenue', destination.Config); }; +/** + * This function is used to process the incremental properties + * ref :- https://developer.mixpanel.com/reference/profile-numerical-add + * @param {*} message + * @param {*} destination + * @param {*} propIncrements + * @returns + */ +const processIncrementalProperties = (message, destination, propIncrements) => { + const payload = { + $add: {}, + $token: destination.Config.token, + $distinct_id: message.userId || message.anonymousId, + }; + + if (destination?.Config.identityMergeApi === 'simplified') { + payload.$distinct_id = message.userId || `$device:${message.anonymousId}`; + } + + Object.keys(message.properties).forEach((prop) => { + const value = message.properties[prop]; + if (value && propIncrements.includes(prop)) { + payload.$add[prop] = value; + } + }); + + return Object.keys(payload.$add).length > 0 + ? responseBuilderSimple(payload, message, 'incremental_properties', destination.Config) + : null; +}; + const getEventValueForTrackEvent = (message, destination) => { const mappedProperties = constructPayload(message, mPEventPropertiesConfigJson); // This is to conform with SDKs sending timestamp component with messageId @@ -178,6 +210,14 @@ const processTrack = (message, destination) => { if (revenue) { returnValue.push(processRevenueEvents(message, destination, revenue)); } + + if (Array.isArray(destination.Config.propIncrements)) { + const propIncrements = destination.Config.propIncrements.map((item) => item.property); + const response = processIncrementalProperties(message, destination, propIncrements); + if (response) { + returnValue.push(response); + } + } returnValue.push(getEventValueForTrackEvent(message, destination)); return returnValue; }; @@ -339,29 +379,7 @@ const processGroupEvents = (message, type, destination) => { return returnValue; }; -const generateBatchedPayloadForArray = (events) => { - const { batchedRequest } = defaultBatchRequestConfig(); - const batchResponseList = events.flatMap((event) => JSON.parse(event.body.JSON_ARRAY.batch)); - batchedRequest.body.JSON_ARRAY = { batch: JSON.stringify(batchResponseList) }; - batchedRequest.endpoint = events[0].endpoint; - batchedRequest.headers = events[0].headers; - batchedRequest.params = events[0].params; - return batchedRequest; -}; - -const batchEvents = (successRespList, maxBatchSize) => { - const batchResponseList = []; - const batchedEvents = batchMultiplexedEvents(successRespList, maxBatchSize); - batchedEvents.forEach((batch) => { - const batchedRequest = generateBatchedPayloadForArray(batch.events); - batchResponseList.push( - getSuccessRespEvents(batchedRequest, batch.metadata, batch.destination, true), - ); - }); - return batchResponseList; -}; - -const processSingleMessage = async (message, destination) => { +const processSingleMessage = (message, destination) => { const clonedMessage = { ...message }; if (clonedMessage.userId) { clonedMessage.userId = String(clonedMessage.userId); @@ -392,74 +410,7 @@ const processSingleMessage = async (message, destination) => { } }; -const process = async (event) => processSingleMessage(event.message, event.destination); - -const processEvents = async (inputs, reqMetadata) => - await Promise.all( - inputs.map(async (event) => { - try { - if (event.message.statusCode) { - // already transformed event - return { output: event }; - } - - // if not transformed - return { - output: { - message: await process(event), - metadata: event.metadata, - destination: event.destination, - }, - }; - } catch (error) { - const errRespEvent = handleRtTfSingleEventError(event, error, reqMetadata); - return { error: errRespEvent }; - } - }), - ); - -const processAndChunkEvents = async (inputs, reqMetadata) => { - const processedEvents = await processEvents(inputs, reqMetadata); - const engageEventChunks = []; - const groupsEventChunks = []; - const trackEventChunks = []; - const importEventChunks = []; - const batchErrorRespList = []; - processedEvents.forEach((result) => { - if (result.output) { - const event = result.output; - const { destination, metadata } = event; - let { message } = event; - message = CommonUtils.toArray(message); - message.forEach((msg) => { - // eslint-disable-next-line default-case - switch (true) { - case msg.endpoint.includes('engage'): - engageEventChunks.push({ message: msg, destination, metadata }); - break; - case msg.endpoint.includes('groups'): - groupsEventChunks.push({ message: msg, destination, metadata }); - break; - case msg.endpoint.includes('track'): - trackEventChunks.push({ message: msg, destination, metadata }); - break; - case msg.endpoint.includes('import'): - importEventChunks.push({ message: msg, destination, metadata }); - break; - } - }); - } else if (result.error) { - batchErrorRespList.push(result.error); - } - }); - return { - engageEventChunks, - groupsEventChunks, - trackEventChunks, - importEventChunks, - batchErrorRespList, - }; -}; +const process = (event) => 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 @@ -470,28 +421,56 @@ const processRouterDest = async (inputs, reqMetadata) => { return errorRespEvents; } - const { - engageEventChunks, - groupsEventChunks, - trackEventChunks, - importEventChunks, - batchErrorRespList, - } = await processAndChunkEvents(inputs, reqMetadata); - - const engageRespList = batchEvents(engageEventChunks, ENGAGE_MAX_BATCH_SIZE); - const groupsRespList = batchEvents(groupsEventChunks, GROUPS_MAX_BATCH_SIZE); - const trackRespList = batchEvents(trackEventChunks, TRACK_MAX_BATCH_SIZE); - const importRespList = batchEvents(importEventChunks, IMPORT_MAX_BATCH_SIZE); - - let batchSuccessRespList = [ - ...engageRespList, - ...groupsRespList, - ...trackRespList, - ...importRespList, - ]; - batchSuccessRespList = combineBatchRequestsWithSameJobIds(batchSuccessRespList); - - return [...batchSuccessRespList, ...batchErrorRespList]; + const groupedEvents = groupEventsByType(inputs); + const response = await Promise.all( + groupedEvents.map(async (listOfEvents) => { + let transformedPayloads = await Promise.all( + listOfEvents.map(async (event) => { + try { + if (event.message.statusCode) { + // already transformed event + return { + message: event.message, + metadata: event.metadata, + destination: event.destination, + }; + } + + let processedEvents = await process(event); + processedEvents = CommonUtils.toArray(processedEvents); + return processedEvents.map((response) => ({ + message: response, + metadata: event.metadata, + destination: event.destination, + })); + } catch (error) { + return handleRtTfSingleEventError(event, error, reqMetadata); + } + }), + ); + + transformedPayloads = _.flatMap(transformedPayloads); + const { engageEvents, groupsEvents, trackEvents, importEvents, batchErrorRespList } = + groupEventsByEndpoint(transformedPayloads); + + const engageRespList = batchEvents(engageEvents, ENGAGE_MAX_BATCH_SIZE); + const groupsRespList = batchEvents(groupsEvents, GROUPS_MAX_BATCH_SIZE); + const trackRespList = batchEvents(trackEvents, TRACK_MAX_BATCH_SIZE); + const importRespList = batchEvents(importEvents, IMPORT_MAX_BATCH_SIZE); + const batchSuccessRespList = [ + ...engageRespList, + ...groupsRespList, + ...trackRespList, + ...importRespList, + ]; + + return [...batchSuccessRespList, ...batchErrorRespList]; + }), + ); + + // Flatten the response array containing batched events from multiple groups + const allBatchedEvents = _.flatMap(response); + return combineBatchRequestsWithSameJobIds(allBatchedEvents); }; module.exports = { process, processRouterDest }; diff --git a/src/v0/destinations/mp/util.js b/src/v0/destinations/mp/util.js index 5a96c8d64b..c5fc7e04be 100644 --- a/src/v0/destinations/mp/util.js +++ b/src/v0/destinations/mp/util.js @@ -8,6 +8,9 @@ const { isAppleFamily, getBrowserInfo, toUnixTimestamp, + batchMultiplexedEvents, + getSuccessRespEvents, + defaultBatchRequestConfig, } = require('../../util'); const { ConfigCategory, @@ -16,6 +19,7 @@ const { mappingConfig, } = require('./config'); const { InstrumentationError } = require('../../util/errorTypes'); +const { CommonUtils } = require('../../../util/common'); const mPIdentifyConfigJson = mappingConfig[ConfigCategory.IDENTIFY.name]; const mPProfileAndroidConfigJson = mappingConfig[ConfigCategory.PROFILE_ANDROID.name]; @@ -166,6 +170,64 @@ const removeDuplicateMetadata = (mergedBatches) => { } }; +/** + * Group events with the same endpoint together in batches + * @param {*} events - An array of events + * @returns + */ +const groupEventsByEndpoint = (events) => { + const eventMap = { + engage: [], + groups: [], + track: [], + import: [], + }; + const batchErrorRespList = []; + + events.forEach((result) => { + if (result.message) { + const { destination, metadata } = result; + const message = CommonUtils.toArray(result.message); + + message.forEach((msg) => { + const endpoint = Object.keys(eventMap).find((key) => msg.endpoint.includes(key)); + + if (endpoint) { + eventMap[endpoint].push({ message: msg, destination, metadata }); + } + }); + } else if (result.error) { + batchErrorRespList.push(result); + } + }); + + return { + engageEvents: eventMap.engage, + groupsEvents: eventMap.groups, + trackEvents: eventMap.track, + importEvents: eventMap.import, + batchErrorRespList, + }; +}; + +const generateBatchedPayloadForArray = (events) => { + const { batchedRequest } = defaultBatchRequestConfig(); + const batchResponseList = events.flatMap((event) => JSON.parse(event.body.JSON_ARRAY.batch)); + batchedRequest.body.JSON_ARRAY = { batch: JSON.stringify(batchResponseList) }; + batchedRequest.endpoint = events[0].endpoint; + batchedRequest.headers = events[0].headers; + batchedRequest.params = events[0].params; + return batchedRequest; +}; + +const batchEvents = (successRespList, maxBatchSize) => { + const batchedEvents = batchMultiplexedEvents(successRespList, maxBatchSize); + return batchedEvents.map((batch) => { + const batchedRequest = generateBatchedPayloadForArray(batch.events); + return getSuccessRespEvents(batchedRequest, batch.metadata, batch.destination, true); + }); +}; + /** * Combines batched requests with the same JobIds. * @param {*} inputBatches The array of batched request objects. @@ -221,5 +283,7 @@ const combineBatchRequestsWithSameJobIds = (inputBatches) => { module.exports = { createIdentifyResponse, isImportAuthCredentialsAvailable, + groupEventsByEndpoint, + batchEvents, combineBatchRequestsWithSameJobIds, }; diff --git a/src/v0/destinations/mp/util.test.js b/src/v0/destinations/mp/util.test.js index 2434564699..43594fba6d 100644 --- a/src/v0/destinations/mp/util.test.js +++ b/src/v0/destinations/mp/util.test.js @@ -1,6 +1,8 @@ const { combineBatchRequestsWithSameJobIds, - combineBatchRequestsWithSameJobIds2, + groupEventsByType, + groupEventsByEndpoint, + batchEvents, } = require('./util'); const destinationMock = { @@ -21,7 +23,243 @@ const destinationMock = { Transformations: [], }; +const maxBatchSizeMock = 2; + describe('Mixpanel utils test', () => { + describe('Unit test cases for groupEventsByEndpoint', () => { + it('should return an object with empty arrays for all properties when the events array is empty', () => { + const events = []; + const result = groupEventsByEndpoint(events); + expect(result).toEqual({ + engageEvents: [], + groupsEvents: [], + trackEvents: [], + importEvents: [], + batchErrorRespList: [], + }); + }); + + it('should return an object with all properties containing their respective events when the events array contains events of all types', () => { + const events = [ + { + message: { + endpoint: '/engage', + body: { + JSON_ARRAY: { + batch: '[{prop:1}]', + }, + }, + userId: 'user1', + }, + }, + { + message: { + endpoint: '/engage', + body: { + JSON_ARRAY: { + batch: '[{prop:2}]', + }, + }, + userId: 'user2', + }, + }, + { + message: { + endpoint: '/groups', + body: { + JSON_ARRAY: { + batch: '[{prop:3}]', + }, + }, + userId: 'user1', + }, + }, + { + message: { + endpoint: '/track', + body: { + JSON_ARRAY: { + batch: '[{prop:4}]', + }, + }, + userId: 'user1', + }, + }, + { + message: { + endpoint: '/import', + body: { + JSON_ARRAY: { + batch: '[{prop:5}]', + }, + }, + userId: 'user2', + }, + }, + { error: 'Message type abc not supported' }, + ]; + const result = groupEventsByEndpoint(events); + expect(result).toEqual({ + engageEvents: [ + { + message: { + endpoint: '/engage', + body: { + JSON_ARRAY: { + batch: '[{prop:1}]', + }, + }, + userId: 'user1', + }, + }, + { + message: { + endpoint: '/engage', + body: { + JSON_ARRAY: { + batch: '[{prop:2}]', + }, + }, + userId: 'user2', + }, + }, + ], + groupsEvents: [ + { + message: { + endpoint: '/groups', + body: { + JSON_ARRAY: { + batch: '[{prop:3}]', + }, + }, + userId: 'user1', + }, + }, + ], + trackEvents: [ + { + message: { + endpoint: '/track', + body: { + JSON_ARRAY: { + batch: '[{prop:4}]', + }, + }, + userId: 'user1', + }, + }, + ], + importEvents: [ + { + message: { + endpoint: '/import', + body: { + JSON_ARRAY: { + batch: '[{prop:5}]', + }, + }, + userId: 'user2', + }, + }, + ], + batchErrorRespList: [{ error: 'Message type abc not supported' }], + }); + }); + }); + + describe('Unit test cases for batchEvents', () => { + it('should return an array of batched events with correct payload and metadata', () => { + const successRespList = [ + { + message: { + endpoint: '/engage', + body: { + JSON_ARRAY: { + batch: '[{"prop":1}]', + }, + }, + headers: {}, + params: {}, + userId: 'user1', + }, + metadata: { jobId: 3 }, + }, + { + message: { + endpoint: '/engage', + body: { + JSON_ARRAY: { + batch: '[{"prop":2}]', + }, + }, + headers: {}, + params: {}, + userId: 'user2', + }, + metadata: { jobId: 4 }, + }, + { + message: { + endpoint: '/engage', + body: { + JSON_ARRAY: { + batch: '[{"prop":3}]', + }, + }, + headers: {}, + params: {}, + userId: 'user2', + }, + metadata: { jobId: 6 }, + }, + ]; + + const result = batchEvents(successRespList, maxBatchSizeMock); + + expect(result).toEqual([ + { + batched: true, + batchedRequest: { + body: { FORM: {}, JSON: {}, JSON_ARRAY: { batch: '[{"prop":1},{"prop":2}]' }, XML: {} }, + endpoint: '/engage', + files: {}, + headers: {}, + method: 'POST', + params: {}, + type: 'REST', + version: '1', + }, + destination: undefined, + metadata: [{ jobId: 3 }, { jobId: 4 }], + statusCode: 200, + }, + { + batched: true, + batchedRequest: { + body: { FORM: {}, JSON: {}, JSON_ARRAY: { batch: '[{"prop":3}]' }, XML: {} }, + endpoint: '/engage', + files: {}, + headers: {}, + method: 'POST', + params: {}, + type: 'REST', + version: '1', + }, + destination: undefined, + metadata: [{ jobId: 6 }], + statusCode: 200, + }, + ]); + }); + + it('should return an empty array when successRespList is empty', () => { + const successRespList = []; + const result = batchEvents(successRespList, maxBatchSizeMock); + expect(result).toEqual([]); + }); + }); + describe('Unit test cases for combineBatchRequestsWithSameJobIds', () => { it('Combine batch request with same jobIds', async () => { const input = [ diff --git a/src/v0/destinations/pardot/transform.js b/src/v0/destinations/pardot/transform.js index 128d72cb14..b9f78a6c34 100644 --- a/src/v0/destinations/pardot/transform.js +++ b/src/v0/destinations/pardot/transform.js @@ -45,34 +45,14 @@ const { getSuccessRespEvents, checkInvalidRtTfEvents, handleRtTfSingleEventError, + getAccessToken, } = require('../../util'); const { CONFIG_CATEGORIES } = require('./config'); const { - OAuthSecretError, ConfigurationError, InstrumentationError, } = require('../../util/errorTypes'); -/** - * 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 OAuthSecretError('Empty/Invalid access token'); - } - return secret.access_token; -}; - const buildResponse = (payload, url, destination, token) => { const responseBody = removeUndefinedValues(payload); const response = defaultRequestConfig(); @@ -122,7 +102,7 @@ const getUrl = (urlParams) => { const processIdentify = ({ message, metadata }, destination, category) => { const { campaignId } = destination.Config; - const accessToken = getAccessToken(metadata); + const accessToken = getAccessToken(metadata, 'access_token'); let extId = get(message, 'context.externalId'); extId = extId && extId.length > 0 ? extId[0] : null; diff --git a/src/v0/destinations/redis/transform.js b/src/v0/destinations/redis/transform.js index f57cadb7e6..124569c8e8 100644 --- a/src/v0/destinations/redis/transform.js +++ b/src/v0/destinations/redis/transform.js @@ -31,9 +31,9 @@ const isSubEventTypeProfiles = (message) => { return sources.profiles_entity && sources.profiles_id_type && sources.profiles_model; }; -const transforrmSubEventTypeProfiles = (message, workspaceId) => { +const transformSubEventTypeProfiles = (message, workspaceId, destinationId) => { // form the hash - const hash = `${workspaceId}:${message.context.sources.profiles_entity}:${message.context.sources.profiles_id_type}:${message.userId}`; + const hash = `${workspaceId}:${destinationId}:${message.context.sources.profiles_entity}:${message.context.sources.profiles_id_type}:${message.userId}`; const key = `${message.context.sources.profiles_model}`; const value = JSON.stringify(message.traits); return { @@ -59,11 +59,12 @@ const process = (event) => { } const { prefix } = destination.Config; + const destinationId = destination.ID; const keyPrefix = isEmpty(prefix) ? '' : `${prefix.trim()}:`; if (isSubEventTypeProfiles(message)) { const { workspaceId } = metadata; - return transforrmSubEventTypeProfiles(message, workspaceId); + return transformSubEventTypeProfiles(message, workspaceId, destinationId); } const hmap = { diff --git a/src/v0/destinations/slack/transform.js b/src/v0/destinations/slack/transform.js index ee58b63dff..b56ebfbc48 100644 --- a/src/v0/destinations/slack/transform.js +++ b/src/v0/destinations/slack/transform.js @@ -16,25 +16,38 @@ const { defaultRequestConfig, getFieldValueFromMessage, simpleProcessRouterDest, + isDefinedAndNotNull, } = require('../../util'); const { InstrumentationError, ConfigurationError } = require('../../util/errorTypes'); // 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 -const buildResponse = (payloadJSON, message, destination) => { - const endpoint = destination.Config.webhookUrl; +const buildResponse = ( + payloadJSON, + message, + destination, + channelWebhook = null, + sendAppNameAndIcon = true, +) => { + const endpoint = channelWebhook || 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; + const payload = + sendAppNameAndIcon === true + ? JSON.stringify({ + ...payloadJSON, + username: SLACK_USER_NAME, + icon_url: SLACK_RUDDER_IMAGE_URL, + }) + : JSON.stringify({ + ...payloadJSON, + }); response.body.FORM = { - payload: JSON.stringify({ - ...payloadJSON, - username: SLACK_USER_NAME, - icon_url: SLACK_RUDDER_IMAGE_URL, - }), + payload, }; response.statusCode = 200; logger.debug(response); @@ -42,21 +55,15 @@ const buildResponse = (payloadJSON, message, destination) => { }; const processIdentify = (message, destination) => { - // debug(JSON.stringify(destination)); const identifyTemplateConfig = destination.Config.identifyTemplate; const traitsList = getWhiteListedTraits(destination); const defaultIdentifyTemplate = 'Identified {{name}}'; 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 + ? identifyTemplateConfig.trim()?.length === 0 ? undefined : identifyTemplateConfig : undefined) || @@ -69,7 +76,7 @@ const processIdentify = (message, destination) => { logger.debug( 'identifyTemplateConfig: ', (identifyTemplateConfig - ? identifyTemplateConfig.trim().length === 0 + ? identifyTemplateConfig.trim()?.length === 0 ? undefined : identifyTemplateConfig : undefined) || @@ -95,18 +102,40 @@ const processIdentify = (message, destination) => { return buildResponse({ text: resultText }, message, destination); }; -function buildChannelList(channelListToSendThisEvent, eventChannelConfig, eventName) { - 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; +const isEventNameMatchesRegex = (eventName, regex) => eventName.match(regex)?.length > 0; + +const getChannelForEventName = (eventChannelSettings, eventName) => { + for (const channelConfig of eventChannelSettings) { + const configEventName = + channelConfig?.eventName?.trim()?.length > 0 ? channelConfig.eventName : null; + const channelWebhook = + channelConfig?.eventChannelWebhook?.length > 0 ? channelConfig.eventChannelWebhook : null; + + if (configEventName && isDefinedAndNotNull(channelWebhook)) { + if (channelConfig.eventRegex) { + logger.debug('regex: ', `${configEventName} trying to match with ${eventName}`); + logger.debug( + 'match:: ', + configEventName, + eventName, + eventName.match(new RegExp(configEventName, 'g')), + ); + if (isEventNameMatchesRegex(eventName, new RegExp(configEventName, 'g'))) { + return channelWebhook; + } + } else if (channelConfig.eventName === eventName) { + return channelWebhook; + } + } + } + return null; +}; +const getChannelNameForEvent = (eventChannelSettings, eventName) => { + for (const channelConfig of eventChannelSettings) { + const configEventName = + channelConfig?.eventName?.trim()?.length > 0 ? channelConfig.eventName : null; + const configEventChannel = + channelConfig?.eventChannel?.trim()?.length > 0 ? channelConfig.eventChannel : null; if (configEventName && configEventChannel) { if (channelConfig.eventRegex) { logger.debug('regex: ', `${configEventName} trying to match with ${eventName}`); @@ -116,37 +145,29 @@ function buildChannelList(channelListToSendThisEvent, eventChannelConfig, eventN eventName, eventName.match(new RegExp(configEventName, 'g')), ); - if ( - eventName.match(new RegExp(configEventName, 'g')) && - eventName.match(new RegExp(configEventName, 'g')).length > 0 - ) { - channelListToSendThisEvent.add(configEventChannel); + if (isEventNameMatchesRegex(eventName, new RegExp(configEventName, 'g'))) { + return configEventChannel; } } else if (configEventName === eventName) { - channelListToSendThisEvent.add(configEventChannel); + return configEventChannel; } } - }); -} + } + return null; +}; -function buildtemplateList(templateListForThisEvent, eventTemplateConfig, eventName) { - eventTemplateConfig.forEach((templateConfig) => { - const configEventName = templateConfig.eventName - ? templateConfig.eventName.trim().length > 0 - ? templateConfig.eventName - : undefined - : undefined; +const buildtemplateList = (templateListForThisEvent, eventTemplateSettings, eventName) => { + eventTemplateSettings.forEach((templateConfig) => { + const configEventName = + templateConfig?.eventName?.trim()?.length > 0 ? templateConfig.eventName : undefined; const configEventTemplate = templateConfig.eventTemplate - ? templateConfig.eventTemplate.trim().length > 0 + ? templateConfig.eventTemplate.trim()?.length > 0 ? templateConfig.eventTemplate : undefined : undefined; if (configEventName && configEventTemplate) { if (templateConfig.eventRegex) { - if ( - eventName.match(new RegExp(configEventName, 'g')) && - eventName.match(new RegExp(configEventName, 'g')).length > 0 - ) { + if (isEventNameMatchesRegex(eventName, new RegExp(configEventName, 'g'))) { templateListForThisEvent.add(configEventTemplate); } } else if (configEventName === eventName) { @@ -154,32 +175,47 @@ function buildtemplateList(templateListForThisEvent, eventTemplateConfig, eventN } } }); -} +}; const processTrack = (message, destination) => { // logger.debug(JSON.stringify(destination)); - const eventChannelConfig = destination.Config.eventChannelSettings; - const eventTemplateConfig = destination.Config.eventTemplateSettings; + const { Config } = destination; + const { eventChannelSettings, eventTemplateSettings, incomingWebhooksType, blacklistedEvents } = + Config; + const eventName = message.event; - if (!message.event) { + if (!eventName) { throw new InstrumentationError('Event name is required'); } - const eventName = message.event; - const channelListToSendThisEvent = new Set(); + if (blacklistedEvents?.length > 0) { + const blackListedEvents = blacklistedEvents.map((item) => item.eventName); + if (blackListedEvents.includes(eventName)) { + throw new ConfigurationError('Event is blacklisted. Please check configuration.'); + } + } + const templateListForThisEvent = new Set(); const traitsList = getWhiteListedTraits(destination); - // 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 + /* Add global context to regex always + * build the channel list and template list for the event, pick the first in case of multiple + * using set to filter out + * document this behaviour + */ - // building channel list - buildChannelList(channelListToSendThisEvent, eventChannelConfig, eventName); - const channelListArray = Array.from(channelListToSendThisEvent); + // getting specific channel for event if available + + let channelWebhook; + let channelName; + if (incomingWebhooksType && incomingWebhooksType === 'modern') { + channelWebhook = getChannelForEventName(eventChannelSettings, eventName); + } else { + // default + channelName = getChannelNameForEvent(eventChannelSettings, eventName); + } // building templatelist - buildtemplateList(templateListForThisEvent, eventTemplateConfig, eventName); + buildtemplateList(templateListForThisEvent, eventTemplateSettings, eventName); const templateListArray = Array.from(templateListForThisEvent); logger.debug( @@ -187,8 +223,6 @@ const processTrack = (message, destination) => { templateListArray, templateListArray.length > 0 ? templateListArray[0] : undefined, ); - logger.debug('channelListToSendThisEvent: ', channelListArray); - // track event default handlebar expression const defaultTemplate = '{{name}} did {{event}}'; const template = templateListArray @@ -219,9 +253,16 @@ const processTrack = (message, destination) => { } catch (err) { throw new ConfigurationError(`Something is wrong with the event template: '${template}'`); } - - if (channelListArray && channelListArray.length > 0) { - return buildResponse({ channel: channelListArray[0], text: resultText }, message, destination); + if (incomingWebhooksType === 'modern' && channelWebhook) { + return buildResponse({ text: resultText }, message, destination, channelWebhook, false); + } + if (channelName) { + return buildResponse( + { channel: channelName, text: resultText }, + message, + destination, + channelWebhook, + ); } return buildResponse({ text: resultText }, message, destination); }; diff --git a/src/v0/destinations/slack/util.js b/src/v0/destinations/slack/util.js index b327d1d867..658ffe4d37 100644 --- a/src/v0/destinations/slack/util.js +++ b/src/v0/destinations/slack/util.js @@ -72,8 +72,10 @@ const stringifyJSON = (json, whiteListedTraits) => { return output; }; -// build default identify template -// if whitelisted traits are present build on it else build the entire traits object +/* build default identify template + * if whitelisted traits are present build on it + * else build the entire traits object + */ const buildDefaultTraitTemplate = (traitsList, traits, template) => { let generatedStringFromTemplate = template; // build template with whitelisted traits diff --git a/src/v0/destinations/snapchat_custom_audience/networkHandler.js b/src/v0/destinations/snapchat_custom_audience/networkHandler.js index 0f75d36a56..49ea452550 100644 --- a/src/v0/destinations/snapchat_custom_audience/networkHandler.js +++ b/src/v0/destinations/snapchat_custom_audience/networkHandler.js @@ -1,7 +1,9 @@ -const { removeUndefinedValues } = require('../../util'); +const { removeUndefinedValues, getAuthErrCategoryFromErrDetailsAndStCode } = require('../../util'); const { prepareProxyRequest, getPayloadData, httpSend } = require('../../../adapters/network'); const { isHttpStatusSuccess } = require('../../util/index'); -const { REFRESH_TOKEN } = require('../../../adapters/networkhandler/authConstants'); +const { + REFRESH_TOKEN, +} = require('../../../adapters/networkhandler/authConstants'); const tags = require('../../util/tags'); const { getDynamicErrorType, @@ -30,22 +32,6 @@ const prepareProxyReq = (request) => { }); }; -/** - * This function helps to determine type of error occurred. According to the response - * we set authErrorCategory to take decision if we need to refresh the access_token - * or need to disable the destination. - * @param {*} code - * @param {*} response - * @returns - */ -const getAuthErrCategory = (code, response) => { - let authErrCategory = ''; - if (code === 401) { - authErrCategory = !response.error?.details ? REFRESH_TOKEN : ''; - } - return authErrCategory; -}; - const scAudienceProxyRequest = async (request) => { const { endpoint, data, method, params, headers } = prepareProxyReq(request); @@ -65,7 +51,7 @@ const scAudienceProxyRequest = async (request) => { const scaAudienceRespHandler = (destResponse, stageMsg) => { const { status, response } = destResponse; - const authErrCategory = getAuthErrCategory(status, response); + const authErrCategory = getAuthErrCategoryFromErrDetailsAndStCode(status, response); if (authErrCategory === REFRESH_TOKEN) { throw new RetryableError( diff --git a/src/v0/destinations/snapchat_custom_audience/transform.js b/src/v0/destinations/snapchat_custom_audience/transform.js index 1c16115494..7938236594 100644 --- a/src/v0/destinations/snapchat_custom_audience/transform.js +++ b/src/v0/destinations/snapchat_custom_audience/transform.js @@ -4,33 +4,13 @@ const { removeUndefinedAndNullValues, simpleProcessRouterDest, isDefinedAndNotNullAndNotEmpty, + getAccessToken, } = require('../../util'); -const { ConfigurationError, OAuthSecretError } = require('../../util/errorTypes'); +const { ConfigurationError } = require('../../util/errorTypes'); const { BASE_URL, schemaType } = require('./config'); const { validatePayload, validateFields } = require('./utils'); const { JSON_MIME_TYPE } = 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; - // we would need to verify if secret is present and also if the access token field is present in secret - if (!secret || !secret.access_token) { - throw new OAuthSecretError('Empty/Invalid access token'); - } - return secret.access_token; -}; - const generateResponse = (groupedData, schema, segmentId, metadata, type) => { const payload = { users: [] }; const userPayload = { schema: [schema], data: groupedData }; @@ -43,7 +23,7 @@ const generateResponse = (groupedData, schema, segmentId, metadata, type) => { response.endpoint = `${BASE_URL}/segments/${segmentId}/users`; response.body.JSON = removeUndefinedAndNullValues(payload); - const accessToken = getAccessToken(metadata); + const accessToken = getAccessToken(metadata, 'access_token'); response.headers = { Authorization: `Bearer ${accessToken}`, 'Content-Type': JSON_MIME_TYPE, diff --git a/src/v0/destinations/tiktok_ads/data/TikTokTrack.json b/src/v0/destinations/tiktok_ads/data/TikTokTrack.json index 05709af27a..b15223b999 100644 --- a/src/v0/destinations/tiktok_ads/data/TikTokTrack.json +++ b/src/v0/destinations/tiktok_ads/data/TikTokTrack.json @@ -1,7 +1,7 @@ [ { "destKey": "event_id", - "sourceKeys": "properties.eventId", + "sourceKeys": ["properties.eventId", "properties.event_id", "messageId"], "required": false }, { diff --git a/src/v0/destinations/twitter_ads/transform.js b/src/v0/destinations/twitter_ads/transform.js index 78c3379c64..363e61072e 100644 --- a/src/v0/destinations/twitter_ads/transform.js +++ b/src/v0/destinations/twitter_ads/transform.js @@ -9,15 +9,15 @@ const { simpleProcessRouterDest, } = require('../../util'); const { EventType } = require('../../../constants'); -const { - ConfigCategories, - mappingConfig, - BASE_URL -} = require('./config'); +const { ConfigCategories, mappingConfig, BASE_URL } = require('./config'); -const { InstrumentationError, OAuthSecretError, ConfigurationError } = require('../../util/errorTypes'); +const { + InstrumentationError, + OAuthSecretError, + ConfigurationError, +} = require('../../util/errorTypes'); const { JSON_MIME_TYPE } = require('../../util/constant'); -const { getAuthHeaderForRequest } = require("./util"); +const { getAuthHeaderForRequest } = require('./util'); const getOAuthFields = ({ secret }) => { if (!secret) { @@ -27,7 +27,7 @@ const getOAuthFields = ({ secret }) => { consumerKey: secret.consumerKey, consumerSecret: secret.consumerSecret, accessToken: secret.accessToken, - accessTokenSecret: secret.accessTokenSecret + accessTokenSecret: secret.accessTokenSecret, }; return oAuthObject; }; @@ -42,7 +42,7 @@ function buildResponse(message, requestJson, metadata, endpointUrl) { const request = { url: response.endpoint, method: response.method, - body: response.body.JSON + body: response.body.JSON, }; const oAuthObject = getOAuthFields(metadata); @@ -60,17 +60,20 @@ function prepareUrl(message, destination) { } function populateEventId(event, requestJson, destination) { - const eventNameToIdMappings = destination.Config.twitterAdsEventNames; - let eventId = ""; + let eventId = ''; if (eventNameToIdMappings) { - const eventObj = eventNameToIdMappings.find(obj => obj.rudderEventName?.trim().toLowerCase() === event?.toString().toLowerCase()); + const eventObj = eventNameToIdMappings.find( + (obj) => obj.rudderEventName?.trim().toLowerCase() === event?.toString().toLowerCase(), + ); eventId = eventObj?.twitterEventId; } - if(!eventId) { - throw new ConfigurationError(`[TWITTER ADS]: Event - '${event}' do not have a corresponding eventId in configuration. Aborting`); + if (!eventId) { + throw new ConfigurationError( + `[TWITTER ADS]: Event - '${event}' do not have a corresponding eventId in configuration. Aborting`, + ); } return eventId; @@ -79,14 +82,16 @@ 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); + 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; } @@ -96,13 +101,14 @@ function populateContents(requestJson) { // 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.event_id = + requestJson.event_id || populateEventId(message.event, requestJson, destination); requestJson.conversion_time = isDefinedAndNotNull(requestJson.conversion_time) - ? requestJson.conversion_time : message.timestamp; + ? requestJson.conversion_time + : message.timestamp; const identifiers = []; @@ -110,19 +116,19 @@ function processTrack(message, metadata, destination) { let email = message.properties.email.trim(); if (email) { email = email.toLowerCase(); - identifiers.push({hashed_email: sha256(email)}) + identifiers.push({ hashed_email: sha256(email) }); } } if (message.properties.phone) { const phone = message.properties.phone.trim(); if (phone) { - identifiers.push({hashed_phone_number: sha256(phone)}) + identifiers.push({ hashed_phone_number: sha256(phone) }); } } if (message.properties.twclid) { - identifiers.push({twclid: sha256(message.properties.twclid)}); + identifiers.push({ twclid: message.properties.twclid }); } requestJson = populateContents(requestJson); @@ -131,33 +137,26 @@ function processTrack(message, metadata, destination) { const endpointUrl = prepareUrl(message, destination); - return buildResponse( - message, - requestJson, - metadata, - endpointUrl - ); + return buildResponse(message, requestJson, metadata, endpointUrl); } function validateRequest(message) { - const { properties } = message; if (!properties) { throw new InstrumentationError( - '[TWITTER ADS]: properties must be present in event. Aborting message', + '[TWITTER ADS]: properties must be present in event. Aborting message', ); } if (!properties.email && !properties.phone && !properties.twclid) { throw new InstrumentationError( - '[TWITTER ADS]: one of twclid, phone or email must be present in properties.', + '[TWITTER ADS]: one of twclid, phone or email must be present in properties.', ); } } function process(event) { - const { message, metadata, destination } = event; validateRequest(message); @@ -169,7 +168,6 @@ function process(event) { } throw new InstrumentationError(`Message type ${messageType} not supported`); - } const processRouterDest = async (inputs, reqMetadata) => { diff --git a/src/v0/util/index.js b/src/v0/util/index.js index b04d64deb6..5ddd3cf5ff 100644 --- a/src/v0/util/index.js +++ b/src/v0/util/index.js @@ -28,6 +28,10 @@ const { } = require('./errorTypes'); const { client: errNotificationClient } = require('../../util/errorNotifier'); const { HTTP_STATUS_CODES } = require('./constant'); +const { + REFRESH_TOKEN, + AUTH_STATUS_INACTIVE, +} = require('../../adapters/networkhandler/authConstants'); // ======================================================================== // INLINERS // ======================================================================== @@ -1829,8 +1833,8 @@ const getAccessToken = (metadata, accessTokenKey) => { // OAuth for this destination const { secret } = metadata; // we would need to verify if secret is present and also if the access token field is present in secret - if (!secret || !secret[accessTokenKey]) { - throw new OAuthSecretError('Empty/Invalid access token'); + if (!secret?.[accessTokenKey]) { + throw new OAuthSecretError('OAuth - access token not found'); } return secret[accessTokenKey]; }; @@ -1912,6 +1916,83 @@ const batchMultiplexedEvents = (transformedEventsList, maxBatchSize) => { return batchedEvents; }; +/** + * Groups events with the same message type together in batches. + * Each batch contains events that have the same message type and are from different users. + * @param {*} inputs - An array of events + * @returns {*} - An array of batches + */ +const groupEventsByType = (inputs) => { + const batches = []; + let currentInputsArray = inputs; + while (currentInputsArray.length > 0) { + const remainingInputsArray = []; + const userOrderTracker = {}; + const event = currentInputsArray.shift(); + const messageType = event.message.type; + const batch = [event]; + currentInputsArray.forEach((currentInput) => { + const currentMessageType = currentInput.message.type; + const currentUser = currentInput.metadata.userId; + if (currentMessageType === messageType && !userOrderTracker[currentUser]) { + batch.push(currentInput); + } else { + remainingInputsArray.push(currentInput); + userOrderTracker[currentUser] = true; + } + }); + batches.push(batch); + currentInputsArray = remainingInputsArray; + } + + return batches; +}; + +/** + * This function helps to detarmine type of error occured. According to the response + * we set authErrorCategory to take decision if we need to refresh the access_token + * or need to de-activate authStatus for the destination. + * + * **Scenarios**: + * - statusCode=401, response.error.details !== "" -> REFRESH_TOKEN + * - statusCode=403, response.error.details !== "" -> AUTH_STATUS_INACTIVE + * + * @param {*} code + * @param {*} response + * @returns + */ +const getAuthErrCategoryFromErrDetailsAndStCode = (code, response) => { + if (code === 401 && (!get(response, 'error.details') || typeof response === 'string')) + return REFRESH_TOKEN; + if (code === 403 && (!get(response, 'error.details') || typeof response === 'string')) + return AUTH_STATUS_INACTIVE; + return ''; +}; + +/** + * This function helps to determine the type of error occurred. We set the authErrorCategory + * as per the destination response that is received and take the decision whether + * to refresh the access_token or de-activate authStatus. + * + * **Scenarios**: + * - statusCode=401 -> REFRESH_TOKEN + * - statusCode=403 -> AUTH_STATUS_INACTIVE + * + * @param {*} status + * @returns + */ +const getAuthErrCategoryFromStCode = (status) => { + if (status === 401) { + // UNAUTHORIZED + return REFRESH_TOKEN; + } + if (status === 403) { + // ACCESS_DENIED + return AUTH_STATUS_INACTIVE; + } + return ''; +}; + // ======================================================================== // EXPORTS // ======================================================================== @@ -2012,4 +2093,7 @@ module.exports = { checkAndCorrectUserId, getAccessToken, formatValues, + groupEventsByType, + getAuthErrCategoryFromErrDetailsAndStCode, + getAuthErrCategoryFromStCode, }; diff --git a/src/v0/util/index.test.js b/src/v0/util/index.test.js index b575f006fa..9c257d5fd3 100644 --- a/src/v0/util/index.test.js +++ b/src/v0/util/index.test.js @@ -11,6 +11,7 @@ const functionNames = [ 'extractCustomFields', 'batchMultiplexedEvents', 'removeUndefinedNullValuesAndEmptyObjectArray', + 'groupEventsByType', ]; // Names of the utility functions to test which expects multiple arguments as values and not objects diff --git a/src/v0/util/testdata/groupEventsByType.json b/src/v0/util/testdata/groupEventsByType.json new file mode 100644 index 0000000000..168b875036 --- /dev/null +++ b/src/v0/util/testdata/groupEventsByType.json @@ -0,0 +1,624 @@ +[ + { + "description": "Should return an empty array when given an empty events array", + "input": [[]], + "output": [] + }, + { + "description": "Should group multiple events with the different message type and different users together in a batch: Scenario 1", + "input": [ + [ + { + "message": { + "type": "identify", + "userId": "user1" + }, + "metadata": { + "jobId": "1" + } + }, + { + "message": { + "type": "identify", + "userId": "user2" + }, + "metadata": { + "jobId": "2" + } + }, + { + "message": { + "type": "track", + "userId": "user1" + }, + "metadata": { + "jobId": "3" + } + }, + { + "message": { + "type": "identify", + "userId": "user1" + }, + "metadata": { + "jobId": "4" + } + }, + { + "message": { + "type": "identify", + "userId": "user2" + }, + "metadata": { + "jobId": "5" + } + } + ] + ], + "output": [ + [ + { + "message": { + "type": "identify", + "userId": "user1" + }, + "metadata": { + "jobId": "1" + } + }, + { + "message": { + "type": "identify", + "userId": "user2" + }, + "metadata": { + "jobId": "2" + } + } + ], + [ + { + "message": { + "type": "track", + "userId": "user1" + }, + "metadata": { + "jobId": "3" + } + } + ], + [ + { + "message": { + "type": "identify", + "userId": "user1" + }, + "metadata": { + "jobId": "4" + } + }, + { + "message": { + "type": "identify", + "userId": "user2" + }, + "metadata": { + "jobId": "5" + } + } + ] + ] + }, + { + "description": "Should group multiple events with the different message type and different users together in a batch: Scenario 2", + "input": [ + [ + { + "message": { + "type": "identify" + }, + "metadata": { + "userId": "1" + } + }, + { + "message": { + "type": "track" + }, + "metadata": { + "userId": "1" + } + }, + { + "message": { + "type": "identify" + }, + "metadata": { + "userId": "2" + } + }, + { + "message": { + "type": "track" + }, + "metadata": { + "userId": "2" + } + }, + { + "message": { + "type": "track" + }, + "metadata": { + "userId": "2" + } + }, + { + "message": { + "type": "identify" + }, + "metadata": { + "userId": "3" + } + }, + { + "message": { + "type": "track" + }, + "metadata": { + "userId": "3" + } + }, + { + "message": { + "type": "identify" + }, + "metadata": { + "userId": "4" + } + }, + { + "message": { + "type": "track" + }, + "metadata": { + "userId": "4" + } + }, + { + "message": { + "type": "identify" + }, + "metadata": { + "userId": "5" + } + }, + { + "message": { + "type": "track" + }, + "metadata": { + "userId": "5" + } + }, + { + "message": { + "type": "identify" + }, + "metadata": { + "userId": "5" + } + }, + { + "message": { + "type": "identify" + }, + "metadata": { + "userId": "6" + } + }, + { + "message": { + "type": "identify" + }, + "metadata": { + "userId": "6" + } + }, + { + "message": { + "type": "identify" + }, + "metadata": { + "userId": "6" + } + } + ] + ], + "output": [ + [ + { + "message": { + "type": "identify" + }, + "metadata": { + "userId": "1" + } + }, + { + "message": { + "type": "identify" + }, + "metadata": { + "userId": "2" + } + }, + { + "message": { + "type": "identify" + }, + "metadata": { + "userId": "3" + } + }, + { + "message": { + "type": "identify" + }, + "metadata": { + "userId": "4" + } + }, + { + "message": { + "type": "identify" + }, + "metadata": { + "userId": "5" + } + }, + { + "message": { + "type": "identify" + }, + "metadata": { + "userId": "6" + } + }, + { + "message": { + "type": "identify" + }, + "metadata": { + "userId": "6" + } + }, + { + "message": { + "type": "identify" + }, + "metadata": { + "userId": "6" + } + } + ], + [ + { + "message": { + "type": "track" + }, + "metadata": { + "userId": "1" + } + }, + { + "message": { + "type": "track" + }, + "metadata": { + "userId": "2" + } + }, + { + "message": { + "type": "track" + }, + "metadata": { + "userId": "2" + } + }, + { + "message": { + "type": "track" + }, + "metadata": { + "userId": "3" + } + }, + { + "message": { + "type": "track" + }, + "metadata": { + "userId": "4" + } + }, + { + "message": { + "type": "track" + }, + "metadata": { + "userId": "5" + } + } + ], + [ + { + "message": { + "type": "identify" + }, + "metadata": { + "userId": "5" + } + } + ] + ] + }, + { + "description": "Should group multiple events with the different message type and different users together in a batch: Scenario 3", + "input": [ + [ + { + "message": { + "type": "track" + }, + "metadata": { + "userId": "3" + } + }, + { + "message": { + "type": "identify" + }, + "metadata": { + "userId": "3" + } + }, + { + "message": { + "type": "identify" + }, + "metadata": { + "userId": "1" + } + }, + { + "message": { + "type": "track" + }, + "metadata": { + "userId": "1" + } + }, + { + "message": { + "type": "identify" + }, + "metadata": { + "userId": "5" + } + }, + { + "message": { + "type": "track" + }, + "metadata": { + "userId": "5" + } + }, + { + "message": { + "type": "identify" + }, + "metadata": { + "userId": "5" + } + }, + { + "message": { + "type": "identify" + }, + "metadata": { + "userId": "2" + } + }, + { + "message": { + "type": "track" + }, + "metadata": { + "userId": "2" + } + }, + { + "message": { + "type": "track" + }, + "metadata": { + "userId": "2" + } + }, + { + "message": { + "type": "track" + }, + "metadata": { + "userId": "4" + } + }, + { + "message": { + "type": "identify" + }, + "metadata": { + "userId": "4" + } + }, + { + "message": { + "type": "identify" + }, + "metadata": { + "userId": "6" + } + }, + { + "message": { + "type": "identify" + }, + "metadata": { + "userId": "6" + } + }, + { + "message": { + "type": "identify" + }, + "metadata": { + "userId": "6" + } + } + ] + ], + "output": [ + [ + { + "message": { + "type": "track" + }, + "metadata": { + "userId": "3" + } + }, + { + "message": { + "type": "track" + }, + "metadata": { + "userId": "4" + } + } + ], + [ + { + "message": { + "type": "identify" + }, + "metadata": { + "userId": "3" + } + }, + { + "message": { + "type": "identify" + }, + "metadata": { + "userId": "1" + } + }, + { + "message": { + "type": "identify" + }, + "metadata": { + "userId": "5" + } + }, + { + "message": { + "type": "identify" + }, + "metadata": { + "userId": "2" + } + }, + { + "message": { + "type": "identify" + }, + "metadata": { + "userId": "4" + } + }, + { + "message": { + "type": "identify" + }, + "metadata": { + "userId": "6" + } + }, + { + "message": { + "type": "identify" + }, + "metadata": { + "userId": "6" + } + }, + { + "message": { + "type": "identify" + }, + "metadata": { + "userId": "6" + } + } + ], + [ + { + "message": { + "type": "track" + }, + "metadata": { + "userId": "1" + } + }, + { + "message": { + "type": "track" + }, + "metadata": { + "userId": "5" + } + }, + { + "message": { + "type": "track" + }, + "metadata": { + "userId": "2" + } + }, + { + "message": { + "type": "track" + }, + "metadata": { + "userId": "2" + } + } + ], + [ + { + "message": { + "type": "identify" + }, + "metadata": { + "userId": "5" + } + } + ] + ] + } +] diff --git a/src/warehouse/index.js b/src/warehouse/index.js index dd5116f00e..244605613f 100644 --- a/src/warehouse/index.js +++ b/src/warehouse/index.js @@ -7,7 +7,8 @@ const { isObject, isBlank, isValidJsonPathKey, - getKeysFromJsonPaths, + isValidLegacyJsonPathKey, + keysFromJsonPaths, validTimestamp, getVersionedUtils, isRudderSourcesEvent, @@ -195,45 +196,51 @@ function setDataFromColumnMappingAndComputeColumnTypes( columnTypes = {context_library_name: 'string', context_library_version: 'string'} */ - function setDataFromInputAndComputeColumnTypes( - utils, - eventType, - output, - input, - columnTypes, - options, - prefix = '', - level = 0, + utils, + eventType, + output, + input, + columnTypes, + options, + completePrefix = '', + completeLevel = 0, + prefix = '', + level = 0, ) { if (!input || !isObject(input)) return; Object.keys(input).forEach((key) => { - if (isValidJsonPathKey(eventType, `${prefix + key}`, input[key], level, options.jsonKeys)) { + const isValidLegacyJSONPath = isValidLegacyJsonPathKey(eventType, `${prefix + key}`, level, options.jsonLegacyPathKeys); + const isValidJSONPath = isValidJsonPathKey(`${completePrefix + key}`, completeLevel, options.jsonPathKeys); + + if (isValidJSONPath || isValidLegacyJSONPath) { if (isBlank(input[key])) { return; } const val = JSON.stringify(input[key]); appendColumnNameAndType( - utils, - eventType, - `${prefix + key}`, - val, - output, - columnTypes, - options, - true, + utils, + eventType, + `${prefix + key}`, + val, + output, + columnTypes, + options, + true, ); } else if (isObject(input[key]) && (options.sourceCategory !== 'cloud' || level < 3)) { setDataFromInputAndComputeColumnTypes( - utils, - eventType, - output, - input[key], - columnTypes, - options, - `${prefix + key}_`, - level + 1, + utils, + eventType, + output, + input[key], + columnTypes, + options, + `${completePrefix + key}_`, + completeLevel + 1, + `${prefix + key}_`, + level + 1, ); } else { let val = input[key]; @@ -245,13 +252,13 @@ function setDataFromInputAndComputeColumnTypes( val = JSON.stringify(val); } appendColumnNameAndType( - utils, - eventType, - `${prefix + key}`, - val, - output, - columnTypes, - options, + utils, + eventType, + `${prefix + key}`, + val, + output, + columnTypes, + options, ); } }); @@ -316,12 +323,15 @@ function storeRudderEvent(utils, message, output, columnTypes, options) { function addJsonKeysToOptions(options) { // Add json key paths from integration options and destination config const jsonPaths = Array.isArray(options.integrationOptions?.jsonPaths) - ? options.integrationOptions.jsonPaths - : []; + ? options.integrationOptions.jsonPaths + : []; if (options.destJsonPaths) { jsonPaths.push(...options.destJsonPaths.split(',')); } - options.jsonKeys = getKeysFromJsonPaths(jsonPaths); + + const keys = keysFromJsonPaths(jsonPaths); + options.jsonPathKeys = keys.jsonPathKeys; + options.jsonLegacyPathKeys = keys.jsonLegacyPathKeys; } /* @@ -583,6 +593,8 @@ function processWarehouseMessage(message, options) { message.context, commonColumnTypes, options, + `${eventType + '_context_'}`, + 2, 'context_', ); @@ -605,6 +617,8 @@ function processWarehouseMessage(message, options) { message.properties, eventTableColumnTypes, options, + `${eventType + '_properties_'}`, + 2, ); setDataFromColumnMappingAndComputeColumnTypes( utils, @@ -658,6 +672,8 @@ function processWarehouseMessage(message, options) { message.context, commonColumnTypes, options, + `${eventType + '_context_'}`, + 2, 'context_', ); setDataFromColumnMappingAndComputeColumnTypes( @@ -732,6 +748,8 @@ function processWarehouseMessage(message, options) { message.properties, eventTableColumnTypes, options, + `${eventType + '_properties_'}`, + 2, ); setDataFromInputAndComputeColumnTypes( utils, @@ -740,6 +758,8 @@ function processWarehouseMessage(message, options) { message.userProperties, eventTableColumnTypes, options, + `${eventType + '_userProperties_'}`, + 2, ); setDataFromColumnMappingAndComputeColumnTypes( utils, @@ -794,6 +814,8 @@ function processWarehouseMessage(message, options) { message.userProperties, commonColumnTypes, options, + `${eventType + '_userProperties_'}`, + 2, ); setDataFromInputAndComputeColumnTypes( utils, @@ -802,6 +824,8 @@ function processWarehouseMessage(message, options) { message.context ? message.context.traits : {}, commonColumnTypes, options, + `${eventType + '_context_traits_'}`, + 3, ); setDataFromInputAndComputeColumnTypes( utils, @@ -810,6 +834,8 @@ function processWarehouseMessage(message, options) { message.traits, commonColumnTypes, options, + `${eventType + '_traits_'}`, + 2, '', ); @@ -821,6 +847,8 @@ function processWarehouseMessage(message, options) { message.context, commonColumnTypes, options, + `${eventType + '_context_'}`, + 2, 'context_', ); @@ -925,6 +953,8 @@ function processWarehouseMessage(message, options) { message.properties, columnTypes, options, + `${eventType + '_properties_'}`, + 2, ); // set rudder properties after user set properties to prevent overwriting setDataFromInputAndComputeColumnTypes( @@ -934,6 +964,8 @@ function processWarehouseMessage(message, options) { message.context, columnTypes, options, + `${eventType + '_context_'}`, + 2, 'context_', ); setDataFromColumnMappingAndComputeColumnTypes( @@ -992,6 +1024,8 @@ function processWarehouseMessage(message, options) { message.traits, columnTypes, options, + `${eventType + '_traits_'}`, + 2, ); setDataFromInputAndComputeColumnTypes( utils, @@ -1000,6 +1034,8 @@ function processWarehouseMessage(message, options) { message.context, columnTypes, options, + `${eventType + '_context_'}`, + 2, 'context_', ); setDataFromColumnMappingAndComputeColumnTypes( @@ -1046,6 +1082,8 @@ function processWarehouseMessage(message, options) { message.traits, columnTypes, options, + `${eventType + '_traits_'}`, + 2, ); setDataFromInputAndComputeColumnTypes( utils, @@ -1054,6 +1092,8 @@ function processWarehouseMessage(message, options) { message.context, columnTypes, options, + `${eventType + '_context_'}`, + 2, 'context_', ); setDataFromColumnMappingAndComputeColumnTypes( diff --git a/src/warehouse/util.js b/src/warehouse/util.js index b965ecb029..db81d11cbd 100644 --- a/src/warehouse/util.js +++ b/src/warehouse/util.js @@ -15,26 +15,69 @@ const isObject = (value) => { return value != null && (type === 'object' || type === 'function') && !Array.isArray(value); }; -const isValidJsonPathKey = (eventType, key, val, level, jsonKeys = {}) => { +const isValidJsonPathKey = (key, level, jsonKeys = {}) => { + return jsonKeys[key] === level; +}; +const isValidLegacyJsonPathKey = (eventType, key, level, jsonKeys = {}) => { return eventType === 'track' && jsonKeys[key] === level; }; const isBlank = (value) => { return _.isEmpty(_.toString(value)); }; + /* - * input => ["a", "b.c"] - * output => { "a": 0, "b_c": 1} +This function takes in an array of json paths and returns an object with keys as the json path and value as the position of the key in the json path +Example: +Input: +[ + "a", + "b.c" +] +Output: +{ + "a": 0, + "b_c": 1 +} + +Input: +[ + "track.context.a", + "track.properties.b", + "pages.properties.c.d", + "groups.traits.e.f" +] +Output: +{ + "track_context_a": 2, + "track_properties_b": 2, + "pages_properties_c_d": 3, + "groups_traits_e_f": 3 +} */ -const getKeysFromJsonPaths = (jsonPaths) => { - const jsonKeys = {}; +const keysFromJsonPaths = (jsonPaths) => { + const jsonPathKeys = {}; + const jsonLegacyPathKeys = {}; + + const supportedEventPrefixes = ['track.', 'identify.', 'page.', 'screen.', 'alias.', 'group.', 'extract.']; + jsonPaths.forEach((jsonPath) => { - if (jsonPath.trim()) { - const paths = jsonPath.trim().split('.'); - jsonKeys[paths.join('_')] = paths.length - 1; + const trimmedJSONPath = jsonPath.trim(); + if (!trimmedJSONPath) { + return; + } + + const paths = trimmedJSONPath.split('.'); + const key = paths.join('_'); + const pos = paths.length - 1; + + if (supportedEventPrefixes.some(prefix => trimmedJSONPath.startsWith(prefix))) { + jsonPathKeys[key] = pos; + return; } + jsonLegacyPathKeys[key] = pos; }); - return jsonKeys; + return {jsonPathKeys, jsonLegacyPathKeys}; }; // https://www.myintervals.com/blog/2009/05/20/iso-8601-date-validation-that-doesnt-suck/ @@ -98,7 +141,8 @@ module.exports = { isObject, isBlank, isValidJsonPathKey, - getKeysFromJsonPaths, + isValidLegacyJsonPathKey, + keysFromJsonPaths, timestampRegex, validTimestamp, getVersionedUtils, diff --git a/test/__mocks__/data/google_adwords_offline_conversion/response.json b/test/__mocks__/data/google_adwords_offline_conversion/response.json index d9e763c3ac..285ef56509 100644 --- a/test/__mocks__/data/google_adwords_offline_conversion/response.json +++ b/test/__mocks__/data/google_adwords_offline_conversion/response.json @@ -1,17 +1,17 @@ { - "https://googleads.googleapis.com/v13/customers/11122233331/offlineUserDataJobs:create": { + "https://googleads.googleapis.com/v14/customers/11122233331/offlineUserDataJobs:create": { "data": { "resourceName": "customers/111-222-3333/offlineUserDataJobs/OFFLINE_USER_DATA_JOB_ID_FOR_ADD_FAILURE" }, "status": 200 }, - "https://googleads.googleapis.com/v13/customers/1112223333/offlineUserDataJobs:create": { + "https://googleads.googleapis.com/v14/customers/1112223333/offlineUserDataJobs:create": { "data": { "resourceName": "customers/111-222-3333/offlineUserDataJobs/OFFLINE_USER_DATA_JOB_ID" }, "status": 200 }, - "https://googleads.googleapis.com/v13/customers/customerid/offlineUserDataJobs:create": { + "https://googleads.googleapis.com/v14/customers/customerid/offlineUserDataJobs:create": { "status": 401, "data": { "error": { @@ -21,11 +21,11 @@ } } }, - "https://googleads.googleapis.com/v13/customers/1112223333/offlineUserDataJobs/OFFLINE_USER_DATA_JOB_ID:addOperations": { + "https://googleads.googleapis.com/v14/customers/1112223333/offlineUserDataJobs/OFFLINE_USER_DATA_JOB_ID:addOperations": { "status": 200, "data": {} }, - "https://googleads.googleapis.com/v13/customers/11122233331/offlineUserDataJobs/OFFLINE_USER_DATA_JOB_ID_FOR_ADD_FAILURE:addOperations": { + "https://googleads.googleapis.com/v14/customers/11122233331/offlineUserDataJobs/OFFLINE_USER_DATA_JOB_ID_FOR_ADD_FAILURE:addOperations": { "status": 400, "data": { "error": { @@ -34,7 +34,7 @@ "status": "INVALID_ARGUMENT", "details": [ { - "@type": "type.googleapis.com/google.ads.googleads.v13.errors.GoogleAdsFailure", + "@type": "type.googleapis.com/google.ads.googleads.v14.errors.GoogleAdsFailure", "errors": [ { "errorCode": { @@ -67,13 +67,13 @@ } } }, - "https://googleads.googleapis.com/v13/customers/1112223333/offlineUserDataJobs/OFFLINE_USER_DATA_JOB_ID:run": { + "https://googleads.googleapis.com/v14/customers/1112223333/offlineUserDataJobs/OFFLINE_USER_DATA_JOB_ID:run": { "status": 200, "data": { "name": "customers/111-222-3333/operations/abcd=" } }, - "https://googleads.googleapis.com/v13/customers/customerid/offlineUserDataJobs/OFFLINE_USER_DATA_JOB_ID_ADD_FAILURE:addOperations": { + "https://googleads.googleapis.com/v14/customers/customerid/offlineUserDataJobs/OFFLINE_USER_DATA_JOB_ID_ADD_FAILURE:addOperations": { "status": 400, "data": { "error": { @@ -82,7 +82,7 @@ "status": "INVALID_ARGUMENT", "details": [ { - "@type": "type.googleapis.com/google.ads.googleads.v13.errors.GoogleAdsFailure", + "@type": "type.googleapis.com/google.ads.googleads.v14.errors.GoogleAdsFailure", "errors": [ { "errorCode": { diff --git a/test/__mocks__/data/google_adwords_remarketing_lists/proxy_response.json b/test/__mocks__/data/google_adwords_remarketing_lists/proxy_response.json index 93689bb0cb..246ba7f9fb 100644 --- a/test/__mocks__/data/google_adwords_remarketing_lists/proxy_response.json +++ b/test/__mocks__/data/google_adwords_remarketing_lists/proxy_response.json @@ -1,23 +1,23 @@ { - "https://googleads.googleapis.com/v13/customers/7693729833/offlineUserDataJobs:create": { + "https://googleads.googleapis.com/v14/customers/7693729833/offlineUserDataJobs:create": { "status": 200, "data": { "resourceName": "customers/9249589672/offlineUserDataJobs/18025019461" } }, - "https://googleads.googleapis.com/v13/customers/7693729833/offlineUserDataJobs/18025019461:addOperations": { + "https://googleads.googleapis.com/v14/customers/7693729833/offlineUserDataJobs/18025019461:addOperations": { "status": 200 }, - "https://googleads.googleapis.com/v13/customers/7693729833/offlineUserDataJobs/18025019461:run": { + "https://googleads.googleapis.com/v14/customers/7693729833/offlineUserDataJobs/18025019461:run": { "status": 200 }, - "https://googleads.googleapis.com/v13/customers/7693729834/offlineUserDataJobs:create": { + "https://googleads.googleapis.com/v14/customers/7693729834/offlineUserDataJobs:create": { "status": 200, "data": { "resourceName": "customers/9249589672/offlineUserDataJobs/18025019462" } }, - "https://googleads.googleapis.com/v13/customers/7693729834/offlineUserDataJobs/18025019462:addOperations": { + "https://googleads.googleapis.com/v14/customers/7693729834/offlineUserDataJobs/18025019462:addOperations": { "response": { "data": { "error": { @@ -60,7 +60,7 @@ "status": 400 } }, - "https://googleads.googleapis.com/v13/customers/1234567890/googleAds:searchStream": { + "https://googleads.googleapis.com/v14/customers/1234567890/googleAds:searchStream": { "response": { "data": [ { @@ -74,11 +74,11 @@ "status": 401 } }, - "https://googleads.googleapis.com/v13/customers/1234567899/googleAds:searchStream": { + "https://googleads.googleapis.com/v14/customers/1234567899/googleAds:searchStream": { "response": "", "code": "ECONNREFUSED" }, - "https://googleads.googleapis.com/v13/customers/1234567891/googleAds:searchStream": { + "https://googleads.googleapis.com/v14/customers/1234567891/googleAds:searchStream": { "data": [ { "results": [ @@ -95,7 +95,7 @@ ], "status": 200 }, - "https://googleads.googleapis.com/v13/customers/1234567891:uploadConversionAdjustments": { + "https://googleads.googleapis.com/v14/customers/1234567891:uploadConversionAdjustments": { "data": [ { "adjustmentType": "ENHANCEMENT", diff --git a/test/__mocks__/data/marketo_static_list/proxy_response.json b/test/__mocks__/data/marketo_static_list/proxy_response.json index 5c00ced941..2a58d99da2 100644 --- a/test/__mocks__/data/marketo_static_list/proxy_response.json +++ b/test/__mocks__/data/marketo_static_list/proxy_response.json @@ -1,4 +1,31 @@ { + "https://marketo_acct_id_success.mktorest.com/rest/v1/lists/1234/leads.json?id=110&id=111&id=112": { + "data": { + "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 + }, + "status": 200 + }, "https://marketo_acct_id_success.mktorest.com/rest/v1/lists/1234/leads.json?id=1&id=2&id=3": { "data": { "requestId": "68d8#1846058ee27", @@ -60,14 +87,13 @@ "status": "skipped", "reasons": [ { - "code": "1004", - "message": "Lead not found" + "code": "1015", + "message": "Lead not in list" } ] }, - "success": true }, "status": 200 } -} +} \ No newline at end of file diff --git a/test/__tests__/data/customerio_input.json b/test/__tests__/data/customerio_input.json index 337a1e51e6..ea89411524 100644 --- a/test/__tests__/data/customerio_input.json +++ b/test/__tests__/data/customerio_input.json @@ -15,7 +15,7 @@ }, "destination": { "Config": { - "datacenterEU": false, + "datacenter": "US", "siteID": "46be54768e7d49ab2628", "apiKey": "dummyApiKey" } @@ -87,7 +87,7 @@ }, "destination": { "Config": { - "datacenterEU": false, + "datacenter": "US", "siteID": "46be54768e7d49ab2628" } } @@ -158,7 +158,7 @@ }, "destination": { "Config": { - "datacenterEU": false, + "datacenter": "US", "siteID": "46be54768e7d49ab2628", "apiKey": "dummyApiKey" } @@ -227,7 +227,7 @@ }, "destination": { "Config": { - "datacenterEU": false, + "datacenter": "US", "siteID": "46be54768e7d49ab2628", "apiKey": "dummyApiKey" } @@ -298,7 +298,7 @@ }, "destination": { "Config": { - "datacenterEU": false, + "datacenter": "US", "siteID": "46be54768e7d49ab2628", "apiKey": "dummyApiKey" } @@ -353,7 +353,7 @@ }, "destination": { "Config": { - "datacenterEU": false, + "datacenter": "US", "siteID": "46be54768e7d49ab2628", "apiKey": "dummyApiKey" } @@ -406,7 +406,7 @@ }, "destination": { "Config": { - "datacenterEU": false, + "datacenter": "US", "siteID": "46be54768e7d49ab2628", "apiKey": "dummyApiKey" } @@ -459,7 +459,7 @@ }, "destination": { "Config": { - "datacenterEU": false, + "datacenter": "US", "siteID": "46be54768e7d49ab2628", "apiKey": "dummyApiKey" } @@ -511,7 +511,7 @@ }, "destination": { "Config": { - "datacenterEU": false, + "datacenter": "US", "siteID": "46be54768e7d49ab2628", "apiKey": "dummyApiKey" } @@ -580,7 +580,7 @@ }, "destination": { "Config": { - "datacenterEU": false, + "datacenter": "US", "siteID": "46be54768e7d49ab2628", "apiKey": "dummyApiKey" } @@ -649,7 +649,7 @@ }, "destination": { "Config": { - "datacenterEU": false, + "datacenter": "US", "siteID": "46be54768e7d49ab2628", "apiKey": "dummyApiKey" } @@ -709,7 +709,7 @@ }, "destination": { "Config": { - "datacenterEU": false, + "datacenter": "US", "siteID": "46be54768e7d49ab2628", "apiKey": "dummyApiKey" } @@ -768,7 +768,7 @@ }, "destination": { "Config": { - "datacenterEU": false, + "datacenter": "US", "siteID": "46be54768e7d49ab2628", "apiKey": "dummyApiKey" } @@ -826,7 +826,7 @@ }, "destination": { "Config": { - "datacenterEU": false, + "datacenter": "US", "siteID": "46be54768e7d49ab2628", "apiKey": "dummyApiKey" } @@ -885,7 +885,7 @@ }, "destination": { "Config": { - "datacenterEU": false, + "datacenter": "US", "siteID": "46be54768e7d49ab2628", "apiKey": "dummyApiKey" } @@ -943,7 +943,7 @@ }, "destination": { "Config": { - "datacenterEU": false, + "datacenter": "US", "siteID": "46be54768e7d49ab2628", "apiKey": "dummyApiKey" } @@ -1003,7 +1003,7 @@ }, "destination": { "Config": { - "datacenterEU": false, + "datacenter": "US", "siteID": "46be54768e7d49ab2628", "apiKey": "dummyApiKey" } @@ -1062,7 +1062,7 @@ }, "destination": { "Config": { - "datacenterEU": false, + "datacenter": "US", "siteID": "46be54768e7d49ab2628", "apiKey": "dummyApiKey" } @@ -1121,7 +1121,7 @@ }, "destination": { "Config": { - "datacenterEU": false, + "datacenter": "US", "siteID": "46be54768e7d49ab2628", "apiKey": "dummyApiKey" } @@ -1181,7 +1181,7 @@ }, "destination": { "Config": { - "datacenterEU": false, + "datacenter": "US", "siteID": "46be54768e7d49ab2628", "apiKey": "dummyApiKey" } @@ -1241,7 +1241,7 @@ }, "destination": { "Config": { - "datacenterEU": false, + "datacenter": "US", "siteID": "46be54768e7d49ab2628", "apiKey": "dummyApiKey" } @@ -1312,7 +1312,7 @@ }, "destination": { "Config": { - "datacenterEU": true, + "datacenter": "EU", "siteID": "46be54768e7d49ab2628", "apiKey": "dummyApiKey" } @@ -1367,7 +1367,7 @@ }, "destination": { "Config": { - "datacenterEU": true, + "datacenter": "EU", "siteID": "46be54768e7d49ab2628", "apiKey": "dummyApiKey" } @@ -1420,7 +1420,7 @@ }, "destination": { "Config": { - "datacenterEU": true, + "datacenter": "EU", "siteID": "46be54768e7d49ab2628", "apiKey": "dummyApiKey" } @@ -1473,7 +1473,7 @@ }, "destination": { "Config": { - "datacenterEU": true, + "datacenter": "EU", "siteID": "46be54768e7d49ab2628", "apiKey": "dummyApiKey" } @@ -1525,7 +1525,7 @@ }, "destination": { "Config": { - "datacenterEU": true, + "datacenter": "EU", "siteID": "46be54768e7d49ab2628", "apiKey": "dummyApiKey" } @@ -1594,7 +1594,7 @@ }, "destination": { "Config": { - "datacenterEU": true, + "datacenter": "EU", "siteID": "46be54768e7d49ab2628", "apiKey": "dummyApiKey" } @@ -1663,7 +1663,7 @@ }, "destination": { "Config": { - "datacenterEU": true, + "datacenter": "EU", "siteID": "46be54768e7d49ab2628", "apiKey": "dummyApiKey" } @@ -1723,7 +1723,7 @@ }, "destination": { "Config": { - "datacenterEU": true, + "datacenter": "EU", "siteID": "46be54768e7d49ab2628", "apiKey": "dummyApiKey" } @@ -1781,7 +1781,7 @@ }, "destination": { "Config": { - "datacenterEU": true, + "datacenter": "EU", "siteID": "46be54768e7d49ab2628", "apiKey": "dummyApiKey" } @@ -1840,7 +1840,7 @@ }, "destination": { "Config": { - "datacenterEU": true, + "datacenter": "EU", "siteID": "46be54768e7d49ab2628", "apiKey": "dummyApiKey" } @@ -1898,7 +1898,7 @@ }, "destination": { "Config": { - "datacenterEU": true, + "datacenter": "EU", "siteID": "46be54768e7d49ab2628", "apiKey": "dummyApiKey" } @@ -1958,7 +1958,7 @@ }, "destination": { "Config": { - "datacenterEU": true, + "datacenter": "EU", "siteID": "46be54768e7d49ab2628", "apiKey": "dummyApiKey" } @@ -2017,7 +2017,7 @@ }, "destination": { "Config": { - "datacenterEU": true, + "datacenter": "EU", "siteID": "46be54768e7d49ab2628", "apiKey": "dummyApiKey" } @@ -2076,7 +2076,7 @@ }, "destination": { "Config": { - "datacenterEU": true, + "datacenter": "EU", "siteID": "46be54768e7d49ab2628", "apiKey": "dummyApiKey" } @@ -2136,7 +2136,7 @@ }, "destination": { "Config": { - "datacenterEU": true, + "datacenter": "EU", "siteID": "46be54768e7d49ab2628", "apiKey": "dummyApiKey" } @@ -2196,7 +2196,7 @@ }, "destination": { "Config": { - "datacenterEU": true, + "datacenter": "EU", "siteID": "46be54768e7d49ab2628", "apiKey": "dummyApiKey" } @@ -2247,7 +2247,7 @@ }, "destination": { "Config": { - "datacenterEU": false, + "datacenter": "US", "siteID": "46be54768e7d49ab2628", "apiKey": "dummyApiKey" } @@ -2299,7 +2299,7 @@ }, "destination": { "Config": { - "datacenterEU": false, + "datacenter": "US", "siteID": "46be54768e7d49ab2628", "apiKey": "dummyApiKey" } @@ -2350,7 +2350,7 @@ }, "destination": { "Config": { - "datacenterEU": false, + "datacenter": "US", "siteID": "46be54768e7d49ab2628", "apiKey": "dummyApiKey" } @@ -2402,7 +2402,7 @@ }, "destination": { "Config": { - "datacenterEU": false, + "datacenter": "US", "siteID": "46be54768e7d49ab2628", "apiKey": "dummyApiKey" } @@ -2467,7 +2467,7 @@ }, "destination": { "Config": { - "datacenterEU": false, + "datacenter": "US", "siteID": "abc", "apiKey": "xyz" } @@ -2533,7 +2533,7 @@ }, "destination": { "Config": { - "datacenterEU": true, + "datacenter": "EU", "siteID": "46be54768e7d49ab2628", "apiKey": "dummyApiKey" } @@ -2584,11 +2584,21 @@ "DisplayName": "Customer IO", "Config": { "destConfig": { - "defaultConfig": ["apiKey", "siteID", "datacenterEU"], - "web": ["useNativeSDK"] + "defaultConfig": [ + "apiKey", + "siteID", + "datacenterEU" + ], + "web": [ + "useNativeSDK" + ] }, "excludeKeys": [], - "includeKeys": ["apiKey", "siteID", "datacenterEU"], + "includeKeys": [ + "apiKey", + "siteID", + "datacenterEU" + ], "saveDestinationResponse": true, "secretKeys": [], "supportedSourceTypes": [ @@ -2608,7 +2618,7 @@ }, "Config": { "apiKey": "a292d85ac36de15fc219", - "datacenterEU": false, + "datacenter": "US", "siteID": "eead090ab9e2e35004dc" }, "Enabled": true, @@ -2664,11 +2674,21 @@ "DisplayName": "Customer IO", "Config": { "destConfig": { - "defaultConfig": ["apiKey", "siteID", "datacenterEU"], - "web": ["useNativeSDK"] + "defaultConfig": [ + "apiKey", + "siteID", + "datacenterEU" + ], + "web": [ + "useNativeSDK" + ] }, "excludeKeys": [], - "includeKeys": ["apiKey", "siteID", "datacenterEU"], + "includeKeys": [ + "apiKey", + "siteID", + "datacenterEU" + ], "saveDestinationResponse": true, "secretKeys": [], "supportedSourceTypes": [ @@ -2688,7 +2708,7 @@ }, "Config": { "apiKey": "a292d85ac36de15fc219", - "datacenterEU": false, + "datacenter": "US", "siteID": "eead090ab9e2e35004dc" }, "Enabled": true, @@ -2784,8 +2804,17 @@ "DisplayName": "Customer IO", "Config": { "destConfig": { - "defaultConfig": ["apiKey", "siteID", "datacenterEU", "deviceTokenEventName"], - "web": ["useNativeSDK", "blackListedEvents", "whiteListedEvents"] + "defaultConfig": [ + "apiKey", + "siteID", + "datacenterEU", + "deviceTokenEventName" + ], + "web": [ + "useNativeSDK", + "blackListedEvents", + "whiteListedEvents" + ] }, "excludeKeys": [], "includeKeys": [ @@ -2797,7 +2826,12 @@ ], "saveDestinationResponse": true, "secretKeys": [], - "supportedMessageTypes": ["identify", "page", "screen", "track"], + "supportedMessageTypes": [ + "identify", + "page", + "screen", + "track" + ], "supportedSourceTypes": [ "android", "ios", @@ -2818,7 +2852,7 @@ }, "Config": { "apiKey": "DESAU SAI", - "datacenterEU": false, + "datacenter": "US", "deviceTokenEventName": "device_token_registered", "siteID": "DESU SAI" }, @@ -2911,8 +2945,17 @@ "DisplayName": "Customer IO", "Config": { "destConfig": { - "defaultConfig": ["apiKey", "siteID", "datacenterEU", "deviceTokenEventName"], - "web": ["useNativeSDK", "blackListedEvents", "whiteListedEvents"] + "defaultConfig": [ + "apiKey", + "siteID", + "datacenterEU", + "deviceTokenEventName" + ], + "web": [ + "useNativeSDK", + "blackListedEvents", + "whiteListedEvents" + ] }, "excludeKeys": [], "includeKeys": [ @@ -2924,7 +2967,12 @@ ], "saveDestinationResponse": true, "secretKeys": [], - "supportedMessageTypes": ["identify", "page", "screen", "track"], + "supportedMessageTypes": [ + "identify", + "page", + "screen", + "track" + ], "supportedSourceTypes": [ "android", "ios", @@ -2945,7 +2993,7 @@ }, "Config": { "apiKey": "DESAU SAI", - "datacenterEU": false, + "datacenter": "US", "deviceTokenEventName": "device_token_registered", "siteID": "DESU SAI" }, @@ -3037,8 +3085,17 @@ "DisplayName": "Customer IO", "Config": { "destConfig": { - "defaultConfig": ["apiKey", "siteID", "datacenterEU", "deviceTokenEventName"], - "web": ["useNativeSDK", "blackListedEvents", "whiteListedEvents"] + "defaultConfig": [ + "apiKey", + "siteID", + "datacenterEU", + "deviceTokenEventName" + ], + "web": [ + "useNativeSDK", + "blackListedEvents", + "whiteListedEvents" + ] }, "excludeKeys": [], "includeKeys": [ @@ -3050,7 +3107,12 @@ ], "saveDestinationResponse": true, "secretKeys": [], - "supportedMessageTypes": ["identify", "page", "screen", "track"], + "supportedMessageTypes": [ + "identify", + "page", + "screen", + "track" + ], "supportedSourceTypes": [ "android", "ios", @@ -3071,7 +3133,7 @@ }, "Config": { "apiKey": "DESAU SAI", - "datacenterEU": false, + "datacenter": "US", "deviceTokenEventName": "device_token_registered", "siteID": "DESU SAI" }, @@ -3163,8 +3225,17 @@ "DisplayName": "Customer IO", "Config": { "destConfig": { - "defaultConfig": ["apiKey", "siteID", "datacenterEU", "deviceTokenEventName"], - "web": ["useNativeSDK", "blackListedEvents", "whiteListedEvents"] + "defaultConfig": [ + "apiKey", + "siteID", + "datacenterEU", + "deviceTokenEventName" + ], + "web": [ + "useNativeSDK", + "blackListedEvents", + "whiteListedEvents" + ] }, "excludeKeys": [], "includeKeys": [ @@ -3176,7 +3247,12 @@ ], "saveDestinationResponse": true, "secretKeys": [], - "supportedMessageTypes": ["identify", "page", "screen", "track"], + "supportedMessageTypes": [ + "identify", + "page", + "screen", + "track" + ], "supportedSourceTypes": [ "android", "ios", @@ -3197,7 +3273,7 @@ }, "Config": { "apiKey": "DESAU SAI", - "datacenterEU": false, + "datacenter": "US", "deviceTokenEventName": "device_token_registered", "siteID": "DESU SAI" }, @@ -3286,8 +3362,17 @@ "DisplayName": "Customer IO", "Config": { "destConfig": { - "defaultConfig": ["apiKey", "siteID", "datacenterEU", "deviceTokenEventName"], - "web": ["useNativeSDK", "blackListedEvents", "whiteListedEvents"] + "defaultConfig": [ + "apiKey", + "siteID", + "datacenterEU", + "deviceTokenEventName" + ], + "web": [ + "useNativeSDK", + "blackListedEvents", + "whiteListedEvents" + ] }, "excludeKeys": [], "includeKeys": [ @@ -3299,7 +3384,12 @@ ], "saveDestinationResponse": true, "secretKeys": [], - "supportedMessageTypes": ["identify", "page", "screen", "track"], + "supportedMessageTypes": [ + "identify", + "page", + "screen", + "track" + ], "supportedSourceTypes": [ "android", "ios", @@ -3320,7 +3410,7 @@ }, "Config": { "apiKey": "DESAU SAI", - "datacenterEU": false, + "datacenter": "US", "deviceTokenEventName": "device_token_registered", "siteID": "DESU SAI" }, @@ -3413,8 +3503,17 @@ "DisplayName": "Customer IO", "Config": { "destConfig": { - "defaultConfig": ["apiKey", "siteID", "datacenterEU", "deviceTokenEventName"], - "web": ["useNativeSDK", "blackListedEvents", "whiteListedEvents"] + "defaultConfig": [ + "apiKey", + "siteID", + "datacenterEU", + "deviceTokenEventName" + ], + "web": [ + "useNativeSDK", + "blackListedEvents", + "whiteListedEvents" + ] }, "excludeKeys": [], "includeKeys": [ @@ -3426,7 +3525,12 @@ ], "saveDestinationResponse": true, "secretKeys": [], - "supportedMessageTypes": ["identify", "page", "screen", "track"], + "supportedMessageTypes": [ + "identify", + "page", + "screen", + "track" + ], "supportedSourceTypes": [ "android", "ios", @@ -3447,7 +3551,7 @@ }, "Config": { "apiKey": "DESAU SAI", - "datacenterEU": false, + "datacenter": "US", "deviceTokenEventName": "device_token_registered", "siteID": "DESU SAI" }, @@ -3540,8 +3644,17 @@ "DisplayName": "Customer IO", "Config": { "destConfig": { - "defaultConfig": ["apiKey", "siteID", "datacenterEU", "deviceTokenEventName"], - "web": ["useNativeSDK", "blackListedEvents", "whiteListedEvents"] + "defaultConfig": [ + "apiKey", + "siteID", + "datacenterEU", + "deviceTokenEventName" + ], + "web": [ + "useNativeSDK", + "blackListedEvents", + "whiteListedEvents" + ] }, "excludeKeys": [], "includeKeys": [ @@ -3553,7 +3666,12 @@ ], "saveDestinationResponse": true, "secretKeys": [], - "supportedMessageTypes": ["identify", "page", "screen", "track"], + "supportedMessageTypes": [ + "identify", + "page", + "screen", + "track" + ], "supportedSourceTypes": [ "android", "ios", @@ -3574,7 +3692,7 @@ }, "Config": { "apiKey": "DESAU SAI", - "datacenterEU": false, + "datacenter": "US", "deviceTokenEventName": "device_token_registered", "siteID": "DESU SAI" }, @@ -3667,8 +3785,17 @@ "DisplayName": "Customer IO", "Config": { "destConfig": { - "defaultConfig": ["apiKey", "siteID", "datacenterEU", "deviceTokenEventName"], - "web": ["useNativeSDK", "blackListedEvents", "whiteListedEvents"] + "defaultConfig": [ + "apiKey", + "siteID", + "datacenterEU", + "deviceTokenEventName" + ], + "web": [ + "useNativeSDK", + "blackListedEvents", + "whiteListedEvents" + ] }, "excludeKeys": [], "includeKeys": [ @@ -3680,7 +3807,12 @@ ], "saveDestinationResponse": true, "secretKeys": [], - "supportedMessageTypes": ["identify", "page", "screen", "track"], + "supportedMessageTypes": [ + "identify", + "page", + "screen", + "track" + ], "supportedSourceTypes": [ "android", "ios", @@ -3701,7 +3833,7 @@ }, "Config": { "apiKey": "DESAU SAI", - "datacenterEU": false, + "datacenter": "US", "deviceTokenEventName": "device_token_registered", "siteID": "DESU SAI" }, @@ -3793,8 +3925,17 @@ "DisplayName": "Customer IO", "Config": { "destConfig": { - "defaultConfig": ["apiKey", "siteID", "datacenterEU", "deviceTokenEventName"], - "web": ["useNativeSDK", "blackListedEvents", "whiteListedEvents"] + "defaultConfig": [ + "apiKey", + "siteID", + "datacenterEU", + "deviceTokenEventName" + ], + "web": [ + "useNativeSDK", + "blackListedEvents", + "whiteListedEvents" + ] }, "excludeKeys": [], "includeKeys": [ @@ -3806,7 +3947,12 @@ ], "saveDestinationResponse": true, "secretKeys": [], - "supportedMessageTypes": ["identify", "page", "screen", "track"], + "supportedMessageTypes": [ + "identify", + "page", + "screen", + "track" + ], "supportedSourceTypes": [ "android", "ios", @@ -3827,7 +3973,7 @@ }, "Config": { "apiKey": "DESAU SAI", - "datacenterEU": false, + "datacenter": "US", "deviceTokenEventName": "device_token_registered", "siteID": "DESU SAI" }, @@ -3916,8 +4062,17 @@ "DisplayName": "Customer IO", "Config": { "destConfig": { - "defaultConfig": ["apiKey", "siteID", "datacenterEU", "deviceTokenEventName"], - "web": ["useNativeSDK", "blackListedEvents", "whiteListedEvents"] + "defaultConfig": [ + "apiKey", + "siteID", + "datacenterEU", + "deviceTokenEventName" + ], + "web": [ + "useNativeSDK", + "blackListedEvents", + "whiteListedEvents" + ] }, "excludeKeys": [], "includeKeys": [ @@ -3929,7 +4084,12 @@ ], "saveDestinationResponse": true, "secretKeys": [], - "supportedMessageTypes": ["identify", "page", "screen", "track"], + "supportedMessageTypes": [ + "identify", + "page", + "screen", + "track" + ], "supportedSourceTypes": [ "android", "ios", @@ -3950,7 +4110,7 @@ }, "Config": { "apiKey": "DESAU SAI", - "datacenterEU": false, + "datacenter": "US", "deviceTokenEventName": "device_token_registered", "siteID": "DESU SAI" }, @@ -4043,8 +4203,17 @@ "DisplayName": "Customer IO", "Config": { "destConfig": { - "defaultConfig": ["apiKey", "siteID", "datacenterEU", "deviceTokenEventName"], - "web": ["useNativeSDK", "blackListedEvents", "whiteListedEvents"] + "defaultConfig": [ + "apiKey", + "siteID", + "datacenterEU", + "deviceTokenEventName" + ], + "web": [ + "useNativeSDK", + "blackListedEvents", + "whiteListedEvents" + ] }, "excludeKeys": [], "includeKeys": [ @@ -4056,7 +4225,12 @@ ], "saveDestinationResponse": true, "secretKeys": [], - "supportedMessageTypes": ["identify", "page", "screen", "track"], + "supportedMessageTypes": [ + "identify", + "page", + "screen", + "track" + ], "supportedSourceTypes": [ "android", "ios", @@ -4077,7 +4251,7 @@ }, "Config": { "apiKey": "DESAU SAI", - "datacenterEU": false, + "datacenter": "US", "deviceTokenEventName": "device_token_registered", "siteID": "DESU SAI" }, @@ -4134,8 +4308,17 @@ "DisplayName": "Customer IO", "Config": { "destConfig": { - "defaultConfig": ["apiKey", "siteID", "datacenterEU", "deviceTokenEventName"], - "web": ["useNativeSDK", "blackListedEvents", "whiteListedEvents"] + "defaultConfig": [ + "apiKey", + "siteID", + "datacenterEU", + "deviceTokenEventName" + ], + "web": [ + "useNativeSDK", + "blackListedEvents", + "whiteListedEvents" + ] }, "excludeKeys": [], "includeKeys": [ @@ -4147,7 +4330,12 @@ ], "saveDestinationResponse": true, "secretKeys": [], - "supportedMessageTypes": ["identify", "page", "screen", "track"], + "supportedMessageTypes": [ + "identify", + "page", + "screen", + "track" + ], "supportedSourceTypes": [ "android", "ios", @@ -4168,7 +4356,7 @@ }, "Config": { "apiKey": "ef32c3f60fb98f39ef35", - "datacenterEU": false, + "datacenter": "US", "deviceTokenEventName": "device_token_registered", "siteID": "c0efdbd20b9fbe24a7e2" }, @@ -4225,8 +4413,17 @@ "DisplayName": "Customer IO", "Config": { "destConfig": { - "defaultConfig": ["apiKey", "siteID", "datacenterEU", "deviceTokenEventName"], - "web": ["useNativeSDK", "blackListedEvents", "whiteListedEvents"] + "defaultConfig": [ + "apiKey", + "siteID", + "datacenterEU", + "deviceTokenEventName" + ], + "web": [ + "useNativeSDK", + "blackListedEvents", + "whiteListedEvents" + ] }, "excludeKeys": [], "includeKeys": [ @@ -4238,7 +4435,12 @@ ], "saveDestinationResponse": true, "secretKeys": [], - "supportedMessageTypes": ["identify", "page", "screen", "track"], + "supportedMessageTypes": [ + "identify", + "page", + "screen", + "track" + ], "supportedSourceTypes": [ "android", "ios", @@ -4259,7 +4461,7 @@ }, "Config": { "apiKey": "ef32c3f60fb98f39ef35", - "datacenterEU": false, + "datacenter": "US", "deviceTokenEventName": "device_token_registered", "siteID": "c0efdbd20b9fbe24a7e2" }, @@ -4319,8 +4521,17 @@ "DisplayName": "Customer IO", "Config": { "destConfig": { - "defaultConfig": ["apiKey", "siteID", "datacenterEU", "deviceTokenEventName"], - "web": ["useNativeSDK", "blackListedEvents", "whiteListedEvents"] + "defaultConfig": [ + "apiKey", + "siteID", + "datacenterEU", + "deviceTokenEventName" + ], + "web": [ + "useNativeSDK", + "blackListedEvents", + "whiteListedEvents" + ] }, "excludeKeys": [], "includeKeys": [ @@ -4332,7 +4543,12 @@ ], "saveDestinationResponse": true, "secretKeys": [], - "supportedMessageTypes": ["identify", "page", "screen", "track"], + "supportedMessageTypes": [ + "identify", + "page", + "screen", + "track" + ], "supportedSourceTypes": [ "android", "ios", @@ -4353,7 +4569,7 @@ }, "Config": { "apiKey": "ef32c3f60fb98f39ef35", - "datacenterEU": false, + "datacenter": "US", "deviceTokenEventName": "device_token_registered", "siteID": "c0efdbd20b9fbe24a7e2" }, @@ -4413,8 +4629,17 @@ "DisplayName": "Customer IO", "Config": { "destConfig": { - "defaultConfig": ["apiKey", "siteID", "datacenterEU", "deviceTokenEventName"], - "web": ["useNativeSDK", "blackListedEvents", "whiteListedEvents"] + "defaultConfig": [ + "apiKey", + "siteID", + "datacenterEU", + "deviceTokenEventName" + ], + "web": [ + "useNativeSDK", + "blackListedEvents", + "whiteListedEvents" + ] }, "excludeKeys": [], "includeKeys": [ @@ -4426,7 +4651,12 @@ ], "saveDestinationResponse": true, "secretKeys": [], - "supportedMessageTypes": ["identify", "page", "screen", "track"], + "supportedMessageTypes": [ + "identify", + "page", + "screen", + "track" + ], "supportedSourceTypes": [ "android", "ios", @@ -4447,7 +4677,7 @@ }, "Config": { "apiKey": "ef32c3f60fb98f39ef35", - "datacenterEU": false, + "datacenter": "US", "deviceTokenEventName": "device_token_registered", "siteID": "c0efdbd20b9fbe24a7e2" }, @@ -4508,8 +4738,17 @@ "DisplayName": "Customer IO", "Config": { "destConfig": { - "defaultConfig": ["apiKey", "siteID", "datacenterEU", "deviceTokenEventName"], - "web": ["useNativeSDK", "blackListedEvents", "whiteListedEvents"] + "defaultConfig": [ + "apiKey", + "siteID", + "datacenterEU", + "deviceTokenEventName" + ], + "web": [ + "useNativeSDK", + "blackListedEvents", + "whiteListedEvents" + ] }, "excludeKeys": [], "includeKeys": [ @@ -4521,7 +4760,12 @@ ], "saveDestinationResponse": true, "secretKeys": [], - "supportedMessageTypes": ["identify", "page", "screen", "track"], + "supportedMessageTypes": [ + "identify", + "page", + "screen", + "track" + ], "supportedSourceTypes": [ "android", "ios", @@ -4542,7 +4786,7 @@ }, "Config": { "apiKey": "ef32c3f60fb98f39ef35", - "datacenterEU": false, + "datacenter": "US", "deviceTokenEventName": "device_token_registered", "siteID": "c0efdbd20b9fbe24a7e2" }, @@ -4603,8 +4847,17 @@ "DisplayName": "Customer IO", "Config": { "destConfig": { - "defaultConfig": ["apiKey", "siteID", "datacenterEU", "deviceTokenEventName"], - "web": ["useNativeSDK", "blackListedEvents", "whiteListedEvents"] + "defaultConfig": [ + "apiKey", + "siteID", + "datacenterEU", + "deviceTokenEventName" + ], + "web": [ + "useNativeSDK", + "blackListedEvents", + "whiteListedEvents" + ] }, "excludeKeys": [], "includeKeys": [ @@ -4616,7 +4869,12 @@ ], "saveDestinationResponse": true, "secretKeys": [], - "supportedMessageTypes": ["identify", "page", "screen", "track"], + "supportedMessageTypes": [ + "identify", + "page", + "screen", + "track" + ], "supportedSourceTypes": [ "android", "ios", @@ -4637,7 +4895,7 @@ }, "Config": { "apiKey": "ef32c3f60fb98f39ef35", - "datacenterEU": false, + "datacenter": "US", "deviceTokenEventName": "device_token_registered", "siteID": "c0efdbd20b9fbe24a7e2" }, @@ -4698,8 +4956,17 @@ "DisplayName": "Customer IO", "Config": { "destConfig": { - "defaultConfig": ["apiKey", "siteID", "datacenterEU", "deviceTokenEventName"], - "web": ["useNativeSDK", "blackListedEvents", "whiteListedEvents"] + "defaultConfig": [ + "apiKey", + "siteID", + "datacenterEU", + "deviceTokenEventName" + ], + "web": [ + "useNativeSDK", + "blackListedEvents", + "whiteListedEvents" + ] }, "excludeKeys": [], "includeKeys": [ @@ -4711,7 +4978,12 @@ ], "saveDestinationResponse": true, "secretKeys": [], - "supportedMessageTypes": ["identify", "page", "screen", "track"], + "supportedMessageTypes": [ + "identify", + "page", + "screen", + "track" + ], "supportedSourceTypes": [ "android", "ios", @@ -4732,7 +5004,7 @@ }, "Config": { "apiKey": "ef32c3f60fb98f39ef35", - "datacenterEU": true, + "datacenter": "EU", "deviceTokenEventName": "device_token_registered", "siteID": "c0efdbd20b9fbe24a7e2" }, @@ -4789,7 +5061,7 @@ }, "destination": { "Config": { - "datacenterEU": false, + "datacenter": "US", "siteID": "46be54768e7d49ab2628", "apiKey": "dummyApiKey" } @@ -4842,7 +5114,7 @@ }, "destination": { "Config": { - "datacenterEU": false, + "datacenter": "US", "siteID": "46be54768e7d49ab2628", "apiKey": "dummyApiKey" } @@ -4889,10 +5161,10 @@ }, "destination": { "Config": { - "datacenterEU": false, + "datacenter": "US", "siteID": "46be54768e7d49ab2628", "apiKey": "dummyApiKey" } } } -] +] \ No newline at end of file diff --git a/test/__tests__/data/fullstory.json b/test/__tests__/data/fullstory.json new file mode 100644 index 0000000000..b6e462005b --- /dev/null +++ b/test/__tests__/data/fullstory.json @@ -0,0 +1,354 @@ +[ + { + "description": "Complete track event", + "input": { + "message": { + "anonymousId": "78c53c15-32a1-4b65-adac-bec2d7bb8fab", + "channel": "web", + "context": { + "app": { + "name": "RSPM", + "version": "1.9.0" + }, + "campaign": { + "name": "sales campaign", + "source": "google", + "medium": "medium", + "term": "event data", + "content": "Make sense of the modern data stack" + }, + "ip": "192.0.2.0", + "library": { + "name": "RudderLabs JavaScript SDK", + "version": "2.9.1" + }, + "locale": "en-US", + "device": { + "manufacturer": "Nokia", + "model": "N2023" + }, + "page": { + "path": "/best-seller/1", + "initial_referrer": "https://www.google.com/search", + "initial_referring_domain": "google.com", + "referrer": "https://www.google.com/search?q=estore+bestseller", + "referring_domain": "google.com", + "search": "estore bestseller", + "title": "The best sellers offered by EStore", + "url": "https://www.estore.com/best-seller/1" + }, + "screen": { + "density": 420, + "height": 1794, + "width": 1080, + "innerHeight": 200, + "innerWidth": 100 + }, + "userAgent": "Dalvik/2.1.0 (Linux; U; Android 9; Android SDK built for x86 Build/PSR1.180720.075)" + }, + "event": "Product Reviewed", + "integrations": { + "All": true + }, + "messageId": "1578564113557-af022c68-429e-4af4-b99b-2b9174056383", + "properties": { + "userId": "u001", + "sessionId": "s001", + "review_id": "review_id_1", + "product_id": "product_id_1", + "rating": 5.0, + "review_body": "Sample Review Body", + "latitude": 44.56, + "longitude": 54.46, + "region": "Atlas", + "city": "NY", + "country": "USA" + }, + "originalTimestamp": "2020-01-09T10:01:53.558Z", + "type": "track", + "sentAt": "2020-01-09T10:02:03.257Z" + }, + "destination": { + "ID": "1pYpzzvcn7AQ2W9GGIAZSsN6Mfq", + "Name": "Fullstory", + "DestinationDefinition": { + "Config": { + "cdkV2Enabled": true + } + }, + "Config": { + "apiKey": "dummyfullstoryAPIKey" + }, + "Enabled": true, + "Transformations": [] + }, + "metadata": { + "sourceType": "fddf", + "destinationType": "fdf", + "k8_namespace": "fdfd" + } + }, + "output": { + "body": { + "JSON": { + "name": "Product Reviewed", + "properties": { + "userId": "u001", + "sessionId": "s001", + "review_id": "review_id_1", + "product_id": "product_id_1", + "rating": 5, + "review_body": "Sample Review Body", + "latitude": 44.56, + "longitude": 54.46, + "region": "Atlas", + "city": "NY", + "country": "USA" + }, + "timestamp": "2020-01-09T10:01:53.558Z", + "context": { + "browser": { + "url": "https://www.estore.com/best-seller/1", + "user_agent": "Dalvik/2.1.0 (Linux; U; Android 9; Android SDK built for x86 Build/PSR1.180720.075)", + "initial_referrer": "https://www.google.com/search" + }, + "mobile": { + "app_name": "RSPM", + "app_version": "1.9.0" + }, + "device": { + "manufacturer": "Nokia", + "model": "N2023" + }, + "location": { + "ip_address": "192.0.2.0", + "latitude": 44.56, + "longitude": 54.46, + "city": "NY", + "region": "Atlas", + "country": "USA" + } + }, + "session": { + "id": "s001" + }, + "user": { + "id": "u001" + } + }, + "JSON_ARRAY": {}, + "XML": {}, + "FORM": {} + }, + "method": "POST", + "params": {}, + "version": "1", + "type": "REST", + "endpoint": "https://api.fullstory.com/v2/events", + "headers": { + "authorization": "Basic dummyfullstoryAPIKey", + "content-type": "application/json" + }, + "files": {} + } + }, + { + "description": "Missing event name", + "input": { + "message": { + "channel": "web", + "context": { + "device": { + "manufacturer": "Nokia", + "model": "N2023" + }, + "userAgent": "Dalvik/2.1.0 (Linux; U; Android 9; Android SDK built for x86 Build/PSR1.180720.075)" + }, + "integrations": { + "All": true + }, + "properties": { + "userId": "u001", + "latitude": 44.56, + "longitude": 54.46, + "region": "Atlas", + "city": "NY", + "country": "USA" + }, + "originalTimestamp": "2020-01-09T10:01:53.558Z", + "type": "track", + "sentAt": "2020-01-09T10:02:03.257Z" + }, + "destination": { + "ID": "1pYpzzvcn7AQ2W9GGIAZSsN6Mfq", + "Name": "Fullstory", + "DestinationDefinition": { + "Config": { + "cdkV2Enabled": true + } + }, + "Config": { + "apiKey": "dummyfullstoryAPIKey" + }, + "Enabled": true, + "Transformations": [] + }, + "metadata": { + "sourceType": "fddf", + "destinationType": "fdf", + "k8_namespace": "fdfd" + } + }, + "output": { + "error": "event is required for track call: Workflow: procWorkflow, Step: validateEventName, ChildStep: undefined, OriginalError: event is required for track call" + } + }, + { + "description": "Complete identify event", + "input": { + "message": { + "userId": "dummy-user001", + "channel": "web", + "context": { + "traits": { + "company": "Initech", + "address": { + "country": "USA", + "state": "CA", + "street": "101 dummy street" + }, + "email": "dummyuser@domain.com", + "name": "dummy user", + "phone": "099-999-9999" + }, + "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36" + }, + "integrations": { + "All": true + }, + "originalTimestamp": "2020-01-27T12:20:55.301Z", + "receivedAt": "2020-01-27T17:50:58.657+05:30", + "request_ip": "14.98.244.60", + "sentAt": "2020-01-27T12:20:56.849Z", + "timestamp": "2020-01-27T17:50:57.109+05:30", + "type": "identify" + }, + "destination": { + "ID": "1pYpzzvcn7AQ2W9GGIAZSsN6Mfq", + "Name": "Fullstory", + "DestinationDefinition": { + "Config": { + "cdkV2Enabled": true + } + }, + "Config": { + "apiKey": "fullstoryAPIKey" + }, + "Enabled": true, + "Transformations": [] + }, + "metadata": { + "sourceType": "fddf", + "destinationType": "fdf", + "k8_namespace": "fdfd" + } + }, + "output": { + "body": { + "JSON": { + "properties": { + "company": "Initech", + "address": { + "country": "USA", + "state": "CA", + "street": "101 dummy street" + }, + "email": "dummyuser@domain.com", + "name": "dummy user", + "phone": "099-999-9999" + }, + "uid": "dummy-user001", + "email": "dummyuser@domain.com", + "display_name": "dummy user" + }, + "JSON_ARRAY": {}, + "XML": {}, + "FORM": {} + }, + "version": "1", + "type": "REST", + "method": "POST", + "endpoint": "https://api.fullstory.com/v2/users", + "headers": { + "authorization": "Basic fullstoryAPIKey", + "content-type": "application/json" + }, + "params": {}, + "files": {} + } + }, + { + "description": "Identify event with needed traits", + "input": { + "message": { + "userId": "dummy-user001", + "channel": "web", + "context": { + "traits": { + "email": "dummyuser@domain.com", + "name": "dummy user", + "phone": "099-999-9999" + } + }, + "timestamp": "2020-01-27T17:50:57.109+05:30", + "type": "identify" + }, + "destination": { + "ID": "1pYpzzvcn7AQ2W9GGIAZSsN6Mfq", + "Name": "Fullstory", + "DestinationDefinition": { + "Config": { + "cdkV2Enabled": true + } + }, + "Config": { + "apiKey": "fullstoryAPIKey" + }, + "Enabled": true, + "Transformations": [] + }, + "metadata": { + "sourceType": "fddf", + "destinationType": "fdf", + "k8_namespace": "fdfd" + } + }, + "output": { + "body": { + "JSON": { + "properties": { + "email": "dummyuser@domain.com", + "name": "dummy user", + "phone": "099-999-9999" + }, + "uid": "dummy-user001", + "email": "dummyuser@domain.com", + "display_name": "dummy user" + }, + "JSON_ARRAY": {}, + "XML": {}, + "FORM": {} + }, + "version": "1", + "type": "REST", + "method": "POST", + "endpoint": "https://api.fullstory.com/v2/users", + "headers": { + "authorization": "Basic fullstoryAPIKey", + "content-type": "application/json" + }, + "params": {}, + "files": {} + } + } +] diff --git a/test/__tests__/data/google_adwords_enhanced_conversions_output.json b/test/__tests__/data/google_adwords_enhanced_conversions_output.json index f90bcd5901..292a849673 100644 --- a/test/__tests__/data/google_adwords_enhanced_conversions_output.json +++ b/test/__tests__/data/google_adwords_enhanced_conversions_output.json @@ -3,7 +3,7 @@ "version": "1", "type": "REST", "method": "POST", - "endpoint": "https://googleads.googleapis.com/v13/customers/1234567890:uploadConversionAdjustments", + "endpoint": "https://googleads.googleapis.com/v14/customers/1234567890:uploadConversionAdjustments", "headers": { "Authorization": "Bearer abcd1234", "Content-Type": "application/json", @@ -91,7 +91,7 @@ "version": "1", "type": "REST", "method": "POST", - "endpoint": "https://googleads.googleapis.com/v13/customers/1234567890:uploadConversionAdjustments", + "endpoint": "https://googleads.googleapis.com/v14/customers/1234567890:uploadConversionAdjustments", "headers": { "Authorization": "Bearer abcd1234", "Content-Type": "application/json", @@ -177,7 +177,7 @@ "secret": null }, "statusCode": 400, - "error": "Empty/Invalid access token", + "error": "OAuth - access token not found", "statTags": { "destination": "google_adwords_enhanced_conversions", "stage": "transform", @@ -204,7 +204,7 @@ "version": "1", "type": "REST", "method": "POST", - "endpoint": "https://googleads.googleapis.com/v13/customers/1234567890:uploadConversionAdjustments", + "endpoint": "https://googleads.googleapis.com/v14/customers/1234567890:uploadConversionAdjustments", "headers": { "Authorization": "Bearer abcd1234", "Content-Type": "application/json", @@ -260,7 +260,7 @@ "version": "1", "type": "REST", "method": "POST", - "endpoint": "https://googleads.googleapis.com/v13/customers/1234567890:uploadConversionAdjustments", + "endpoint": "https://googleads.googleapis.com/v14/customers/1234567890:uploadConversionAdjustments", "headers": { "Authorization": "Bearer abcd1234", "Content-Type": "application/json", diff --git a/test/__tests__/data/google_adwords_enhanced_conversions_proxy_input.json b/test/__tests__/data/google_adwords_enhanced_conversions_proxy_input.json index d9d0575355..612efeb99a 100644 --- a/test/__tests__/data/google_adwords_enhanced_conversions_proxy_input.json +++ b/test/__tests__/data/google_adwords_enhanced_conversions_proxy_input.json @@ -3,7 +3,7 @@ "version": "1", "type": "REST", "method": "POST", - "endpoint": "https://googleads.googleapis.com/v13/customers/1234567890:uploadConversionAdjustments", + "endpoint": "https://googleads.googleapis.com/v14/customers/1234567890:uploadConversionAdjustments", "headers": { "Authorization": "Bearer abcd1234", "Content-Type": "application/json", @@ -56,7 +56,7 @@ "version": "1", "type": "REST", "method": "POST", - "endpoint": "https://googleads.googleapis.com/v13/customers/1234567899:uploadConversionAdjustments", + "endpoint": "https://googleads.googleapis.com/v14/customers/1234567899:uploadConversionAdjustments", "headers": { "Authorization": "Bearer abcd1234", "Content-Type": "application/json", @@ -109,7 +109,7 @@ "version": "1", "type": "REST", "method": "POST", - "endpoint": "https://googleads.googleapis.com/v13/customers/1234567891:uploadConversionAdjustments", + "endpoint": "https://googleads.googleapis.com/v14/customers/1234567891:uploadConversionAdjustments", "headers": { "Authorization": "Bearer abcd1234", "Content-Type": "application/json", diff --git a/test/__tests__/data/google_adwords_enhanced_conversions_router_output.json b/test/__tests__/data/google_adwords_enhanced_conversions_router_output.json index 6ddec019e3..c283549e50 100644 --- a/test/__tests__/data/google_adwords_enhanced_conversions_router_output.json +++ b/test/__tests__/data/google_adwords_enhanced_conversions_router_output.json @@ -4,7 +4,7 @@ "version": "1", "type": "REST", "method": "POST", - "endpoint": "https://googleads.googleapis.com/v13/customers/1234567890:uploadConversionAdjustments", + "endpoint": "https://googleads.googleapis.com/v14/customers/1234567890:uploadConversionAdjustments", "headers": { "Authorization": "Bearer abcd1234", "Content-Type": "application/json", @@ -137,7 +137,7 @@ }, "batched": false, "statusCode": 500, - "error": "Empty/Invalid access token", + "error": "OAuth - access token not found", "statTags": { "errorCategory": "platform", "errorType": "oAuthSecret" diff --git a/test/__tests__/data/google_adwords_offline_conversions.json b/test/__tests__/data/google_adwords_offline_conversions.json index 53c0f9bf3e..9bdb5cda45 100644 --- a/test/__tests__/data/google_adwords_offline_conversions.json +++ b/test/__tests__/data/google_adwords_offline_conversions.json @@ -159,7 +159,7 @@ "version": "1", "type": "REST", "method": "POST", - "endpoint": "https://googleads.googleapis.com/v13/customers/9625812972:uploadClickConversions", + "endpoint": "https://googleads.googleapis.com/v14/customers/9625812972:uploadClickConversions", "headers": { "Authorization": "Bearer abcd1234", "Content-Type": "application/json", @@ -418,7 +418,7 @@ "version": "1", "type": "REST", "method": "POST", - "endpoint": "https://googleads.googleapis.com/v13/customers/9625812972:uploadClickConversions", + "endpoint": "https://googleads.googleapis.com/v14/customers/9625812972:uploadClickConversions", "headers": { "Authorization": "Bearer abcd1234", "Content-Type": "application/json", @@ -677,7 +677,7 @@ "version": "1", "type": "REST", "method": "POST", - "endpoint": "https://googleads.googleapis.com/v13/customers/9625812972:uploadClickConversions", + "endpoint": "https://googleads.googleapis.com/v14/customers/9625812972:uploadClickConversions", "headers": { "Authorization": "Bearer abcd1234", "Content-Type": "application/json", @@ -936,7 +936,7 @@ "version": "1", "type": "REST", "method": "POST", - "endpoint": "https://googleads.googleapis.com/v13/customers/9625812972:uploadCallConversions", + "endpoint": "https://googleads.googleapis.com/v14/customers/9625812972:uploadCallConversions", "headers": { "Authorization": "Bearer abcd1234", "Content-Type": "application/json", @@ -1796,7 +1796,7 @@ "version": "1", "type": "REST", "method": "POST", - "endpoint": "https://googleads.googleapis.com/v13/customers/9625812972:uploadClickConversions", + "endpoint": "https://googleads.googleapis.com/v14/customers/9625812972:uploadClickConversions", "headers": { "Authorization": "Bearer abcd1234", "Content-Type": "application/json", @@ -1896,7 +1896,7 @@ "version": "1", "type": "REST", "method": "POST", - "endpoint": "https://googleads.googleapis.com/v13/customers/9625812972:uploadCallConversions", + "endpoint": "https://googleads.googleapis.com/v14/customers/9625812972:uploadCallConversions", "headers": { "Authorization": "Bearer abcd1234", "Content-Type": "application/json", @@ -2090,7 +2090,7 @@ "version": "1", "type": "REST", "method": "POST", - "endpoint": "https://googleads.googleapis.com/v13/customers/9625812972:uploadClickConversions", + "endpoint": "https://googleads.googleapis.com/v14/customers/9625812972:uploadClickConversions", "headers": { "Authorization": "Bearer abcd1234", "Content-Type": "application/json", @@ -2257,7 +2257,7 @@ "version": "1", "type": "REST", "method": "POST", - "endpoint": "https://googleads.googleapis.com/v13/customers/9625812972:uploadCallConversions", + "endpoint": "https://googleads.googleapis.com/v14/customers/9625812972:uploadCallConversions", "headers": { "Authorization": "Bearer abcd1234", "Content-Type": "application/json", @@ -2461,7 +2461,7 @@ "version": "1", "type": "REST", "method": "POST", - "endpoint": "https://googleads.googleapis.com/v13/customers/9625812972:uploadCallConversions", + "endpoint": "https://googleads.googleapis.com/v14/customers/9625812972:uploadCallConversions", "headers": { "Authorization": "Bearer abcd1234", "Content-Type": "application/json", @@ -2651,7 +2651,7 @@ "version": "1", "type": "REST", "method": "POST", - "endpoint": "https://googleads.googleapis.com/v13/customers/9625812972:uploadClickConversions", + "endpoint": "https://googleads.googleapis.com/v14/customers/9625812972:uploadClickConversions", "headers": { "Authorization": "Bearer abcd1234", "Content-Type": "application/json", @@ -3077,7 +3077,7 @@ "version": "1", "type": "REST", "method": "POST", - "endpoint": "https://googleads.googleapis.com/v13/customers/9625812972:uploadClickConversions", + "endpoint": "https://googleads.googleapis.com/v14/customers/9625812972:uploadClickConversions", "headers": { "Authorization": "Bearer abcd1234", "Content-Type": "application/json", @@ -3383,7 +3383,7 @@ "version": "1", "type": "REST", "method": "POST", - "endpoint": "https://googleads.googleapis.com/v13/customers/9625812972:uploadClickConversions", + "endpoint": "https://googleads.googleapis.com/v14/customers/9625812972:uploadClickConversions", "headers": { "Authorization": "Bearer abcd1234", "Content-Type": "application/json", @@ -3544,7 +3544,7 @@ "version": "1", "type": "REST", "method": "POST", - "endpoint": "https://googleads.googleapis.com/v13/customers/1112223333/offlineUserDataJobs", + "endpoint": "https://googleads.googleapis.com/v14/customers/1112223333/offlineUserDataJobs", "headers": { "Authorization": "Bearer abcd1234", "Content-Type": "application/json", @@ -3827,7 +3827,7 @@ "version": "1", "type": "REST", "method": "POST", - "endpoint": "https://googleads.googleapis.com/v13/customers/1112223333/offlineUserDataJobs", + "endpoint": "https://googleads.googleapis.com/v14/customers/1112223333/offlineUserDataJobs", "headers": { "Authorization": "Bearer abcd1234", "Content-Type": "application/json", @@ -3993,7 +3993,7 @@ "version": "1", "type": "REST", "method": "POST", - "endpoint": "https://googleads.googleapis.com/v13/customers/1112223333/offlineUserDataJobs", + "endpoint": "https://googleads.googleapis.com/v14/customers/1112223333/offlineUserDataJobs", "headers": { "Authorization": "Bearer abcd1234", "Content-Type": "application/json", @@ -4163,7 +4163,7 @@ "version": "1", "type": "REST", "method": "POST", - "endpoint": "https://googleads.googleapis.com/v13/customers/1112223333/offlineUserDataJobs", + "endpoint": "https://googleads.googleapis.com/v14/customers/1112223333/offlineUserDataJobs", "headers": { "Authorization": "Bearer abcd1234", "Content-Type": "application/json", @@ -4294,7 +4294,7 @@ "version": "1", "type": "REST", "method": "POST", - "endpoint": "https://googleads.googleapis.com/v13/customers/1112223333/offlineUserDataJobs", + "endpoint": "https://googleads.googleapis.com/v14/customers/1112223333/offlineUserDataJobs", "headers": { "Authorization": "Bearer abcd1234", "Content-Type": "application/json", @@ -4421,7 +4421,7 @@ "version": "1", "type": "REST", "method": "POST", - "endpoint": "https://googleads.googleapis.com/v13/customers/1112223333/offlineUserDataJobs", + "endpoint": "https://googleads.googleapis.com/v14/customers/1112223333/offlineUserDataJobs", "headers": { "Authorization": "Bearer abcd1234", "Content-Type": "application/json", @@ -4546,7 +4546,7 @@ "version": "1", "type": "REST", "method": "POST", - "endpoint": "https://googleads.googleapis.com/v13/customers/1112223333/offlineUserDataJobs", + "endpoint": "https://googleads.googleapis.com/v14/customers/1112223333/offlineUserDataJobs", "headers": { "Authorization": "Bearer abcd1234", "Content-Type": "application/json", diff --git a/test/__tests__/data/google_adwords_offline_conversions_proxy_input.json b/test/__tests__/data/google_adwords_offline_conversions_proxy_input.json index a812fdbcc4..5a9f4e4126 100644 --- a/test/__tests__/data/google_adwords_offline_conversions_proxy_input.json +++ b/test/__tests__/data/google_adwords_offline_conversions_proxy_input.json @@ -5,7 +5,7 @@ "version": "1", "type": "REST", "method": "POST", - "endpoint": "https://googleads.googleapis.com/v13/customers/11122233331/offlineUserDataJobs", + "endpoint": "https://googleads.googleapis.com/v14/customers/11122233331/offlineUserDataJobs", "headers": { "Authorization": "Bearer abcd1234", "Content-Type": "application/json", @@ -75,7 +75,7 @@ "version": "1", "type": "REST", "method": "POST", - "endpoint": "https://googleads.googleapis.com/v13/customers/1112223333/offlineUserDataJobs", + "endpoint": "https://googleads.googleapis.com/v14/customers/1112223333/offlineUserDataJobs", "headers": { "Authorization": "Bearer abcd1234", "Content-Type": "application/json", @@ -145,7 +145,7 @@ "version": "1", "type": "REST", "method": "POST", - "endpoint": "https://googleads.googleapis.com/v13/customers/customerid/offlineUserDataJobs", + "endpoint": "https://googleads.googleapis.com/v14/customers/customerid/offlineUserDataJobs", "headers": { "Authorization": "Bearer abcd1234", "Content-Type": "application/json", @@ -215,7 +215,7 @@ "version": "1", "type": "REST", "method": "POST", - "endpoint": "https://googleads.googleapis.com/v13/customers/1234567890:uploadClickConversions", + "endpoint": "https://googleads.googleapis.com/v14/customers/1234567890:uploadClickConversions", "headers": { "Authorization": "Bearer abcd1234", "Content-Type": "application/json", @@ -320,7 +320,7 @@ "version": "1", "type": "REST", "method": "POST", - "endpoint": "https://googleads.googleapis.com/v13/customers/1234567891:uploadClickConversions", + "endpoint": "https://googleads.googleapis.com/v14/customers/1234567891:uploadClickConversions", "headers": { "Authorization": "Bearer abcd1234", "Content-Type": "application/json", @@ -425,7 +425,7 @@ "version": "1", "type": "REST", "method": "POST", - "endpoint": "https://googleads.googleapis.com/v13/customers/1234567891:uploadClickConversions", + "endpoint": "https://googleads.googleapis.com/v14/customers/1234567891:uploadClickConversions", "headers": { "Authorization": "Bearer abcd1234", "Content-Type": "application/json", diff --git a/test/__tests__/data/google_adwords_offline_conversions_proxy_output.json b/test/__tests__/data/google_adwords_offline_conversions_proxy_output.json index 2bdcaeea49..e6d298956f 100644 --- a/test/__tests__/data/google_adwords_offline_conversions_proxy_output.json +++ b/test/__tests__/data/google_adwords_offline_conversions_proxy_output.json @@ -8,7 +8,7 @@ "code": 400, "details": [ { - "@type": "type.googleapis.com/google.ads.googleads.v13.errors.GoogleAdsFailure", + "@type": "type.googleapis.com/google.ads.googleads.v14.errors.GoogleAdsFailure", "errors": [ { "errorCode": { diff --git a/test/__tests__/data/google_adwords_offline_conversions_router_output.json b/test/__tests__/data/google_adwords_offline_conversions_router_output.json index 87c4b671f7..16b07233e3 100644 --- a/test/__tests__/data/google_adwords_offline_conversions_router_output.json +++ b/test/__tests__/data/google_adwords_offline_conversions_router_output.json @@ -4,7 +4,7 @@ "version": "1", "type": "REST", "method": "POST", - "endpoint": "https://googleads.googleapis.com/v13/customers/7693729833/offlineUserDataJobs", + "endpoint": "https://googleads.googleapis.com/v14/customers/7693729833/offlineUserDataJobs", "headers": { "Authorization": "Bearer abcd1234", "Content-Type": "application/json", @@ -130,7 +130,7 @@ "version": "1", "type": "REST", "method": "POST", - "endpoint": "https://googleads.googleapis.com/v13/customers/9625812972:uploadClickConversions", + "endpoint": "https://googleads.googleapis.com/v14/customers/9625812972:uploadClickConversions", "headers": { "Authorization": "Bearer abcd1234", "Content-Type": "application/json", @@ -259,7 +259,7 @@ "version": "1", "type": "REST", "method": "POST", - "endpoint": "https://googleads.googleapis.com/v13/customers/9625812972:uploadCallConversions", + "endpoint": "https://googleads.googleapis.com/v14/customers/9625812972:uploadCallConversions", "headers": { "Authorization": "Bearer abcd1234", "Content-Type": "application/json", @@ -367,7 +367,7 @@ "version": "1", "type": "REST", "method": "POST", - "endpoint": "https://googleads.googleapis.com/v13/customers/7693729833:uploadCallConversions", + "endpoint": "https://googleads.googleapis.com/v14/customers/7693729833:uploadCallConversions", "headers": { "Authorization": "Bearer abcd1234", "Content-Type": "application/json", diff --git a/test/__tests__/data/google_adwords_remarketing_lists_output.json b/test/__tests__/data/google_adwords_remarketing_lists_output.json index 8c938bc3d3..cd92d314b6 100644 --- a/test/__tests__/data/google_adwords_remarketing_lists_output.json +++ b/test/__tests__/data/google_adwords_remarketing_lists_output.json @@ -4,7 +4,7 @@ "version": "1", "type": "REST", "method": "POST", - "endpoint": "https://googleads.googleapis.com/v13/customers/7693729833/offlineUserDataJobs", + "endpoint": "https://googleads.googleapis.com/v14/customers/7693729833/offlineUserDataJobs", "headers": { "Authorization": "Bearer dummy-access", "Content-Type": "application/json", @@ -52,7 +52,7 @@ "version": "1", "type": "REST", "method": "POST", - "endpoint": "https://googleads.googleapis.com/v13/customers/7693729833/offlineUserDataJobs", + "endpoint": "https://googleads.googleapis.com/v14/customers/7693729833/offlineUserDataJobs", "headers": { "Authorization": "Bearer dummy-access", "Content-Type": "application/json", @@ -90,7 +90,7 @@ "version": "1", "type": "REST", "method": "POST", - "endpoint": "https://googleads.googleapis.com/v13/customers/7693729833/offlineUserDataJobs", + "endpoint": "https://googleads.googleapis.com/v14/customers/7693729833/offlineUserDataJobs", "headers": { "Authorization": "Bearer dummy-access", "Content-Type": "application/json", @@ -197,7 +197,7 @@ "version": "1", "type": "REST", "method": "POST", - "endpoint": "https://googleads.googleapis.com/v13/customers/7693729833/offlineUserDataJobs", + "endpoint": "https://googleads.googleapis.com/v14/customers/7693729833/offlineUserDataJobs", "headers": { "Authorization": "Bearer dummy-access", "Content-Type": "application/json", @@ -1219,7 +1219,7 @@ "version": "1", "type": "REST", "method": "POST", - "endpoint": "https://googleads.googleapis.com/v13/customers/7693729833/offlineUserDataJobs", + "endpoint": "https://googleads.googleapis.com/v14/customers/7693729833/offlineUserDataJobs", "headers": { "Authorization": "Bearer dummy-access", "Content-Type": "application/json", @@ -1278,7 +1278,7 @@ "version": "1", "type": "REST", "method": "POST", - "endpoint": "https://googleads.googleapis.com/v13/customers/7693729833/offlineUserDataJobs", + "endpoint": "https://googleads.googleapis.com/v14/customers/7693729833/offlineUserDataJobs", "headers": { "Authorization": "Bearer dummy-access", "Content-Type": "application/json", @@ -1339,7 +1339,7 @@ "version": "1", "type": "REST", "method": "POST", - "endpoint": "https://googleads.googleapis.com/v13/customers/7693729833/offlineUserDataJobs", + "endpoint": "https://googleads.googleapis.com/v14/customers/7693729833/offlineUserDataJobs", "headers": { "Authorization": "Bearer dummy-access", "Content-Type": "application/json", @@ -2359,7 +2359,7 @@ "version": "1", "type": "REST", "method": "POST", - "endpoint": "https://googleads.googleapis.com/v13/customers/7693729833/offlineUserDataJobs", + "endpoint": "https://googleads.googleapis.com/v14/customers/7693729833/offlineUserDataJobs", "headers": { "Authorization": "Bearer dummy-access", "Content-Type": "application/json", @@ -3381,7 +3381,7 @@ "version": "1", "type": "REST", "method": "POST", - "endpoint": "https://googleads.googleapis.com/v13/customers/7693729833/offlineUserDataJobs", + "endpoint": "https://googleads.googleapis.com/v14/customers/7693729833/offlineUserDataJobs", "headers": { "Authorization": "Bearer dummy-access", "Content-Type": "application/json", @@ -3458,7 +3458,7 @@ "version": "1", "type": "REST", "method": "POST", - "endpoint": "https://googleads.googleapis.com/v13/customers/7693729833/offlineUserDataJobs", + "endpoint": "https://googleads.googleapis.com/v14/customers/7693729833/offlineUserDataJobs", "headers": { "Authorization": "Bearer dummy-access", "Content-Type": "application/json", @@ -4478,7 +4478,7 @@ "version": "1", "type": "REST", "method": "POST", - "endpoint": "https://googleads.googleapis.com/v13/customers/7693729833/offlineUserDataJobs", + "endpoint": "https://googleads.googleapis.com/v14/customers/7693729833/offlineUserDataJobs", "headers": { "Authorization": "Bearer dummy-access", "Content-Type": "application/json", @@ -5500,7 +5500,7 @@ "version": "1", "type": "REST", "method": "POST", - "endpoint": "https://googleads.googleapis.com/v13/customers/7693729833/offlineUserDataJobs", + "endpoint": "https://googleads.googleapis.com/v14/customers/7693729833/offlineUserDataJobs", "headers": { "Authorization": "Bearer dummy-access", "Content-Type": "application/json", @@ -5559,7 +5559,7 @@ "version": "1", "type": "REST", "method": "POST", - "endpoint": "https://googleads.googleapis.com/v13/customers/7693729833/offlineUserDataJobs", + "endpoint": "https://googleads.googleapis.com/v14/customers/7693729833/offlineUserDataJobs", "headers": { "Authorization": "Bearer dummy-access", "Content-Type": "application/json", @@ -5620,7 +5620,7 @@ "version": "1", "type": "REST", "method": "POST", - "endpoint": "https://googleads.googleapis.com/v13/customers/7693729833/offlineUserDataJobs", + "endpoint": "https://googleads.googleapis.com/v14/customers/7693729833/offlineUserDataJobs", "headers": { "Authorization": "Bearer dummy-access", "Content-Type": "application/json", @@ -5678,7 +5678,7 @@ "version": "1", "type": "REST", "method": "POST", - "endpoint": "https://googleads.googleapis.com/v13/customers/7693729833/offlineUserDataJobs", + "endpoint": "https://googleads.googleapis.com/v14/customers/7693729833/offlineUserDataJobs", "headers": { "Authorization": "Bearer dummy-access", "Content-Type": "application/json", @@ -5735,7 +5735,7 @@ "version": "1", "type": "REST", "method": "POST", - "endpoint": "https://googleads.googleapis.com/v13/customers/7693729833/offlineUserDataJobs", + "endpoint": "https://googleads.googleapis.com/v14/customers/7693729833/offlineUserDataJobs", "headers": { "Authorization": "Bearer dummy-access", "Content-Type": "application/json", @@ -5779,7 +5779,7 @@ "secret": null }, "statusCode": 500, - "error": "Empty/Invalid access token", + "error": "OAuth - access token not found", "statTags": { "destination": "google_adwords_remarketing_lists", "stage": "transform", @@ -5791,7 +5791,7 @@ "version": "1", "type": "REST", "method": "POST", - "endpoint": "https://googleads.googleapis.com/v13/customers/7693729833/offlineUserDataJobs", + "endpoint": "https://googleads.googleapis.com/v14/customers/7693729833/offlineUserDataJobs", "headers": { "Authorization": "Bearer dummy-access", "Content-Type": "application/json", @@ -5835,7 +5835,7 @@ "version": "1", "type": "REST", "method": "POST", - "endpoint": "https://googleads.googleapis.com/v13/customers/7693729833/offlineUserDataJobs", + "endpoint": "https://googleads.googleapis.com/v14/customers/7693729833/offlineUserDataJobs", "headers": { "Authorization": "Bearer dummy-access", "Content-Type": "application/json", @@ -5877,7 +5877,7 @@ "version": "1", "type": "REST", "method": "POST", - "endpoint": "https://googleads.googleapis.com/v13/customers/7693729833/offlineUserDataJobs", + "endpoint": "https://googleads.googleapis.com/v14/customers/7693729833/offlineUserDataJobs", "headers": { "Authorization": "Bearer dummy-access", "Content-Type": "application/json", diff --git a/test/__tests__/data/google_adwords_remarketing_lists_proxy_input.json b/test/__tests__/data/google_adwords_remarketing_lists_proxy_input.json index d9745e9f65..3cd282ec2a 100644 --- a/test/__tests__/data/google_adwords_remarketing_lists_proxy_input.json +++ b/test/__tests__/data/google_adwords_remarketing_lists_proxy_input.json @@ -3,7 +3,7 @@ "version": "1", "type": "REST", "method": "POST", - "endpoint": "https://googleads.googleapis.com/v13/customers/7693729833/offlineUserDataJobs", + "endpoint": "https://googleads.googleapis.com/v14/customers/7693729833/offlineUserDataJobs", "headers": { "Authorization": "Bearer dummy-access", "Content-Type": "application/json", @@ -53,7 +53,7 @@ "version": "1", "type": "REST", "method": "POST", - "endpoint": "https://googleads.googleapis.com/v13/customers/7693729834/offlineUserDataJobs", + "endpoint": "https://googleads.googleapis.com/v14/customers/7693729834/offlineUserDataJobs", "headers": { "Authorization": "Bearer dummy-access", "Content-Type": "application/json", @@ -89,7 +89,7 @@ "version": "1", "type": "REST", "method": "POST", - "endpoint": "https://googleads.googleapis.com/v13/customers/7693729833/offlineUserDataJobs", + "endpoint": "https://googleads.googleapis.com/v14/customers/7693729833/offlineUserDataJobs", "headers": { "Authorization": "Bearer dummy-access", "Content-Type": "application/json", diff --git a/test/__tests__/data/google_adwords_remarketing_lists_router_output.json b/test/__tests__/data/google_adwords_remarketing_lists_router_output.json index 0b5d5265f9..ff6755237f 100644 --- a/test/__tests__/data/google_adwords_remarketing_lists_router_output.json +++ b/test/__tests__/data/google_adwords_remarketing_lists_router_output.json @@ -5,7 +5,7 @@ "version": "1", "type": "REST", "method": "POST", - "endpoint": "https://googleads.googleapis.com/v13/customers/7693729833/offlineUserDataJobs", + "endpoint": "https://googleads.googleapis.com/v14/customers/7693729833/offlineUserDataJobs", "headers": { "Authorization": "Bearer abcd1234", "Content-Type": "application/json", @@ -76,7 +76,7 @@ "version": "1", "type": "REST", "method": "POST", - "endpoint": "https://googleads.googleapis.com/v13/customers/7693729833/offlineUserDataJobs", + "endpoint": "https://googleads.googleapis.com/v14/customers/7693729833/offlineUserDataJobs", "headers": { "Authorization": "Bearer abcd1234", "Content-Type": "application/json", @@ -136,7 +136,7 @@ "version": "1", "type": "REST", "method": "POST", - "endpoint": "https://googleads.googleapis.com/v13/customers/7693729833/offlineUserDataJobs", + "endpoint": "https://googleads.googleapis.com/v14/customers/7693729833/offlineUserDataJobs", "headers": { "Authorization": "Bearer abcd1234", "Content-Type": "application/json", @@ -207,7 +207,7 @@ "version": "1", "type": "REST", "method": "POST", - "endpoint": "https://googleads.googleapis.com/v13/customers/7693729833/offlineUserDataJobs", + "endpoint": "https://googleads.googleapis.com/v14/customers/7693729833/offlineUserDataJobs", "headers": { "Authorization": "Bearer abcd1234", "Content-Type": "application/json", @@ -250,7 +250,7 @@ "version": "1", "type": "REST", "method": "POST", - "endpoint": "https://googleads.googleapis.com/v13/customers/7693729833/offlineUserDataJobs", + "endpoint": "https://googleads.googleapis.com/v14/customers/7693729833/offlineUserDataJobs", "headers": { "Authorization": "Bearer abcd1234", "Content-Type": "application/json", diff --git a/test/__tests__/data/hs_output.json b/test/__tests__/data/hs_output.json index f26bfe8432..6167ea69f3 100644 --- a/test/__tests__/data/hs_output.json +++ b/test/__tests__/data/hs_output.json @@ -716,7 +716,7 @@ }, { "statusCode": 400, - "error": "'temp event' event name not found" + "error": "Event name 'temp event' mappings are not configured in the destination" }, { "statusCode": 400, diff --git a/test/__tests__/data/iterable.json b/test/__tests__/data/iterable.json index 2612978f88..08e83a47a5 100644 --- a/test/__tests__/data/iterable.json +++ b/test/__tests__/data/iterable.json @@ -3078,6 +3078,7 @@ }, "messageId": "node-570110489d3e99b234b18af9a9eca9d4-6009779e-82d7-469d-aaeb-5ccf162b0453", "properties": { + "id": "event1234", "subject": "resume validate", "sendtime": "2020-01-01", "sendlocation": "akashdeep@gmail.com" @@ -3102,9 +3103,11 @@ "JSON_ARRAY": {}, "FORM": {}, "JSON": { + "id": "event1234", "userId": "abcdeeeeeeeexxxx102", "createdAt": 1598631966468, "dataFields": { + "id": "event1234", "subject": "resume validate", "sendtime": "2020-01-01", "sendlocation": "akashdeep@gmail.com" diff --git a/test/__tests__/data/klaviyo.json b/test/__tests__/data/klaviyo.json index e3ce30c792..1fc46a6e4c 100644 --- a/test/__tests__/data/klaviyo.json +++ b/test/__tests__/data/klaviyo.json @@ -705,7 +705,7 @@ } }, { - "description": "Track event call", + "description": "Screen event call", "input": { "destination": { "Config": { @@ -800,13 +800,13 @@ "properties": { "PreviouslyVicePresident": true, "YearElected": 1801, - "VicePresidents": ["Aaron Burr", "George Clinton"], - "age": "22" + "VicePresidents": ["Aaron Burr", "George Clinton"] }, "profile": { "$email": "test@rudderstack.com", "$phone_number": "9112340375", - "$id": "sajal12" + "$id": "sajal12", + "age": "22" } } } @@ -863,7 +863,11 @@ "age": "22", "email": "test@rudderstack.com", "phone": "9112340375", - "anonymousId": "9c6bd77ea9da3e68" + "anonymousId": "9c6bd77ea9da3e68", + "plan_details": { + "plan_type": "gold", + "duration": "3 months" + } }, "library": { "name": "com.rudderstack.android.sdk.core", @@ -917,13 +921,15 @@ "properties": { "vicePresdentInfo.PreviouslVicePresident": true, "vicePresdentInfo.VicePresidents": ["AaronBurr", "GeorgeClinton"], - "vicePresdentInfo.YearElected": 1801, - "age": "22" + "vicePresdentInfo.YearElected": 1801 }, "profile": { "$email": "test@rudderstack.com", "$phone_number": "9112340375", - "$id": "sajal12" + "$id": "sajal12", + "age": "22", + "plan_details.plan_type": "gold", + "plan_details.duration": "3 months" } } } @@ -1034,15 +1040,15 @@ "properties": { "PreviouslyVicePresident": true, "YearElected": 1801, - "age": "22", - "VicePresidents": ["Aaron Burr", "George Clinton"], - "description": "Sample description", - "name": "Test" + "VicePresidents": ["Aaron Burr", "George Clinton"] }, "profile": { "$email": "test@rudderstack.com", "$phone_number": "9112340375", - "$id": "sajal12" + "$id": "sajal12", + "age": "22", + "name": "Test", + "description": "Sample description" }, "value": 3000 } @@ -1152,12 +1158,12 @@ "properties": { "PreviouslyVicePresident": true, "YearElected": 1801, - "VicePresidents": ["Aaron Burr", "George Clinton"], - "age": "22" + "VicePresidents": ["Aaron Burr", "George Clinton"] }, "profile": { "$email": "test@rudderstack.com", "$phone_number": "9112340375", + "age": "22", "_id": "sajal12" } } @@ -1483,7 +1489,10 @@ "profile": { "$email": "test@rudderstack.com", "$phone_number": "9112340375", - "$id": "sajal12" + "$id": "sajal12", + "age": "22", + "name": "Test", + "description": "Sample description" }, "properties": { "ProductName": "test product", @@ -1493,10 +1502,7 @@ "URL": "http://www.example.com/path/to/product", "Brand": "Not for Kids", "Price": 9.9, - "Categories": ["Fiction", "Children"], - "age": "22", - "name": "Test", - "description": "Sample description" + "Categories": ["Fiction", "Children"] } } } @@ -1633,9 +1639,6 @@ "properties": { "$event_id": "1234", "$value": 20, - "age": "22", - "name": "Test", - "description": "Sample description", "items[0].ProductID": "123", "items[0].SKU": "G-32", "items[0].ProductName": "Monopoly", @@ -1652,7 +1655,10 @@ "profile": { "$email": "test@rudderstack.com", "$phone_number": "9112340375", - "$id": "sajal12" + "$id": "sajal12", + "age": "22", + "name": "Test", + "description": "Sample description" } } } @@ -1780,16 +1786,16 @@ "profile": { "$email": "test@rudderstack.com", "$phone_number": "9112340375", - "$id": "sajal12" + "$id": "sajal12", + "age": "22", + "name": "Test", + "description": "Sample description" }, "properties": { "$value": 12.12, "AddedItemCategories": ["Fiction3", "Children3"], "ItemNames": ["book1", "book2"], "CheckoutURL": "http://www.heythere.com", - "age": "22", - "name": "Test", - "description": "Sample description", "items": [ { "ProductID": "b1pid", diff --git a/test/__tests__/data/launchdarkly_audience.json b/test/__tests__/data/launchdarkly_audience.json new file mode 100644 index 0000000000..2f348e01fa --- /dev/null +++ b/test/__tests__/data/launchdarkly_audience.json @@ -0,0 +1,495 @@ +[ + { + "description": "Unsupported event type", + "input": { + "message": { + "userId": "user123", + "type": "abc", + "properties": { + "listData": { + "add": [ + { + "identifier": "alex@email.com" + }, + { + "identifier": "ryan@email.com" + }, + { + "identifier": "van@email.com" + } + ] + } + }, + "context": { + "ip": "14.5.67.21", + "library": { + "name": "http" + } + }, + "timestamp": "2020-02-02T00:23:09.544Z" + }, + "destination": { + "Config": { + "audienceId": "test-audienceId", + "audienceName": "test-audienceName", + "accessToken": "test-accessToken", + "clientSideId": "test-clientSideId" + } + } + }, + "output": { + "error": "Event type abc is not supported. Aborting message." + } + }, + { + "description": "List data is not passed", + "input": { + "message": { + "userId": "user123", + "type": "audiencelist", + "properties": {}, + "context": { + "ip": "14.5.67.21", + "library": { + "name": "http" + } + }, + "timestamp": "2020-02-02T00:23:09.544Z" + }, + "destination": { + "Config": { + "audienceId": "test-audienceId", + "audienceName": "test-audienceName", + "accessToken": "test-accessToken", + "clientSideId": "test-clientSideId" + } + } + }, + "output": { + "error": "`listData` is not present inside properties. Aborting message." + } + }, + { + "description": "List data is empty", + "input": { + "message": { + "userId": "user123", + "type": "audiencelist", + "properties": { + "listData": {} + }, + "context": { + "ip": "14.5.67.21", + "library": { + "name": "http" + } + }, + "timestamp": "2020-02-02T00:23:09.544Z" + }, + "destination": { + "Config": { + "audienceId": "test-audienceId", + "audienceName": "test-audienceName", + "accessToken": "test-accessToken", + "clientSideId": "test-clientSideId" + } + } + }, + "output": { + "error": "`listData` is empty. Aborting message." + } + }, + { + "description": "List data is empty", + "input": { + "message": { + "userId": "user123", + "type": "audiencelist", + "properties": { + "listData": { + "add": [ + { + "identifier": "" + }, + { + "identifier": "" + } + ] + } + }, + "context": { + "ip": "14.5.67.21", + "library": { + "name": "http" + } + }, + "timestamp": "2020-02-02T00:23:09.544Z" + }, + "destination": { + "Config": { + "audienceId": "test-audienceId", + "audienceName": "test-audienceName", + "accessToken": "test-accessToken", + "clientSideId": "test-clientSideId" + } + } + }, + "output": { + "error": "`listData` is empty. Aborting message." + } + }, + { + "description": "Unsupported action type", + "input": { + "message": { + "userId": "user123", + "type": "audiencelist", + "properties": { + "listData": { + "update": [ + { + "identifier": "alex@email.com" + } + ] + } + }, + "context": { + "ip": "14.5.67.21", + "library": { + "name": "http" + } + }, + "timestamp": "2020-02-02T00:23:09.544Z" + }, + "destination": { + "Config": { + "audienceId": "test-audienceId", + "audienceName": "test-audienceName", + "accessToken": "test-accessToken", + "clientSideId": "test-clientSideId" + } + } + }, + "output": { + "error": "Unsupported action type. Aborting message." + } + }, + { + "description": "Add members to the audience list", + "input": { + "message": { + "userId": "user123", + "type": "audiencelist", + "properties": { + "listData": { + "add": [ + { + "identifier": "alex@email.com" + }, + { + "identifier": "ryan@email.com" + }, + { + "identifier": "van@email.com" + } + ] + } + }, + "context": { + "ip": "14.5.67.21", + "library": { + "name": "http" + } + }, + "timestamp": "2020-02-02T00:23:09.544Z" + }, + "destination": { + "Config": { + "audienceId": "test-audienceId", + "audienceName": "test-audienceName", + "accessToken": "test-accessToken", + "clientSideId": "test-clientSideId" + } + } + }, + "output": [ + { + "version": "1", + "type": "REST", + "method": "POST", + "endpoint": "https://app.launchdarkly.com/api/v2/segment-targets/rudderstack", + "headers": { + "Authorization": "test-accessToken", + "Content-Type": "application/json" + }, + "params": {}, + "body": { + "JSON": { + "environmentId": "test-clientSideId", + "cohortId": "test-audienceId", + "cohortName": "test-audienceName", + "listData": { + "add": [ + { + "id": "alex@email.com" + }, + { + "id": "ryan@email.com" + } + ], + "remove": [] + } + }, + "JSON_ARRAY": {}, + "XML": {}, + "FORM": {} + }, + "files": {} + }, + { + "version": "1", + "type": "REST", + "method": "POST", + "endpoint": "https://app.launchdarkly.com/api/v2/segment-targets/rudderstack", + "headers": { + "Authorization": "test-accessToken", + "Content-Type": "application/json" + }, + "params": {}, + "body": { + "JSON": { + "environmentId": "test-clientSideId", + "cohortId": "test-audienceId", + "cohortName": "test-audienceName", + "listData": { + "add": [ + { + "id": "van@email.com" + } + ], + "remove": [] + } + }, + "JSON_ARRAY": {}, + "XML": {}, + "FORM": {} + }, + "files": {} + } + ] + }, + { + "description": "Remove members from the audience list", + "input": { + "message": { + "userId": "user123", + "type": "audiencelist", + "properties": { + "listData": { + "remove": [ + { + "identifier": "alex@email.com" + }, + { + "identifier": "ryan@email.com" + }, + { + "identifier": "van@email.com" + } + ] + } + }, + "context": { + "ip": "14.5.67.21", + "library": { + "name": "http" + } + }, + "timestamp": "2020-02-02T00:23:09.544Z" + }, + "destination": { + "Config": { + "audienceId": "test-audienceId", + "audienceName": "test-audienceName", + "accessToken": "test-accessToken", + "clientSideId": "test-clientSideId" + } + } + }, + "output": [ + { + "version": "1", + "type": "REST", + "method": "POST", + "endpoint": "https://app.launchdarkly.com/api/v2/segment-targets/rudderstack", + "headers": { + "Authorization": "test-accessToken", + "Content-Type": "application/json" + }, + "params": {}, + "body": { + "JSON": { + "environmentId": "test-clientSideId", + "cohortId": "test-audienceId", + "cohortName": "test-audienceName", + "listData": { + "remove": [ + { + "id": "alex@email.com" + }, + { + "id": "ryan@email.com" + } + ], + "add": [] + } + }, + "JSON_ARRAY": {}, + "XML": {}, + "FORM": {} + }, + "files": {} + }, + { + "version": "1", + "type": "REST", + "method": "POST", + "endpoint": "https://app.launchdarkly.com/api/v2/segment-targets/rudderstack", + "headers": { + "Authorization": "test-accessToken", + "Content-Type": "application/json" + }, + "params": {}, + "body": { + "JSON": { + "environmentId": "test-clientSideId", + "cohortId": "test-audienceId", + "cohortName": "test-audienceName", + "listData": { + "remove": [ + { + "id": "van@email.com" + } + ], + "add": [] + } + }, + "JSON_ARRAY": {}, + "XML": {}, + "FORM": {} + }, + "files": {} + } + ] + }, + { + "description": "Add/Remove members", + "input": { + "message": { + "userId": "user123", + "type": "audiencelist", + "properties": { + "listData": { + "add": [ + { + "identifier": "alex@email.com" + }, + { + "userId": "user1" + } + ], + "remove": [ + { + "identifier": "ryan@email.com" + }, + { + "identifier": "van@email.com" + } + ] + } + }, + "context": { + "ip": "14.5.67.21", + "library": { + "name": "http" + } + }, + "timestamp": "2020-02-02T00:23:09.544Z" + }, + "destination": { + "Config": { + "audienceId": "test-audienceId", + "audienceName": "test-audienceName", + "accessToken": "test-accessToken", + "clientSideId": "test-clientSideId" + } + } + }, + "output": [ + { + "version": "1", + "type": "REST", + "method": "POST", + "endpoint": "https://app.launchdarkly.com/api/v2/segment-targets/rudderstack", + "headers": { + "Authorization": "test-accessToken", + "Content-Type": "application/json" + }, + "params": {}, + "body": { + "JSON": { + "environmentId": "test-clientSideId", + "cohortId": "test-audienceId", + "cohortName": "test-audienceName", + "listData": { + "add": [ + { + "id": "alex@email.com" + } + ], + "remove": [ + { + "id": "ryan@email.com" + } + ] + } + }, + "JSON_ARRAY": {}, + "XML": {}, + "FORM": {} + }, + "files": {} + }, + { + "version": "1", + "type": "REST", + "method": "POST", + "endpoint": "https://app.launchdarkly.com/api/v2/segment-targets/rudderstack", + "headers": { + "Authorization": "test-accessToken", + "Content-Type": "application/json" + }, + "params": {}, + "body": { + "JSON": { + "environmentId": "test-clientSideId", + "cohortId": "test-audienceId", + "cohortName": "test-audienceName", + "listData": { + "add": [], + "remove": [ + { + "id": "van@email.com" + } + ] + } + }, + "JSON_ARRAY": {}, + "XML": {}, + "FORM": {} + }, + "files": {} + } + ] + } +] diff --git a/test/__tests__/data/marketo_static_list_proxy_input.json b/test/__tests__/data/marketo_static_list_proxy_input.json index 85142d68d7..6f84e7416d 100644 --- a/test/__tests__/data/marketo_static_list_proxy_input.json +++ b/test/__tests__/data/marketo_static_list_proxy_input.json @@ -1,4 +1,24 @@ [ + { + "type": "REST", + "endpoint": "https://marketo_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", + "Content-Type": "application/json" + }, + "body": { + "FORM": {}, + "JSON": {}, + "JSON_ARRAY": {}, + "XML": {} + }, + "files": {}, + "params": { + "destination": "marketo_static_list" + } + }, { "type": "REST", "endpoint": "https://marketo_acct_id_success.mktorest.com/rest/v1/lists/1234/leads.json?id=1&id=2&id=3", diff --git a/test/__tests__/data/marketo_static_list_proxy_output.json b/test/__tests__/data/marketo_static_list_proxy_output.json index 2dfbee0e8e..8ac482b5be 100644 --- a/test/__tests__/data/marketo_static_list_proxy_output.json +++ b/test/__tests__/data/marketo_static_list_proxy_output.json @@ -1,4 +1,37 @@ [ + { + "output": { + "message": "Request Processed Successfully", + "destinationResponse": { + "response": { + "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 + }, + "status": 200 + }, + "status": 200 + } + }, { "output": { "status": 500, @@ -72,21 +105,25 @@ }, { "output": { - "destinationResponse": "", - "message": "Request failed during: during Marketo Static List Response Handling, error: [{\"code\":\"1004\",\"message\":\"Lead not found\"}]", - "statTags": { - "destType": "MARKETO_STATIC_LIST", - "errorCategory": "dataValidation", - "destinationId": "Non-determininable", - "workspaceId": "Non-determininable", - "errorType": "instrumentation", - "feature": "dataDelivery", - "implementation": "native", - "destinationId": "Non-determininable", - "workspaceId": "Non-determininable", - "module": "destination" - }, - "status": 400 + "status": 200, + "message": "Request Processed Successfully", + "destinationResponse": { + "response": { + "requestId": "12d3c#1846057dce2", + "result": { + "id": 5, + "status": "skipped", + "reasons": [ + { + "code": "1015", + "message": "Lead not in list" + } + ] + }, + "success": true + }, + "status": 200 + } } } ] \ No newline at end of file diff --git a/test/__tests__/data/mp_input.json b/test/__tests__/data/mp_input.json index 394fc49b61..6d456858c9 100644 --- a/test/__tests__/data/mp_input.json +++ b/test/__tests__/data/mp_input.json @@ -432,7 +432,18 @@ "apiKey": "dummyApiKey", "token": "dummyApiKey", "prefixProperties": true, - "useNativeSDK": false + "useNativeSDK": false, + "propIncrements": [ + { + "property": "counter" + }, + { + "property": "item_purchased" + }, + { + "property": "number_of_logins" + } + ] }, "DestinationDefinition": { "DisplayName": "Kiss Metrics", @@ -493,7 +504,10 @@ "originalTimestamp": "2020-01-24T06:29:02.364Z", "properties": { "currency": "USD", - "revenue": 45.89 + "revenue": 45.89, + "counter": 1, + "item_purchased": "2", + "number_of_logins": "" }, "receivedAt": "2020-01-24T11:59:02.403+05:30", "request_ip": "[::1]:53710", @@ -582,7 +596,12 @@ "apiKey": "dummyApiKey", "token": "dummyApiKey", "prefixProperties": true, - "useNativeSDK": false + "useNativeSDK": false, + "propIncrements": [ + { + "property": "" + } + ] }, "DestinationDefinition": { "DisplayName": "Kiss Metrics", diff --git a/test/__tests__/data/mp_output.json b/test/__tests__/data/mp_output.json index fe54474dd8..61100a1b84 100644 --- a/test/__tests__/data/mp_output.json +++ b/test/__tests__/data/mp_output.json @@ -128,6 +128,24 @@ "files": {}, "userId": "e6ab2c5e-2cda-44a9-a962-e2f67df78bca" }, + { + "version": "1", + "type": "REST", + "method": "POST", + "endpoint": "https://api.mixpanel.com/engage/", + "headers": {}, + "params": {}, + "body": { + "JSON": {}, + "JSON_ARRAY": { + "batch": "[{\"$add\":{\"counter\":1,\"item_purchased\":\"2\"},\"$token\":\"dummyApiKey\",\"$distinct_id\":\"e6ab2c5e-2cda-44a9-a962-e2f67df78bca\"}]" + }, + "XML": {}, + "FORM": {} + }, + "files": {}, + "userId": "e6ab2c5e-2cda-44a9-a962-e2f67df78bca" + }, { "version": "1", "type": "REST", @@ -138,7 +156,7 @@ "body": { "JSON": {}, "JSON_ARRAY": { - "batch": "[{\"event\":\"test revenue MIXPANEL\",\"properties\":{\"currency\":\"USD\",\"revenue\":45.89,\"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\":\"a6a0ad5a-bd26-4f19-8f75-38484e580fc7\",\"token\":\"dummyApiKey\",\"distinct_id\":\"e6ab2c5e-2cda-44a9-a962-e2f67df78bca\",\"time\":1579847342,\"$browser\":\"Chrome\",\"$browser_version\":\"79.0.3945.117\"}}]" + "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\",\"$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\":\"dummyApiKey\",\"distinct_id\":\"e6ab2c5e-2cda-44a9-a962-e2f67df78bca\",\"time\":1579847342,\"$browser\":\"Chrome\",\"$browser_version\":\"79.0.3945.117\"}}]" }, "XML": {}, "FORM": {} diff --git a/test/__tests__/data/mp_router_output.json b/test/__tests__/data/mp_router_output.json index acd6912c01..d1af209e8b 100644 --- a/test/__tests__/data/mp_router_output.json +++ b/test/__tests__/data/mp_router_output.json @@ -1,4 +1,55 @@ [ + { + "batchedRequest": { + "version": "1", + "type": "REST", + "method": "POST", + "endpoint": "https://api.mixpanel.com/import/", + "headers": { + "Content-Type": "application/json", + "Authorization": "Basic dGVzdF9hcGlfc2VjcmV0Og==" + }, + "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\":1688624942,\"name\":\"Contact Us\",\"$browser\":\"Chrome\",\"$browser_version\":\"79.0.3945.117\"}}]" + }, + "XML": {}, + "FORM": {} + }, + "files": {} + }, + "metadata": [ + { + "jobId": 1, + "additionalProp": 1 + } + ], + "batched": true, + "statusCode": 200, + "destination": { + "Config": { + "apiSecret": "test_api_secret", + "token": "test_api_token", + "prefixProperties": true, + "useNativeSDK": false, + "useOldMapping": true, + "strictMode": true + }, + "DestinationDefinition": { + "DisplayName": "Mixpanel", + "ID": "1WhbSZ6uA3H5ChVifHpfL2H6sie", + "Name": "MP" + }, + "Enabled": true, + "ID": "1WhcOCGgj9asZu850HvugU2C3Aq", + "Name": "Mixpanel", + "Transformations": [] + } + }, { "batchedRequest": [ { @@ -11,7 +62,7 @@ "body": { "JSON": {}, "JSON_ARRAY": { - "batch": "[{\"$append\":{\"$transactions\":{\"$time\":\"2023-07-06T06:29:02.402Z\",\"$amount\":18.9}},\"$token\":\"test_api_token\",\"$distinct_id\":\"userId01\"},{\"$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\":1688624942},{\"$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\":1688624942}]" + "batch": "[{\"$append\":{\"$transactions\":{\"$time\":\"2023-07-06T06:29:02.402Z\",\"$amount\":18.9}},\"$token\":\"test_api_token\",\"$distinct_id\":\"userId01\"}]" }, "XML": {}, "FORM": {} @@ -33,7 +84,7 @@ "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\":1688624942,\"name\":\"Contact Us\",\"$browser\":\"Chrome\",\"$browser_version\":\"79.0.3945.117\"}},{\"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\":1688624942,\"$device_id\":\"anonId01\"}}]" + "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\":1688624942,\"$device_id\":\"anonId01\"}}]" }, "XML": {}, "FORM": {} @@ -45,18 +96,6 @@ { "jobId": 2, "additionalProp": 2 - }, - { - "jobId": 3, - "additionalProp": 3 - }, - { - "jobId": 4, - "additionalProp": 4 - }, - { - "jobId": 1, - "additionalProp": 1 } ], "batched": true, @@ -92,7 +131,7 @@ "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\":null},{\"$token\":\"test_api_token\",\"$distinct_id\":\"userId06\",\"$set\":{\"company\":[\"testComp\"]},\"$ip\":\"0.0.0.0\"}]" + "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\":1688624942},{\"$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\":1688624942},{\"$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\":null}]" }, "XML": {}, "FORM": {} @@ -103,13 +142,74 @@ "version": "1", "type": "REST", "method": "POST", - "endpoint": "https://api.mixpanel.com/groups/", + "endpoint": "https://api.mixpanel.com/import/", + "headers": { + "Content-Type": "application/json", + "Authorization": "Basic dGVzdF9hcGlfc2VjcmV0Og==" + }, + "params": { + "strict": 1 + }, + "body": { + "JSON": {}, + "JSON_ARRAY": { + "batch": "[{\"event\":\"$merge\",\"properties\":{\"$distinct_ids\":[\"test_user_id\",\"5094f5704b9cf2b3\"],\"token\":\"test_api_token\"}}]" + }, + "XML": {}, + "FORM": {} + }, + "files": {} + } + ], + "metadata": [ + { + "jobId": 3, + "additionalProp": 3 + }, + { + "jobId": 4, + "additionalProp": 4 + }, + { + "jobId": 5, + "additionalProp": 5 + } + ], + "batched": true, + "statusCode": 200, + "destination": { + "Config": { + "apiSecret": "test_api_secret", + "token": "test_api_token", + "prefixProperties": true, + "useNativeSDK": false, + "useOldMapping": true, + "strictMode": true + }, + "DestinationDefinition": { + "DisplayName": "Mixpanel", + "ID": "1WhbSZ6uA3H5ChVifHpfL2H6sie", + "Name": "MP" + }, + "Enabled": true, + "ID": "1WhcOCGgj9asZu850HvugU2C3Aq", + "Name": "Mixpanel", + "Transformations": [] + } + }, + { + "batchedRequest": [ + { + "version": "1", + "type": "REST", + "method": "POST", + "endpoint": "https://api.mixpanel.com/engage/", "headers": {}, "params": {}, "body": { "JSON": {}, "JSON_ARRAY": { - "batch": "[{\"$token\":\"test_api_token\",\"$group_key\":\"company\",\"$group_id\":\"testComp\",\"$set\":{\"company\":\"testComp\"}}]" + "batch": "[{\"$token\":\"test_api_token\",\"$distinct_id\":\"userId06\",\"$set\":{\"company\":[\"testComp\"]},\"$ip\":\"0.0.0.0\"}]" }, "XML": {}, "FORM": {} @@ -120,18 +220,13 @@ "version": "1", "type": "REST", "method": "POST", - "endpoint": "https://api.mixpanel.com/import/", - "headers": { - "Content-Type": "application/json", - "Authorization": "Basic dGVzdF9hcGlfc2VjcmV0Og==" - }, - "params": { - "strict": 1 - }, + "endpoint": "https://api.mixpanel.com/groups/", + "headers": {}, + "params": {}, "body": { "JSON": {}, "JSON_ARRAY": { - "batch": "[{\"event\":\"$merge\",\"properties\":{\"$distinct_ids\":[\"test_user_id\",\"5094f5704b9cf2b3\"],\"token\":\"test_api_token\"}}]" + "batch": "[{\"$token\":\"test_api_token\",\"$group_key\":\"company\",\"$group_id\":\"testComp\",\"$set\":{\"company\":\"testComp\"}}]" }, "XML": {}, "FORM": {} @@ -140,10 +235,6 @@ } ], "metadata": [ - { - "jobId": 5, - "additionalProp": 5 - }, { "jobId": 6, "additionalProp": 6 @@ -155,8 +246,11 @@ "Config": { "apiSecret": "test_api_secret", "token": "test_api_token", - "prefixProperties": true, - "useNativeSDK": false, + "groupKeySettings": [ + { + "groupKey": "company" + } + ], "strictMode": true }, "DestinationDefinition": { diff --git a/test/__tests__/data/pardot_router_output.json b/test/__tests__/data/pardot_router_output.json index 913e35ce94..889cc8fd96 100644 --- a/test/__tests__/data/pardot_router_output.json +++ b/test/__tests__/data/pardot_router_output.json @@ -376,7 +376,7 @@ ], "batched": false, "statusCode": 500, - "error": "Empty/Invalid access token", + "error": "OAuth - access token not found", "statTags": { "errorCategory": "platform", "errorType": "oAuthSecret" diff --git a/test/__tests__/data/redis_output.json b/test/__tests__/data/redis_output.json index 57d8387041..69d2aa20c2 100644 --- a/test/__tests__/data/redis_output.json +++ b/test/__tests__/data/redis_output.json @@ -81,7 +81,7 @@ }, { "message": { - "hash": "some-workspace-id:some-entity:some-id-type:some-user-id", + "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}" }, diff --git a/test/__tests__/data/slack_input.json b/test/__tests__/data/slack_input.json index 4e6195a37d..9b1ec52664 100644 --- a/test/__tests__/data/slack_input.json +++ b/test/__tests__/data/slack_input.json @@ -7,17 +7,130 @@ "ID": "1ZQUiJVMlmF7lfsdfXg7KXQnlLV", "Name": "SLACK", "DisplayName": "Slack", - "Config": { "excludeKeys": [], "includeKeys": [] } + "Config": { + "excludeKeys": [], + "includeKeys": [] + } }, "Config": { "eventChannelSettings": [ { - "eventChannel": "#slack_integration", + "eventChannelWebhook": "https://hooks.slack.com/services/example/test/demo", "eventName": "is", "eventRegex": true + } + ], + "eventTemplateSettings": [ + { + "eventName": "is", + "eventRegex": true, + "eventTemplate": "{{name}} performed {{event}} with {{properties.key1}} {{properties.key2}}" + }, + { + "eventName": "", + "eventRegex": false, + "eventTemplate": "" + } + ], + "webhookUrl": "https://hooks.slack.com/services/THZM86VSS/BV9HZ2UN6/demo", + "whitelistedTraitsSettings": [ + { + "trait": "hiji" }, - { "eventChannel": "", "eventName": "", "eventRegex": false }, - { "eventChannel": "", "eventName": "", "eventRegex": false } + { + "trait": "" + } + ] + }, + "Enabled": true, + "Transformations": [], + "IsProcessorEnabled": true + }, + "message": { + "anonymousId": "4de817fb-7f8e-4e23-b9be-f6736dbda20f", + "channel": "web", + "context": { + "app": { + "build": "1.0.0", + "name": "RudderLabs JavaScript SDK", + "namespace": "com.rudderlabs.javascript", + "version": "1.1.1-rc.1" + }, + "library": { + "name": "RudderLabs JavaScript SDK", + "version": "1.1.1-rc.1" + }, + "locale": "en-US", + "os": { + "name": "", + "version": "" + }, + "page": { + "path": "/tests/html/script-test.html", + "referrer": "http://localhost:1111/tests/html/", + "search": "", + "title": "", + "url": "http://localhost:1111/tests/html/script-test.html" + }, + "screen": { + "density": 1.7999999523162842 + }, + "traits": { + "country": "India", + "email": "name@domain.com", + "hiji": "hulala", + "name": "my-name" + }, + "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" + }, + "integrations": { + "All": true + }, + "messageId": "9ecc0183-89ed-48bd-87eb-b2d8e1ca6780", + "originalTimestamp": "2020-03-23T03:46:30.916Z", + "properties": { + "path": "/tests/html/script-test.html", + "referrer": "http://localhost:1111/tests/html/", + "search": "", + "title": "", + "url": "http://localhost:1111/tests/html/script-test.html" + }, + "receivedAt": "2020-03-23T09:16:31.041+05:30", + "request_ip": "[::1]:52056", + "sentAt": "2020-03-23T03:46:30.916Z", + "timestamp": "2020-03-23T09:16:31.041+05:30", + "type": "identify", + "userId": "12345" + }, + "metadata": { + "anonymousId": "4de817fb-7f8e-4e23-b9be-f6736dbda20f", + "destinationId": "1ZQVSU9SXNg6KYgZALaqjAO3PIL", + "destinationType": "SLACK", + "jobId": 126, + "messageId": "9ecc0183-89ed-48bd-87eb-b2d8e1ca6780", + "sourceId": "1YhwKyDcKstudlGxkeN5p2wgsrp" + } + }, + { + "destination": { + "ID": "1ZQVSU9SXNg6KYgZALaqjAO3PIL", + "Name": "test-slack", + "DestinationDefinition": { + "ID": "1ZQUiJVMlmF7lfsdfXg7KXQnlLV", + "Name": "SLACK", + "DisplayName": "Slack", + "Config": { + "excludeKeys": [], + "includeKeys": [] + } + }, + "Config": { + "eventChannelSettings": [ + { + "eventChannelWebhook": "https://hooks.slack.com/services/example/test/demo", + "eventName": "is", + "eventRegex": true + } ], "eventTemplateSettings": [ { @@ -25,11 +138,27 @@ "eventRegex": true, "eventTemplate": "{{name}} performed {{event}} with {{properties.key1}} {{properties.key2}}" }, - { "eventName": "", "eventRegex": false, "eventTemplate": "" } + { + "eventName": "", + "eventRegex": false, + "eventTemplate": "" + } ], "identifyTemplate": "identified {{name}} with {{traits}}", "webhookUrl": "https://hooks.slack.com/services/THZM86VSS/BV9HZ2UN6/demo", - "whitelistedTraitsSettings": [{ "trait": "hiji" }, { "trait": "" }] + "whitelistedTraitsSettings": [ + { + "trait": "hiji" + }, + { + "trait": "" + } + ], + "blacklistedEvents": [ + { + "eventName": "black_event" + } + ] }, "Enabled": true, "Transformations": [], @@ -50,7 +179,10 @@ "version": "1.1.1-rc.1" }, "locale": "en-US", - "os": { "name": "", "version": "" }, + "os": { + "name": "", + "version": "" + }, "page": { "path": "/tests/html/script-test.html", "referrer": "http://localhost:1111/tests/html/", @@ -58,7 +190,9 @@ "title": "", "url": "http://localhost:1111/tests/html/script-test.html" }, - "screen": { "density": 1.7999999523162842 }, + "screen": { + "density": 1.7999999523162842 + }, "traits": { "country": "India", "email": "name@domain.com", @@ -67,7 +201,9 @@ }, "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" }, - "integrations": { "All": true }, + "integrations": { + "All": true + }, "messageId": "9ecc0183-89ed-48bd-87eb-b2d8e1ca6780", "originalTimestamp": "2020-03-23T03:46:30.916Z", "properties": { @@ -101,17 +237,18 @@ "ID": "1ZQUiJVMlmF7lfsdfXg7KXQnlLV", "Name": "SLACK", "DisplayName": "Slack", - "Config": { "excludeKeys": [], "includeKeys": [] } + "Config": { + "excludeKeys": [], + "includeKeys": [] + } }, "Config": { "eventChannelSettings": [ { - "eventChannel": "#slack_integration", + "eventChannelWebhook": "https://hooks.slack.com/services/id1/id2/example", "eventName": "is", "eventRegex": true - }, - { "eventChannel": "", "eventName": "", "eventRegex": false }, - { "eventChannel": "", "eventName": "", "eventRegex": false } + } ], "eventTemplateSettings": [ { @@ -119,11 +256,22 @@ "eventRegex": true, "eventTemplate": "{{name}} performed {{event}} with {{properties.key1}} {{properties.key2}}" }, - { "eventName": "", "eventRegex": false, "eventTemplate": "" } + { + "eventName": "", + "eventRegex": false, + "eventTemplate": "" + } ], "identifyTemplate": "identified {{name}} with {{traits}}", "webhookUrl": "https://hooks.slack.com/services/THZM86VSS/BV9HZ2UN6/demo", - "whitelistedTraitsSettings": [{ "trait": "hiji" }, { "trait": "" }] + "whitelistedTraitsSettings": [ + { + "trait": "hiji" + }, + { + "trait": "" + } + ] }, "Enabled": true, "Transformations": [], @@ -144,7 +292,10 @@ "version": "1.1.1-rc.1" }, "locale": "en-US", - "os": { "name": "", "version": "" }, + "os": { + "name": "", + "version": "" + }, "page": { "path": "", "referrer": "", @@ -152,7 +303,389 @@ "title": "", "url": "" }, - "screen": { "density": 1.7999999523162842 }, + "screen": { + "density": 1.7999999523162842 + }, + "traits": { + "country": "India", + "email": "name@domain.com", + "hiji": "hulala", + "name": "my-name" + }, + "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" + }, + "traits": { + "country": "USA", + "email": "test@domain.com", + "hiji": "hulala-1", + "name": "my-name-1" + }, + "integrations": { + "All": true + }, + "messageId": "4aaecff2-a513-4bbf-9824-c471f4ac9777", + "originalTimestamp": "2020-03-23T03:41:46.122Z", + "receivedAt": "2020-03-23T09:11:46.244+05:30", + "request_ip": "[::1]:52055", + "sentAt": "2020-03-23T03:41:46.123Z", + "timestamp": "2020-03-23T09:11:46.243+05:30", + "type": "identify", + "userId": "12345" + }, + "metadata": { + "anonymousId": "12345", + "destinationId": "1ZQVSU9SXNg6KYgZALaqjAO3PIL", + "destinationType": "SLACK", + "jobId": 123, + "messageId": "4aaecff2-a513-4bbf-9824-c471f4ac9777", + "sourceId": "1YhwKyDcKstudlGxkeN5p2wgsrp" + } + }, + { + "destination": { + "ID": "1ZQVSU9SXNg6KYgZALaqjAO3PIL", + "Name": "test-slack", + "DestinationDefinition": { + "ID": "1ZQUiJVMlmF7lfsdfXg7KXQnlLV", + "Name": "SLACK", + "DisplayName": "Slack", + "Config": { + "excludeKeys": [], + "includeKeys": [] + } + }, + "Config": { + "incomingWebhooksType": "modern", + "eventChannelSettings": [ + { + "eventChannelWebhook": "https://hooks.slack.com/services/id1/id2/demo", + "eventName": "is", + "eventRegex": true + }, + { + "eventChannelWebhook": "https://hooks.slack.com/services/id1/id2/example+1", + "eventName": "is", + "eventRegex": true + } + ], + "eventTemplateSettings": [ + { + "eventName": "is", + "eventRegex": true, + "eventTemplate": "{{name}} performed {{event}} with {{properties.key1}} {{properties.key2}} and traits {{traitsList.hiji}}" + }, + { + "eventName": "", + "eventRegex": false, + "eventTemplate": "" + } + ], + "identifyTemplate": "identified {{name}} with {{traits}}", + "webhookUrl": "https://hooks.slack.com/services/THZM86VSS/BV9HZ2UN6/demo", + "whitelistedTraitsSettings": [ + { + "trait": "hiji" + }, + { + "trait": "" + } + ], + "blacklistedEvents": [ + { + "eventName": "black_event" + } + ] + }, + "Enabled": true, + "Transformations": [], + "IsProcessorEnabled": true + }, + "message": { + "anonymousId": "00000000000000000000000000", + "channel": "web", + "context": { + "app": { + "build": "1.0.0", + "name": "RudderLabs JavaScript SDK", + "namespace": "com.rudderlabs.javascript", + "version": "1.1.1-rc.1" + }, + "ip": "0.0.0.0", + "library": { + "name": "RudderLabs JavaScript SDK", + "version": "1.1.1-rc.1" + }, + "locale": "en-US", + "os": { + "name": "", + "version": "" + }, + "page": { + "path": "/tests/html/script-test.html", + "referrer": "http://localhost:1111/tests/html/", + "search": "", + "title": "", + "url": "http://localhost:1111/tests/html/script-test.html" + }, + "screen": { + "density": 1.7999999523162842 + }, + "traits": { + "country": "India", + "email": "name@domain.com", + "hiji": "hulala", + "name": "my-name" + }, + "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" + }, + "event": "test_isent1", + "integrations": { + "All": true + }, + "messageId": "78102118-56ac-4c5a-a495-8cd7c8f71cc2", + "originalTimestamp": "2020-03-23T03:46:30.921Z", + "properties": { + "currency": "USD", + "key1": "test_val1", + "key2": "test_val2", + "revenue": 30, + "user_actual_id": 12345 + }, + "receivedAt": "2020-03-23T09:16:31.064+05:30", + "request_ip": "[::1]:52057", + "sentAt": "2020-03-23T03:46:30.921Z", + "timestamp": "2020-03-23T09:16:31.064+05:30", + "type": "track", + "userId": "12345" + }, + "metadata": { + "anonymousId": "00000000000000000000000000", + "destinationId": "1ZQVSU9SXNg6KYgZALaqjAO3PIL", + "destinationType": "SLACK", + "jobId": 128, + "messageId": "78102118-56ac-4c5a-a495-8cd7c8f71cc2", + "sourceId": "1YhwKyDcKstudlGxkeN5p2wgsrp" + } + }, + { + "destination": { + "ID": "1ZQVSU9SXNg6KYgZALaqjAO3PIL", + "Name": "test-slack", + "DestinationDefinition": { + "ID": "1ZQUiJVMlmF7lfsdfXg7KXQnlLV", + "Name": "SLACK", + "DisplayName": "Slack", + "Config": { + "excludeKeys": [], + "includeKeys": [] + } + }, + "Config": { + "incomingWebhooksType": "modern", + "eventChannelSettings": [ + { + "eventChannelWebhook": "https://hooks.slack.com/services/id1/id2/example", + "eventName": "is", + "eventChannel": "example_channel", + "eventRegex": true + }, + { + "eventChannelWebhook": "https://hooks.slack.com/services/id1/id2/example+1", + "eventName": "is", + "eventChannel": "example_channel", + "eventRegex": true + } + ], + "eventTemplateSettings": [ + { + "eventName": "is", + "eventRegex": true, + "eventTemplate": "{{name}} performed {{event}} with {{properties.key1}} {{properties.key2}}" + }, + { + "eventName": "", + "eventRegex": false, + "eventTemplate": "" + } + ], + "identifyTemplate": "identified {{name}} with {{traits}}", + "webhookUrl": "https://hooks.slack.com/services/THZM86VSS/BV9HZ2UN6/demo", + "whitelistedTraitsSettings": [ + { + "trait": "hiji" + }, + { + "trait": "" + } + ], + "blacklistedEvents": [ + { + "eventName": "black_event" + } + ] + }, + "Enabled": true, + "Transformations": [], + "IsProcessorEnabled": true + }, + "message": { + "anonymousId": "00000000000000000000000000", + "channel": "web", + "context": { + "app": { + "build": "1.0.0", + "name": "RudderLabs JavaScript SDK", + "namespace": "com.rudderlabs.javascript", + "version": "1.1.1-rc.1" + }, + "ip": "0.0.0.0", + "library": { + "name": "RudderLabs JavaScript SDK", + "version": "1.1.1-rc.1" + }, + "locale": "en-US", + "os": { + "name": "", + "version": "" + }, + "page": { + "path": "/tests/html/script-test.html", + "referrer": "http://localhost:1111/tests/html/", + "search": "", + "title": "", + "url": "http://localhost:1111/tests/html/script-test.html" + }, + "screen": { + "density": 1.7999999523162842 + }, + "traits": { + "country": "India", + "email": "name@domain.com", + "hiji": "hulala", + "name": "my-name" + }, + "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" + }, + "event": "test_eventing_testis", + "integrations": { + "All": true + }, + "messageId": "8b8d5937-09bc-49dc-a35e-8cd6370575f8", + "originalTimestamp": "2020-03-23T03:46:30.922Z", + "properties": { + "currency": "USD", + "key1": "test_val1", + "key2": "test_val2", + "revenue": 30, + "user_actual_id": 12345 + }, + "receivedAt": "2020-03-23T09:16:31.064+05:30", + "request_ip": "[::1]:52054", + "sentAt": "2020-03-23T03:46:30.923Z", + "timestamp": "2020-03-23T09:16:31.063+05:30", + "type": "track", + "userId": "12345" + }, + "metadata": { + "anonymousId": "00000000000000000000000000", + "destinationId": "1ZQVSU9SXNg6KYgZALaqjAO3PIL", + "destinationType": "SLACK", + "jobId": 129, + "messageId": "8b8d5937-09bc-49dc-a35e-8cd6370575f8", + "sourceId": "1YhwKyDcKstudlGxkeN5p2wgsrp" + } + }, + { + "destination": { + "ID": "1ZQVSU9SXNg6KYgZALaqjAO3PIL", + "Name": "test-slack", + "DestinationDefinition": { + "ID": "1ZQUiJVMlmF7lfsdfXg7KXQnlLV", + "Name": "SLACK", + "DisplayName": "Slack", + "Config": { + "excludeKeys": [], + "includeKeys": [] + } + }, + "Config": { + "incomingWebhooksType": "modern", + "eventChannelSettings": [ + { + "eventChannelWebhook": "https://hooks.slack.com/services/id1/id2/example", + "eventName": "test_eventing_test", + "eventChannel": "example_channel", + "eventRegex": false + }, + { + "eventChannelWebhook": "https://hooks.slack.com/services/id1/id2/example+1", + "eventName": "", + "eventChannel": "example_channel", + "eventRegex": true + } + ], + "eventTemplateSettings": [ + { + "eventName": "is", + "eventRegex": true, + "eventTemplate": "{{name}} performed {{event}} with {{properties.key1}} {{properties.key2}}" + }, + { + "eventName": "", + "eventRegex": false, + "eventTemplate": "" + } + ], + "identifyTemplate": "identified {{name}} with {{traits}}", + "webhookUrl": "https://hooks.slack.com/services/THZM86VSS/BV9HZ2UN6/demo", + "whitelistedTraitsSettings": [ + { + "trait": "hiji" + }, + { + "trait": "" + } + ], + "blacklistedEvents": [ + { + "eventName": "black_event" + } + ] + }, + "Enabled": true, + "Transformations": [], + "IsProcessorEnabled": true + }, + "message": { + "anonymousId": "00000000000000000000000000", + "channel": "web", + "context": { + "app": { + "build": "1.0.0", + "name": "RudderLabs JavaScript SDK", + "namespace": "com.rudderlabs.javascript", + "version": "1.1.1-rc.1" + }, + "ip": "0.0.0.0", + "library": { + "name": "RudderLabs JavaScript SDK", + "version": "1.1.1-rc.1" + }, + "locale": "en-US", + "os": { + "name": "", + "version": "" + }, + "page": { + "path": "/tests/html/script-test.html", + "referrer": "http://localhost:1111/tests/html/", + "search": "", + "title": "", + "url": "http://localhost:1111/tests/html/script-test.html" + }, + "screen": { + "density": 1.7999999523162842 + }, "traits": { "country": "India", "email": "name@domain.com", @@ -161,28 +694,32 @@ }, "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" }, - "traits": { - "country": "USA", - "email": "test@domain.com", - "hiji": "hulala-1", - "name": "my-name-1" + "event": "test_eventing_test", + "integrations": { + "All": true }, - "integrations": { "All": true }, - "messageId": "4aaecff2-a513-4bbf-9824-c471f4ac9777", - "originalTimestamp": "2020-03-23T03:41:46.122Z", - "receivedAt": "2020-03-23T09:11:46.244+05:30", - "request_ip": "[::1]:52055", - "sentAt": "2020-03-23T03:41:46.123Z", - "timestamp": "2020-03-23T09:11:46.243+05:30", - "type": "identify", + "messageId": "8b8d5937-09bc-49dc-a35e-8cd6370575f8", + "originalTimestamp": "2020-03-23T03:46:30.922Z", + "properties": { + "currency": "USD", + "key1": "test_val1", + "key2": "test_val2", + "revenue": 30, + "user_actual_id": 12345 + }, + "receivedAt": "2020-03-23T09:16:31.064+05:30", + "request_ip": "[::1]:52054", + "sentAt": "2020-03-23T03:46:30.923Z", + "timestamp": "2020-03-23T09:16:31.063+05:30", + "type": "track", "userId": "12345" }, "metadata": { - "anonymousId": "12345", + "anonymousId": "00000000000000000000000000", "destinationId": "1ZQVSU9SXNg6KYgZALaqjAO3PIL", "destinationType": "SLACK", - "jobId": 123, - "messageId": "4aaecff2-a513-4bbf-9824-c471f4ac9777", + "jobId": 129, + "messageId": "8b8d5937-09bc-49dc-a35e-8cd6370575f8", "sourceId": "1YhwKyDcKstudlGxkeN5p2wgsrp" } }, @@ -194,17 +731,24 @@ "ID": "1ZQUiJVMlmF7lfsdfXg7KXQnlLV", "Name": "SLACK", "DisplayName": "Slack", - "Config": { "excludeKeys": [], "includeKeys": [] } + "Config": { + "excludeKeys": [], + "includeKeys": [] + } }, "Config": { + "incomingWebhooksType": "legacy", "eventChannelSettings": [ { - "eventChannel": "#slack_integration", + "eventChannelWebhook": "https://hooks.slack.com/services/id1/id2/demo", "eventName": "is", "eventRegex": true }, - { "eventChannel": "", "eventName": "", "eventRegex": false }, - { "eventChannel": "", "eventName": "", "eventRegex": false } + { + "eventChannelWebhook": "https://hooks.slack.com/services/id1/id2/example+1", + "eventName": "is", + "eventRegex": true + } ], "eventTemplateSettings": [ { @@ -212,11 +756,27 @@ "eventRegex": true, "eventTemplate": "{{name}} performed {{event}} with {{properties.key1}} {{properties.key2}} and traits {{traitsList.hiji}}" }, - { "eventName": "", "eventRegex": false, "eventTemplate": "" } + { + "eventName": "", + "eventRegex": false, + "eventTemplate": "" + } ], "identifyTemplate": "identified {{name}} with {{traits}}", "webhookUrl": "https://hooks.slack.com/services/THZM86VSS/BV9HZ2UN6/demo", - "whitelistedTraitsSettings": [{ "trait": "hiji" }, { "trait": "" }] + "whitelistedTraitsSettings": [ + { + "trait": "hiji" + }, + { + "trait": "" + } + ], + "blacklistedEvents": [ + { + "eventName": "black_event" + } + ] }, "Enabled": true, "Transformations": [], @@ -238,7 +798,10 @@ "version": "1.1.1-rc.1" }, "locale": "en-US", - "os": { "name": "", "version": "" }, + "os": { + "name": "", + "version": "" + }, "page": { "path": "/tests/html/script-test.html", "referrer": "http://localhost:1111/tests/html/", @@ -246,7 +809,9 @@ "title": "", "url": "http://localhost:1111/tests/html/script-test.html" }, - "screen": { "density": 1.7999999523162842 }, + "screen": { + "density": 1.7999999523162842 + }, "traits": { "country": "India", "email": "name@domain.com", @@ -256,7 +821,9 @@ "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" }, "event": "test_isent1", - "integrations": { "All": true }, + "integrations": { + "All": true + }, "messageId": "78102118-56ac-4c5a-a495-8cd7c8f71cc2", "originalTimestamp": "2020-03-23T03:46:30.921Z", "properties": { @@ -290,17 +857,25 @@ "ID": "1ZQUiJVMlmF7lfsdfXg7KXQnlLV", "Name": "SLACK", "DisplayName": "Slack", - "Config": { "excludeKeys": [], "includeKeys": [] } + "Config": { + "excludeKeys": [], + "includeKeys": [] + } }, "Config": { + "incomingWebhooksType": "legacy", "eventChannelSettings": [ { - "eventChannel": "#slack_integration", + "eventChannelWebhook": "https://hooks.slack.com/services/id1/id2/example", "eventName": "is", "eventRegex": true }, - { "eventChannel": "", "eventName": "", "eventRegex": false }, - { "eventChannel": "", "eventName": "", "eventRegex": false } + { + "eventChannelWebhook": "https://hooks.slack.com/services/id1/id2/example+1", + "eventChannel": "example-of-legacy", + "eventName": "is", + "eventRegex": true + } ], "eventTemplateSettings": [ { @@ -308,11 +883,27 @@ "eventRegex": true, "eventTemplate": "{{name}} performed {{event}} with {{properties.key1}} {{properties.key2}}" }, - { "eventName": "", "eventRegex": false, "eventTemplate": "" } + { + "eventName": "", + "eventRegex": false, + "eventTemplate": "" + } ], "identifyTemplate": "identified {{name}} with {{traits}}", "webhookUrl": "https://hooks.slack.com/services/THZM86VSS/BV9HZ2UN6/demo", - "whitelistedTraitsSettings": [{ "trait": "hiji" }, { "trait": "" }] + "whitelistedTraitsSettings": [ + { + "trait": "hiji" + }, + { + "trait": "" + } + ], + "blacklistedEvents": [ + { + "eventName": "black_event" + } + ] }, "Enabled": true, "Transformations": [], @@ -334,7 +925,10 @@ "version": "1.1.1-rc.1" }, "locale": "en-US", - "os": { "name": "", "version": "" }, + "os": { + "name": "", + "version": "" + }, "page": { "path": "/tests/html/script-test.html", "referrer": "http://localhost:1111/tests/html/", @@ -342,7 +936,9 @@ "title": "", "url": "http://localhost:1111/tests/html/script-test.html" }, - "screen": { "density": 1.7999999523162842 }, + "screen": { + "density": 1.7999999523162842 + }, "traits": { "country": "India", "email": "name@domain.com", @@ -352,7 +948,9 @@ "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" }, "event": "test_eventing_testis", - "integrations": { "All": true }, + "integrations": { + "All": true + }, "messageId": "8b8d5937-09bc-49dc-a35e-8cd6370575f8", "originalTimestamp": "2020-03-23T03:46:30.922Z", "properties": { @@ -394,19 +992,9 @@ "Config": { "eventChannelSettings": [ { - "eventChannel": "#slack_integration", + "eventChannelWebhook": "https://hooks.slack.com/services/example/test/demo", "eventName": "is", "eventRegex": true - }, - { - "eventChannel": "", - "eventName": "", - "eventRegex": false - }, - { - "eventChannel": "", - "eventName": "", - "eventRegex": false } ], "eventTemplateSettings": [ @@ -510,17 +1098,18 @@ "ID": "1ZQUiJVMlmF7lfsdfXg7KXQnlLV", "Name": "SLACK", "DisplayName": "Slack", - "Config": { "excludeKeys": [], "includeKeys": [] } + "Config": { + "excludeKeys": [], + "includeKeys": [] + } }, "Config": { "eventChannelSettings": [ { - "eventChannel": "#slack_integration", + "eventChannelWebhook": "https://hooks.slack.com/services/example/test/demo", "eventName": "is", "eventRegex": true - }, - { "eventChannel": "", "eventName": "", "eventRegex": false }, - { "eventChannel": "", "eventName": "", "eventRegex": false } + } ], "eventTemplateSettings": [ { @@ -528,11 +1117,22 @@ "eventRegex": true, "eventTemplate": "{{name}} performed {{event}} with {{properties.key1}} {{properties.key2}}" }, - { "eventName": "", "eventRegex": false, "eventTemplate": "" } + { + "eventName": "", + "eventRegex": false, + "eventTemplate": "" + } ], "identifyTemplate": "identified {{name}} with {{traits}}", "webhookUrl": "https://hooks.slack.com/services/THZM86VSS/BV9HZ2UN6/demo", - "whitelistedTraitsSettings": [{ "trait": "hiji" }, { "trait": "" }] + "whitelistedTraitsSettings": [ + { + "trait": "hiji" + }, + { + "trait": "" + } + ] }, "Enabled": true, "Transformations": [], @@ -554,7 +1154,10 @@ "version": "1.1.1-rc.1" }, "locale": "en-US", - "os": { "name": "", "version": "" }, + "os": { + "name": "", + "version": "" + }, "page": { "path": "/tests/html/script-test.html", "referrer": "http://localhost:1111/tests/html/", @@ -562,7 +1165,9 @@ "title": "", "url": "http://localhost:1111/tests/html/script-test.html" }, - "screen": { "density": 1.7999999523162842 }, + "screen": { + "density": 1.7999999523162842 + }, "traits": { "country": "India", "email": "name@domain.com", @@ -571,7 +1176,9 @@ }, "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" }, - "integrations": { "All": true }, + "integrations": { + "All": true + }, "messageId": "8b8d5937-09bc-49dc-a35e-8cd6370575f8", "originalTimestamp": "2020-03-23T03:46:30.922Z", "properties": { @@ -605,17 +1212,18 @@ "ID": "1ZQUiJVMlmF7lfsdfXg7KXQnlLV", "Name": "SLACK", "DisplayName": "Slack", - "Config": { "excludeKeys": [], "includeKeys": [] } + "Config": { + "excludeKeys": [], + "includeKeys": [] + } }, "Config": { "eventChannelSettings": [ { - "eventChannel": "#slack_integration", + "eventChannelWebhook": "https://hooks.slack.com/services/example/test/demo", "eventName": "is", "eventRegex": true - }, - { "eventChannel": "", "eventName": "", "eventRegex": false }, - { "eventChannel": "", "eventName": "", "eventRegex": false } + } ], "eventTemplateSettings": [ { @@ -623,11 +1231,22 @@ "eventRegex": true, "eventTemplate": "{{name}} performed {{event}} with {{properties. key1}} {{properties.key2}} and traits {{traitsList.hiji}}" }, - { "eventName": "", "eventRegex": false, "eventTemplate": "" } + { + "eventName": "", + "eventRegex": false, + "eventTemplate": "" + } ], "identifyTemplate": "identified {{name}} with {{traits}}", "webhookUrl": "https://hooks.slack.com/services/THZM86VSS/BV9HZ2UN6/demo", - "whitelistedTraitsSettings": [{ "trait": "hiji" }, { "trait": "" }] + "whitelistedTraitsSettings": [ + { + "trait": "hiji" + }, + { + "trait": "" + } + ] }, "Enabled": true, "Transformations": [], @@ -649,7 +1268,10 @@ "version": "1.1.1-rc.1" }, "locale": "en-US", - "os": { "name": "", "version": "" }, + "os": { + "name": "", + "version": "" + }, "page": { "path": "/tests/html/script-test.html", "referrer": "http://localhost:1111/tests/html/", @@ -657,7 +1279,9 @@ "title": "", "url": "http://localhost:1111/tests/html/script-test.html" }, - "screen": { "density": 1.7999999523162842 }, + "screen": { + "density": 1.7999999523162842 + }, "traits": { "country": "India", "email": "name@domain.com", @@ -667,7 +1291,9 @@ "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" }, "event": "test_isent1", - "integrations": { "All": true }, + "integrations": { + "All": true + }, "messageId": "78102118-56ac-4c5a-a495-8cd7c8f71cc2", "originalTimestamp": "2020-03-23T03:46:30.921Z", "properties": { @@ -692,5 +1318,98 @@ "messageId": "78102118-56ac-4c5a-a495-8cd7c8f71cc2", "sourceId": "1YhwKyDcKstudlGxkeN5p2wgsrp" } + }, + { + "destination": { + "ID": "1ZQVSU9SXNg6KYgZALaqjAO3PIL", + "Name": "test-slack", + "DestinationDefinition": { + "ID": "1ZQUiJVMlmF7lfsdfXg7KXQnlLV", + "Name": "SLACK", + "DisplayName": "Slack", + "Config": { + "excludeKeys": [], + "includeKeys": [] + } + }, + "Config": { + "incomingWebhooksType": "legacy", + "eventChannelSettings": [ + { + "eventChannelWebhook": "https://hooks.slack.com/services/id1/id2/example", + "eventName": "is", + "eventRegex": true + }, + { + "eventChannelWebhook": "https://hooks.slack.com/services/id1/id2/example+1", + "eventChannel": "example-of-legacy", + "eventName": "is", + "eventRegex": true + } + ], + "eventTemplateSettings": [ + { + "eventName": "is", + "eventRegex": true, + "eventTemplate": "{{name}} performed {{event}} with {{properties.key1}} {{properties.key2}}" + }, + { + "eventName": "", + "eventRegex": false, + "eventTemplate": "" + } + ], + "identifyTemplate": "identified {{name}} with {{traits}}", + "webhookUrl": "https://hooks.slack.com/services/THZM86VSS/BV9HZ2UN6/demo", + "whitelistedTraitsSettings": [ + { + "trait": "hiji" + }, + { + "trait": "" + } + ], + "blacklistedEvents": [ + { + "eventName": "black_event" + } + ] + }, + "Enabled": true, + "Transformations": [], + "IsProcessorEnabled": true + }, + "message": { + "anonymousId": "00000000000000000000000000", + "channel": "web", + "context": {}, + "event": "black_event", + "integrations": { + "All": true + }, + "messageId": "8b8d5937-09bc-49dc-a35e-8cd6370575f8", + "originalTimestamp": "2020-03-23T03:46:30.922Z", + "properties": { + "currency": "USD", + "key1": "test_val1", + "key2": "test_val2", + "revenue": 30, + "user_actual_id": 12345 + }, + "receivedAt": "2020-03-23T09:16:31.064+05:30", + "request_ip": "[::1]:52054", + "sentAt": "2020-03-23T03:46:30.923Z", + "timestamp": "2020-03-23T09:16:31.063+05:30", + "type": "track", + "userId": "12345" + }, + "metadata": { + "anonymousId": "00000000000000000000000000", + "destinationId": "1ZQVSU9SXNg6KYgZALaqjAO3PIL", + "destinationType": "SLACK", + "jobId": 129, + "messageId": "8b8d5937-09bc-49dc-a35e-8cd6370575f8", + "sourceId": "1YhwKyDcKstudlGxkeN5p2wgsrp" + } } -] +] \ No newline at end of file diff --git a/test/__tests__/data/slack_output.json b/test/__tests__/data/slack_output.json index 5c8495c757..853daf7801 100644 --- a/test/__tests__/data/slack_output.json +++ b/test/__tests__/data/slack_output.json @@ -1,4 +1,25 @@ [ + { + "version": "1", + "type": "REST", + "method": "POST", + "endpoint": "https://hooks.slack.com/services/THZM86VSS/BV9HZ2UN6/demo", + "headers": { + "Content-Type": "application/x-www-form-urlencoded" + }, + "params": {}, + "body": { + "JSON": {}, + "XML": {}, + "JSON_ARRAY": {}, + "FORM": { + "payload": "{\"text\":\"Identified my-namehiji: hulala \",\"username\":\"RudderStack\",\"icon_url\":\"https://cdn.rudderlabs.com/rudderstack.png\"}" + } + }, + "files": {}, + "userId": "12345", + "statusCode": 200 + }, { "error": "Event type page is not supported" }, @@ -7,7 +28,9 @@ "type": "REST", "method": "POST", "endpoint": "https://hooks.slack.com/services/THZM86VSS/BV9HZ2UN6/demo", - "headers": { "Content-Type": "application/x-www-form-urlencoded" }, + "headers": { + "Content-Type": "application/x-www-form-urlencoded" + }, "params": {}, "body": { "JSON": {}, @@ -21,19 +44,84 @@ "userId": "12345", "statusCode": 200 }, + { + "version": "1", + "type": "REST", + "method": "POST", + "endpoint": "https://hooks.slack.com/services/id1/id2/demo", + "headers": { + "Content-Type": "application/x-www-form-urlencoded" + }, + "params": {}, + "body": { + "JSON": {}, + "XML": {}, + "JSON_ARRAY": {}, + "FORM": { + "payload": "{\"text\":\"my-name performed test_isent1 with test_val1 test_val2 and traits hulala\"}" + } + }, + "files": {}, + "userId": "12345", + "statusCode": 200 + }, + { + "version": "1", + "type": "REST", + "method": "POST", + "endpoint": "https://hooks.slack.com/services/id1/id2/example", + "headers": { + "Content-Type": "application/x-www-form-urlencoded" + }, + "params": {}, + "body": { + "JSON": {}, + "XML": {}, + "JSON_ARRAY": {}, + "FORM": { + "payload": "{\"text\":\"my-name performed test_eventing_testis with test_val1 test_val2\"}" + } + }, + "files": {}, + "userId": "12345", + "statusCode": 200 + }, + { + "version": "1", + "type": "REST", + "method": "POST", + "endpoint": "https://hooks.slack.com/services/id1/id2/example", + "headers": { + "Content-Type": "application/x-www-form-urlencoded" + }, + "params": {}, + "body": { + "JSON": {}, + "XML": {}, + "JSON_ARRAY": {}, + "FORM": { + "payload": "{\"text\":\"my-name did test_eventing_test\"}" + } + }, + "files": {}, + "userId": "12345", + "statusCode": 200 + }, { "version": "1", "type": "REST", "method": "POST", "endpoint": "https://hooks.slack.com/services/THZM86VSS/BV9HZ2UN6/demo", - "headers": { "Content-Type": "application/x-www-form-urlencoded" }, + "headers": { + "Content-Type": "application/x-www-form-urlencoded" + }, "params": {}, "body": { "JSON": {}, "XML": {}, "JSON_ARRAY": {}, "FORM": { - "payload": "{\"channel\":\"#slack_integration\",\"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": "{\"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": {}, @@ -45,14 +133,16 @@ "type": "REST", "method": "POST", "endpoint": "https://hooks.slack.com/services/THZM86VSS/BV9HZ2UN6/demo", - "headers": { "Content-Type": "application/x-www-form-urlencoded" }, + "headers": { + "Content-Type": "application/x-www-form-urlencoded" + }, "params": {}, "body": { "JSON": {}, "XML": {}, "JSON_ARRAY": {}, "FORM": { - "payload": "{\"channel\":\"#slack_integration\",\"text\":\"my-name performed test_eventing_testis with test_val1 test_val2\",\"username\":\"RudderStack\",\"icon_url\":\"https://cdn.rudderlabs.com/rudderstack.png\"}" + "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\"}" } }, "files": {}, @@ -67,5 +157,8 @@ }, { "error": "Something is wrong with the event template: '{{name}} performed {{event}} with {{properties. key1}} {{properties.key2}} and traits {{traitsList.hiji}}'" + }, + { + "error": "Event is blacklisted. Please check configuration." } -] +] \ No newline at end of file diff --git a/test/__tests__/data/snapchat_custom_audience_proxy_output.json b/test/__tests__/data/snapchat_custom_audience_proxy_output.json index 654d94c45c..e5bcc4faa8 100644 --- a/test/__tests__/data/snapchat_custom_audience_proxy_output.json +++ b/test/__tests__/data/snapchat_custom_audience_proxy_output.json @@ -43,6 +43,7 @@ }, { "output": { + "authErrorCategory": "AUTH_STATUS_INACTIVE", "status": 400, "destinationResponse": { "response": { diff --git a/test/__tests__/data/twitter_ads.json b/test/__tests__/data/twitter_ads.json index ed2ab13ddf..53c7c19929 100644 --- a/test/__tests__/data/twitter_ads.json +++ b/test/__tests__/data/twitter_ads.json @@ -136,7 +136,7 @@ "hashed_phone_number": "b308962b96b40cce7981493a372db9478edae79f83c2d8ca6cd15a39566f8c56" }, { - "twclid": "18beb4813723e788a1d79bcbf80802538ec813aa19ded2e9c21cbf08bed6bee3" + "twclid": "543" } ] } @@ -360,7 +360,7 @@ "hashed_phone_number": "b308962b96b40cce7981493a372db9478edae79f83c2d8ca6cd15a39566f8c56" }, { - "twclid": "18beb4813723e788a1d79bcbf80802538ec813aa19ded2e9c21cbf08bed6bee3" + "twclid": "543" } ] } @@ -692,7 +692,7 @@ "hashed_phone_number": "b308962b96b40cce7981493a372db9478edae79f83c2d8ca6cd15a39566f8c56" }, { - "twclid": "18beb4813723e788a1d79bcbf80802538ec813aa19ded2e9c21cbf08bed6bee3" + "twclid": "543" } ] } diff --git a/test/__tests__/data/warehouse/integrations/jsonpaths/legacy/aliases.js b/test/__tests__/data/warehouse/integrations/jsonpaths/legacy/aliases.js new file mode 100644 index 0000000000..ee748a1a2b --- /dev/null +++ b/test/__tests__/data/warehouse/integrations/jsonpaths/legacy/aliases.js @@ -0,0 +1,427 @@ +module.exports = { + input: { + destination: { + Config: {} + }, + message: { + anonymousId: "e6ab2c5e-2cda-44a9-a962-e2f67df78bca", + channel: "web", + traits: { + city: "Disney", + country: "USA", + email: "mickey@disney.com", + firstname: "Mickey", + testMap: { + nestedMap: { + n1: "nested prop 1" + } + }, + }, + context: { + app: { + build: "1.0.0", + name: "RudderLabs JavaScript SDK", + namespace: "com.rudderlabs.javascript", + version: "1.0.5" + }, + ip: "0.0.0.0", + library: { + name: "RudderLabs JavaScript SDK", + version: "1.0.5" + }, + ctestMap: { + cnestedMap: { + n1: "context nested prop 1" + } + }, + locale: "en-GB", + 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.117 Safari/537.36" + }, + integrations: { + All: true, + RS: { + options: { + jsonPaths: [ + "testMap.nestedMap", + "ctestMap.cnestedMap", + ] + } + }, + BQ: { + options: { + jsonPaths: [ + "testMap.nestedMap", + "ctestMap.cnestedMap", + ] + } + }, + POSTGRES: { + options: { + jsonPaths: [ + "testMap.nestedMap", + "ctestMap.cnestedMap", + ] + } + }, + SNOWFLAKE: { + options: { + jsonPaths: [ + "testMap.nestedMap", + "ctestMap.cnestedMap", + ] + } + }, + S3_DATALAKE: { + options: { + skipReservedKeywordsEscaping: true + } + }, + }, + messageId: "a6a0ad5a-bd26-4f19-8f75-38484e580fc7", + originalTimestamp: "2020-01-24T06:29:02.364Z", + receivedAt: "2020-01-24T11:59:02.403+05:30", + request_ip: "[::1]:53708", + sentAt: "2020-01-24T06:29:02.364Z", + timestamp: "2020-01-24T11:59:02.403+05:30", + type: "alias", + userId: "9bb5d4c2-a7aa-4a36-9efb-dd2b1aec5d33" + }, + request: { + query: { + whSchemaVersion: "v1" + } + } + }, + output: { + default: [ + { + "data": { + "anonymous_id": "e6ab2c5e-2cda-44a9-a962-e2f67df78bca", + "channel": "web", + "city": "Disney", + "context_app_build": "1.0.0", + "context_app_name": "RudderLabs JavaScript SDK", + "context_app_namespace": "com.rudderlabs.javascript", + "context_app_version": "1.0.5", + "context_ctest_map_cnested_map_n_1": "context nested prop 1", + "context_ip": "0.0.0.0", + "context_library_name": "RudderLabs JavaScript SDK", + "context_library_version": "1.0.5", + "context_locale": "en-GB", + "context_passed_ip": "0.0.0.0", + "context_request_ip": "[::1]:53708", + "context_screen_density": 2, + "context_user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36", + "country": "USA", + "email": "mickey@disney.com", + "firstname": "Mickey", + "id": "a6a0ad5a-bd26-4f19-8f75-38484e580fc7", + "original_timestamp": "2020-01-24T06:29:02.364Z", + "received_at": "2020-01-24T06:29:02.403Z", + "sent_at": "2020-01-24T06:29:02.364Z", + "test_map_nested_map_n_1": "nested prop 1", + "timestamp": "2020-01-24T06:29:02.403Z", + "user_id": "9bb5d4c2-a7aa-4a36-9efb-dd2b1aec5d33" + }, + "metadata": { + "columns": { + "anonymous_id": "string", + "channel": "string", + "city": "string", + "context_app_build": "string", + "context_app_name": "string", + "context_app_namespace": "string", + "context_app_version": "string", + "context_ctest_map_cnested_map_n_1": "string", + "context_ip": "string", + "context_library_name": "string", + "context_library_version": "string", + "context_locale": "string", + "context_passed_ip": "string", + "context_request_ip": "string", + "context_screen_density": "int", + "context_user_agent": "string", + "country": "string", + "email": "string", + "firstname": "string", + "id": "string", + "original_timestamp": "datetime", + "received_at": "datetime", + "sent_at": "datetime", + "test_map_nested_map_n_1": "string", + "timestamp": "datetime", + "user_id": "string", + "uuid_ts": "datetime" + }, + "receivedAt": "2020-01-24T11:59:02.403+05:30", + "table": "aliases" + } + } + ], + rs: [ + { + "data": { + "anonymous_id": "e6ab2c5e-2cda-44a9-a962-e2f67df78bca", + "channel": "web", + "city": "Disney", + "context_app_build": "1.0.0", + "context_app_name": "RudderLabs JavaScript SDK", + "context_app_namespace": "com.rudderlabs.javascript", + "context_app_version": "1.0.5", + "context_ctest_map_cnested_map_n_1": "context nested prop 1", + "context_ip": "0.0.0.0", + "context_library_name": "RudderLabs JavaScript SDK", + "context_library_version": "1.0.5", + "context_locale": "en-GB", + "context_passed_ip": "0.0.0.0", + "context_request_ip": "[::1]:53708", + "context_screen_density": 2, + "context_user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36", + "country": "USA", + "email": "mickey@disney.com", + "firstname": "Mickey", + "id": "a6a0ad5a-bd26-4f19-8f75-38484e580fc7", + "original_timestamp": "2020-01-24T06:29:02.364Z", + "received_at": "2020-01-24T06:29:02.403Z", + "sent_at": "2020-01-24T06:29:02.364Z", + "test_map_nested_map_n_1": "nested prop 1", + "timestamp": "2020-01-24T06:29:02.403Z", + "user_id": "9bb5d4c2-a7aa-4a36-9efb-dd2b1aec5d33" + }, + "metadata": { + "columns": { + "anonymous_id": "string", + "channel": "string", + "city": "string", + "context_app_build": "string", + "context_app_name": "string", + "context_app_namespace": "string", + "context_app_version": "string", + "context_ctest_map_cnested_map_n_1": "string", + "context_ip": "string", + "context_library_name": "string", + "context_library_version": "string", + "context_locale": "string", + "context_passed_ip": "string", + "context_request_ip": "string", + "context_screen_density": "int", + "context_user_agent": "string", + "country": "string", + "email": "string", + "firstname": "string", + "id": "string", + "original_timestamp": "datetime", + "received_at": "datetime", + "sent_at": "datetime", + "test_map_nested_map_n_1": "string", + "timestamp": "datetime", + "user_id": "string", + "uuid_ts": "datetime" + }, + "receivedAt": "2020-01-24T11:59:02.403+05:30", + "table": "aliases" + } + } + ], + bq: [ + { + "data": { + "anonymous_id": "e6ab2c5e-2cda-44a9-a962-e2f67df78bca", + "channel": "web", + "city": "Disney", + "context_app_build": "1.0.0", + "context_app_name": "RudderLabs JavaScript SDK", + "context_app_namespace": "com.rudderlabs.javascript", + "context_app_version": "1.0.5", + "context_ctest_map_cnested_map_n_1": "context nested prop 1", + "context_ip": "0.0.0.0", + "context_library_name": "RudderLabs JavaScript SDK", + "context_library_version": "1.0.5", + "context_locale": "en-GB", + "context_passed_ip": "0.0.0.0", + "context_request_ip": "[::1]:53708", + "context_screen_density": 2, + "context_user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36", + "country": "USA", + "email": "mickey@disney.com", + "firstname": "Mickey", + "id": "a6a0ad5a-bd26-4f19-8f75-38484e580fc7", + "original_timestamp": "2020-01-24T06:29:02.364Z", + "received_at": "2020-01-24T06:29:02.403Z", + "sent_at": "2020-01-24T06:29:02.364Z", + "test_map_nested_map_n_1": "nested prop 1", + "timestamp": "2020-01-24T06:29:02.403Z", + "user_id": "9bb5d4c2-a7aa-4a36-9efb-dd2b1aec5d33" + }, + "metadata": { + "columns": { + "anonymous_id": "string", + "channel": "string", + "city": "string", + "context_app_build": "string", + "context_app_name": "string", + "context_app_namespace": "string", + "context_app_version": "string", + "context_ctest_map_cnested_map_n_1": "string", + "context_ip": "string", + "context_library_name": "string", + "context_library_version": "string", + "context_locale": "string", + "context_passed_ip": "string", + "context_request_ip": "string", + "context_screen_density": "int", + "context_user_agent": "string", + "country": "string", + "email": "string", + "firstname": "string", + "id": "string", + "loaded_at": "datetime", + "original_timestamp": "datetime", + "received_at": "datetime", + "sent_at": "datetime", + "test_map_nested_map_n_1": "string", + "timestamp": "datetime", + "user_id": "string", + "uuid_ts": "datetime" + }, + "receivedAt": "2020-01-24T11:59:02.403+05:30", + "table": "aliases" + } + } + ], + postgres: [ + { + "data": { + "anonymous_id": "e6ab2c5e-2cda-44a9-a962-e2f67df78bca", + "channel": "web", + "city": "Disney", + "context_app_build": "1.0.0", + "context_app_name": "RudderLabs JavaScript SDK", + "context_app_namespace": "com.rudderlabs.javascript", + "context_app_version": "1.0.5", + "context_ctest_map_cnested_map_n_1": "context nested prop 1", + "context_ip": "0.0.0.0", + "context_library_name": "RudderLabs JavaScript SDK", + "context_library_version": "1.0.5", + "context_locale": "en-GB", + "context_passed_ip": "0.0.0.0", + "context_request_ip": "[::1]:53708", + "context_screen_density": 2, + "context_user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36", + "country": "USA", + "email": "mickey@disney.com", + "firstname": "Mickey", + "id": "a6a0ad5a-bd26-4f19-8f75-38484e580fc7", + "original_timestamp": "2020-01-24T06:29:02.364Z", + "received_at": "2020-01-24T06:29:02.403Z", + "sent_at": "2020-01-24T06:29:02.364Z", + "test_map_nested_map_n_1": "nested prop 1", + "timestamp": "2020-01-24T06:29:02.403Z", + "user_id": "9bb5d4c2-a7aa-4a36-9efb-dd2b1aec5d33" + }, + "metadata": { + "columns": { + "anonymous_id": "string", + "channel": "string", + "city": "string", + "context_app_build": "string", + "context_app_name": "string", + "context_app_namespace": "string", + "context_app_version": "string", + "context_ctest_map_cnested_map_n_1": "string", + "context_ip": "string", + "context_library_name": "string", + "context_library_version": "string", + "context_locale": "string", + "context_passed_ip": "string", + "context_request_ip": "string", + "context_screen_density": "int", + "context_user_agent": "string", + "country": "string", + "email": "string", + "firstname": "string", + "id": "string", + "original_timestamp": "datetime", + "received_at": "datetime", + "sent_at": "datetime", + "test_map_nested_map_n_1": "string", + "timestamp": "datetime", + "user_id": "string", + "uuid_ts": "datetime" + }, + "receivedAt": "2020-01-24T11:59:02.403+05:30", + "table": "aliases" + } + } + ], + snowflake: [ + { + "data": { + "ANONYMOUS_ID": "e6ab2c5e-2cda-44a9-a962-e2f67df78bca", + "CHANNEL": "web", + "CITY": "Disney", + "CONTEXT_APP_BUILD": "1.0.0", + "CONTEXT_APP_NAME": "RudderLabs JavaScript SDK", + "CONTEXT_APP_NAMESPACE": "com.rudderlabs.javascript", + "CONTEXT_APP_VERSION": "1.0.5", + "CONTEXT_CTEST_MAP_CNESTED_MAP_N_1": "context nested prop 1", + "CONTEXT_IP": "0.0.0.0", + "CONTEXT_LIBRARY_NAME": "RudderLabs JavaScript SDK", + "CONTEXT_LIBRARY_VERSION": "1.0.5", + "CONTEXT_LOCALE": "en-GB", + "CONTEXT_PASSED_IP": "0.0.0.0", + "CONTEXT_REQUEST_IP": "[::1]:53708", + "CONTEXT_SCREEN_DENSITY": 2, + "CONTEXT_USER_AGENT": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36", + "COUNTRY": "USA", + "EMAIL": "mickey@disney.com", + "FIRSTNAME": "Mickey", + "ID": "a6a0ad5a-bd26-4f19-8f75-38484e580fc7", + "ORIGINAL_TIMESTAMP": "2020-01-24T06:29:02.364Z", + "RECEIVED_AT": "2020-01-24T06:29:02.403Z", + "SENT_AT": "2020-01-24T06:29:02.364Z", + "TEST_MAP_NESTED_MAP_N_1": "nested prop 1", + "TIMESTAMP": "2020-01-24T06:29:02.403Z", + "USER_ID": "9bb5d4c2-a7aa-4a36-9efb-dd2b1aec5d33" + }, + "metadata": { + "columns": { + "ANONYMOUS_ID": "string", + "CHANNEL": "string", + "CITY": "string", + "CONTEXT_APP_BUILD": "string", + "CONTEXT_APP_NAME": "string", + "CONTEXT_APP_NAMESPACE": "string", + "CONTEXT_APP_VERSION": "string", + "CONTEXT_CTEST_MAP_CNESTED_MAP_N_1": "string", + "CONTEXT_IP": "string", + "CONTEXT_LIBRARY_NAME": "string", + "CONTEXT_LIBRARY_VERSION": "string", + "CONTEXT_LOCALE": "string", + "CONTEXT_PASSED_IP": "string", + "CONTEXT_REQUEST_IP": "string", + "CONTEXT_SCREEN_DENSITY": "int", + "CONTEXT_USER_AGENT": "string", + "COUNTRY": "string", + "EMAIL": "string", + "FIRSTNAME": "string", + "ID": "string", + "ORIGINAL_TIMESTAMP": "datetime", + "RECEIVED_AT": "datetime", + "SENT_AT": "datetime", + "TEST_MAP_NESTED_MAP_N_1": "string", + "TIMESTAMP": "datetime", + "USER_ID": "string", + "UUID_TS": "datetime" + }, + "receivedAt": "2020-01-24T11:59:02.403+05:30", + "table": "ALIASES" + } + } + ], + } +} diff --git a/test/__tests__/data/warehouse/integrations/jsonpaths/legacy/extract.js b/test/__tests__/data/warehouse/integrations/jsonpaths/legacy/extract.js new file mode 100644 index 0000000000..906c3ada23 --- /dev/null +++ b/test/__tests__/data/warehouse/integrations/jsonpaths/legacy/extract.js @@ -0,0 +1,278 @@ +module.exports = { + input: { + destination: { + Config: {} + }, + message: { + anonymousId: "e6ab2c5e-2cda-44a9-a962-e2f67df78bca", + channel: "web", + context: { + sources: { + job_id: "djfhksdjhfkjdhfkjahkf", + version: "1169/merge", + job_run_id: "job_run_id", + task_run_id: "task_run_id" + }, + CMap: { + nestedMap: { + n1: "context nested prop 1" + } + }, + userAgent: + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36" + }, + event: "Product Added", + integrations: { + All: true, + RS: { + options: { + jsonPaths: [ + "PMap.nestedMap", + "CMap.nestedMap", + ] + } + }, + BQ: { + options: { + jsonPaths: [ + "PMap.nestedMap", + "CMap.nestedMap", + ] + } + }, + POSTGRES: { + options: { + jsonPaths: [ + "PMap.nestedMap", + "CMap.nestedMap", + ] + } + }, + SNOWFLAKE: { + options: { + jsonPaths: [ + "PMap.nestedMap", + "CMap.nestedMap", + ] + } + }, + S3_DATALAKE: { + options: { + skipReservedKeywordsEscaping: true + } + }, + }, + recordId: "a6a0ad5a-bd26-4f19-8f75-38484e580fc7", + messageId: "a6a0ad5a-bd26-4f19-8f75-38484e580fc7", + originalTimestamp: "2020-01-24T06:29:02.364Z", + properties: { + currency: "USD", + revenue: 50, + PMap: { + nestedMap: { + n1: "nested prop 1" + } + }, + }, + type: "extract", + receivedAt: "2020-01-24T11:59:02.403+05:30", + request_ip: "[::1]:53708", + sentAt: "2020-01-24T06:29:02.364Z", + timestamp: "2020-01-24T11:59:02.403+05:30", + userId: "9bb5d4c2-a7aa-4a36-9efb-dd2b1aec5d33" + }, + request: { + query: { + whSchemaVersion: "v1" + } + } + }, + output: { + default: [ + { + "data": { + "context_c_map_nested_map_n_1": "context nested prop 1", + "context_sources_job_id": "djfhksdjhfkjdhfkjahkf", + "context_sources_job_run_id": "job_run_id", + "context_sources_task_run_id": "task_run_id", + "context_sources_version": "1169/merge", + "context_user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36", + "currency": "USD", + "event": "Product Added", + "id": "a6a0ad5a-bd26-4f19-8f75-38484e580fc7", + "p_map_nested_map_n_1": "nested prop 1", + "received_at": "2020-01-24T06:29:02.403Z", + "revenue": 50 + }, + "metadata": { + "columns": { + "context_c_map_nested_map_n_1": "string", + "context_sources_job_id": "string", + "context_sources_job_run_id": "string", + "context_sources_task_run_id": "string", + "context_sources_version": "string", + "context_user_agent": "string", + "currency": "string", + "event": "string", + "id": "string", + "p_map_nested_map_n_1": "string", + "received_at": "datetime", + "revenue": "int", + "uuid_ts": "datetime" + }, + "receivedAt": "2020-01-24T11:59:02.403+05:30", + "table": "product_added" + } + } + ], + rs: [ + { + "data": { + "context_c_map_nested_map_n_1": "context nested prop 1", + "context_sources_job_id": "djfhksdjhfkjdhfkjahkf", + "context_sources_job_run_id": "job_run_id", + "context_sources_task_run_id": "task_run_id", + "context_sources_version": "1169/merge", + "context_user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36", + "currency": "USD", + "event": "Product Added", + "id": "a6a0ad5a-bd26-4f19-8f75-38484e580fc7", + "p_map_nested_map_n_1": "nested prop 1", + "received_at": "2020-01-24T06:29:02.403Z", + "revenue": 50 + }, + "metadata": { + "columns": { + "context_c_map_nested_map_n_1": "string", + "context_sources_job_id": "string", + "context_sources_job_run_id": "string", + "context_sources_task_run_id": "string", + "context_sources_version": "string", + "context_user_agent": "string", + "currency": "string", + "event": "string", + "id": "string", + "p_map_nested_map_n_1": "string", + "received_at": "datetime", + "revenue": "int", + "uuid_ts": "datetime" + }, + "receivedAt": "2020-01-24T11:59:02.403+05:30", + "table": "product_added" + } + } + ], + bq: [ + { + "data": { + "context_c_map_nested_map_n_1": "context nested prop 1", + "context_sources_job_id": "djfhksdjhfkjdhfkjahkf", + "context_sources_job_run_id": "job_run_id", + "context_sources_task_run_id": "task_run_id", + "context_sources_version": "1169/merge", + "context_user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36", + "currency": "USD", + "event": "Product Added", + "id": "a6a0ad5a-bd26-4f19-8f75-38484e580fc7", + "p_map_nested_map_n_1": "nested prop 1", + "received_at": "2020-01-24T06:29:02.403Z", + "revenue": 50 + }, + "metadata": { + "columns": { + "context_c_map_nested_map_n_1": "string", + "context_sources_job_id": "string", + "context_sources_job_run_id": "string", + "context_sources_task_run_id": "string", + "context_sources_version": "string", + "context_user_agent": "string", + "currency": "string", + "event": "string", + "id": "string", + "loaded_at": "datetime", + "p_map_nested_map_n_1": "string", + "received_at": "datetime", + "revenue": "int", + "uuid_ts": "datetime" + }, + "receivedAt": "2020-01-24T11:59:02.403+05:30", + "table": "product_added" + } + } + ], + postgres: [ + { + "data": { + "context_c_map_nested_map_n_1": "context nested prop 1", + "context_sources_job_id": "djfhksdjhfkjdhfkjahkf", + "context_sources_job_run_id": "job_run_id", + "context_sources_task_run_id": "task_run_id", + "context_sources_version": "1169/merge", + "context_user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36", + "currency": "USD", + "event": "Product Added", + "id": "a6a0ad5a-bd26-4f19-8f75-38484e580fc7", + "p_map_nested_map_n_1": "nested prop 1", + "received_at": "2020-01-24T06:29:02.403Z", + "revenue": 50 + }, + "metadata": { + "columns": { + "context_c_map_nested_map_n_1": "string", + "context_sources_job_id": "string", + "context_sources_job_run_id": "string", + "context_sources_task_run_id": "string", + "context_sources_version": "string", + "context_user_agent": "string", + "currency": "string", + "event": "string", + "id": "string", + "p_map_nested_map_n_1": "string", + "received_at": "datetime", + "revenue": "int", + "uuid_ts": "datetime" + }, + "receivedAt": "2020-01-24T11:59:02.403+05:30", + "table": "product_added" + } + } + ], + snowflake: [ + { + "data": { + "CONTEXT_C_MAP_NESTED_MAP_N_1": "context nested prop 1", + "CONTEXT_SOURCES_JOB_ID": "djfhksdjhfkjdhfkjahkf", + "CONTEXT_SOURCES_JOB_RUN_ID": "job_run_id", + "CONTEXT_SOURCES_TASK_RUN_ID": "task_run_id", + "CONTEXT_SOURCES_VERSION": "1169/merge", + "CONTEXT_USER_AGENT": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36", + "CURRENCY": "USD", + "EVENT": "Product Added", + "ID": "a6a0ad5a-bd26-4f19-8f75-38484e580fc7", + "P_MAP_NESTED_MAP_N_1": "nested prop 1", + "RECEIVED_AT": "2020-01-24T06:29:02.403Z", + "REVENUE": 50 + }, + "metadata": { + "columns": { + "CONTEXT_C_MAP_NESTED_MAP_N_1": "string", + "CONTEXT_SOURCES_JOB_ID": "string", + "CONTEXT_SOURCES_JOB_RUN_ID": "string", + "CONTEXT_SOURCES_TASK_RUN_ID": "string", + "CONTEXT_SOURCES_VERSION": "string", + "CONTEXT_USER_AGENT": "string", + "CURRENCY": "string", + "EVENT": "string", + "ID": "string", + "P_MAP_NESTED_MAP_N_1": "string", + "RECEIVED_AT": "datetime", + "REVENUE": "int", + "UUID_TS": "datetime" + }, + "receivedAt": "2020-01-24T11:59:02.403+05:30", + "table": "PRODUCT_ADDED" + } + } + ] + } +} diff --git a/test/__tests__/data/warehouse/integrations/jsonpaths/legacy/groups.js b/test/__tests__/data/warehouse/integrations/jsonpaths/legacy/groups.js new file mode 100644 index 0000000000..13b243f3a7 --- /dev/null +++ b/test/__tests__/data/warehouse/integrations/jsonpaths/legacy/groups.js @@ -0,0 +1,432 @@ +module.exports = { + input: { + destination: { + Config: {} + }, + message: { + anonymousId: "e6ab2c5e-2cda-44a9-a962-e2f67df78bca", + channel: "web", + traits: { + city: "Disney", + country: "USA", + email: "mickey@disney.com", + firstname: "Mickey", + testMap: { + nestedMap: { + n1: "nested prop 1" + } + }, + }, + context: { + app: { + build: "1.0.0", + name: "RudderLabs JavaScript SDK", + namespace: "com.rudderlabs.javascript", + version: "1.0.5" + }, + ip: "0.0.0.0", + library: { + name: "RudderLabs JavaScript SDK", + version: "1.0.5" + }, + ctestMap: { + cnestedMap: { + n1: "context nested prop 1" + } + }, + locale: "en-GB", + 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.117 Safari/537.36" + }, + integrations: { + All: true, + RS: { + options: { + jsonPaths: [ + "testMap.nestedMap", + "ctestMap.cnestedMap", + ] + } + }, + BQ: { + options: { + jsonPaths: [ + "testMap.nestedMap", + "ctestMap.cnestedMap", + ] + } + }, + POSTGRES: { + options: { + jsonPaths: [ + "testMap.nestedMap", + "ctestMap.cnestedMap", + ] + } + }, + SNOWFLAKE: { + options: { + jsonPaths: [ + "testMap.nestedMap", + "ctestMap.cnestedMap", + ] + } + }, + GCS_DATALAKE: { + options: { + skipReservedKeywordsEscaping: true + } + }, + S3_DATALAKE: { + options: { + skipReservedKeywordsEscaping: true + } + }, + }, + messageId: "a6a0ad5a-bd26-4f19-8f75-38484e580fc7", + originalTimestamp: "2020-01-24T06:29:02.364Z", + receivedAt: "2020-01-24T11:59:02.403+05:30", + request_ip: "[::1]:53708", + sentAt: "2020-01-24T06:29:02.364Z", + timestamp: "2020-01-24T11:59:02.403+05:30", + type: "group", + userId: "9bb5d4c2-a7aa-4a36-9efb-dd2b1aec5d33" + }, + request: { + query: { + whSchemaVersion: "v1" + } + } + }, + output: { + default: [ + { + "data": { + "anonymous_id": "e6ab2c5e-2cda-44a9-a962-e2f67df78bca", + "channel": "web", + "city": "Disney", + "context_app_build": "1.0.0", + "context_app_name": "RudderLabs JavaScript SDK", + "context_app_namespace": "com.rudderlabs.javascript", + "context_app_version": "1.0.5", + "context_ctest_map_cnested_map_n_1": "context nested prop 1", + "context_ip": "0.0.0.0", + "context_library_name": "RudderLabs JavaScript SDK", + "context_library_version": "1.0.5", + "context_locale": "en-GB", + "context_passed_ip": "0.0.0.0", + "context_request_ip": "[::1]:53708", + "context_screen_density": 2, + "context_user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36", + "country": "USA", + "email": "mickey@disney.com", + "firstname": "Mickey", + "id": "a6a0ad5a-bd26-4f19-8f75-38484e580fc7", + "original_timestamp": "2020-01-24T06:29:02.364Z", + "received_at": "2020-01-24T06:29:02.403Z", + "sent_at": "2020-01-24T06:29:02.364Z", + "test_map_nested_map_n_1": "nested prop 1", + "timestamp": "2020-01-24T06:29:02.403Z", + "user_id": "9bb5d4c2-a7aa-4a36-9efb-dd2b1aec5d33" + }, + "metadata": { + "columns": { + "anonymous_id": "string", + "channel": "string", + "city": "string", + "context_app_build": "string", + "context_app_name": "string", + "context_app_namespace": "string", + "context_app_version": "string", + "context_ctest_map_cnested_map_n_1": "string", + "context_ip": "string", + "context_library_name": "string", + "context_library_version": "string", + "context_locale": "string", + "context_passed_ip": "string", + "context_request_ip": "string", + "context_screen_density": "int", + "context_user_agent": "string", + "country": "string", + "email": "string", + "firstname": "string", + "id": "string", + "original_timestamp": "datetime", + "received_at": "datetime", + "sent_at": "datetime", + "test_map_nested_map_n_1": "string", + "timestamp": "datetime", + "user_id": "string", + "uuid_ts": "datetime" + }, + "receivedAt": "2020-01-24T11:59:02.403+05:30", + "table": "groups" + } + } + ], + rs: [ + { + "data": { + "anonymous_id": "e6ab2c5e-2cda-44a9-a962-e2f67df78bca", + "channel": "web", + "city": "Disney", + "context_app_build": "1.0.0", + "context_app_name": "RudderLabs JavaScript SDK", + "context_app_namespace": "com.rudderlabs.javascript", + "context_app_version": "1.0.5", + "context_ctest_map_cnested_map_n_1": "context nested prop 1", + "context_ip": "0.0.0.0", + "context_library_name": "RudderLabs JavaScript SDK", + "context_library_version": "1.0.5", + "context_locale": "en-GB", + "context_passed_ip": "0.0.0.0", + "context_request_ip": "[::1]:53708", + "context_screen_density": 2, + "context_user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36", + "country": "USA", + "email": "mickey@disney.com", + "firstname": "Mickey", + "id": "a6a0ad5a-bd26-4f19-8f75-38484e580fc7", + "original_timestamp": "2020-01-24T06:29:02.364Z", + "received_at": "2020-01-24T06:29:02.403Z", + "sent_at": "2020-01-24T06:29:02.364Z", + "test_map_nested_map_n_1": "nested prop 1", + "timestamp": "2020-01-24T06:29:02.403Z", + "user_id": "9bb5d4c2-a7aa-4a36-9efb-dd2b1aec5d33" + }, + "metadata": { + "columns": { + "anonymous_id": "string", + "channel": "string", + "city": "string", + "context_app_build": "string", + "context_app_name": "string", + "context_app_namespace": "string", + "context_app_version": "string", + "context_ctest_map_cnested_map_n_1": "string", + "context_ip": "string", + "context_library_name": "string", + "context_library_version": "string", + "context_locale": "string", + "context_passed_ip": "string", + "context_request_ip": "string", + "context_screen_density": "int", + "context_user_agent": "string", + "country": "string", + "email": "string", + "firstname": "string", + "id": "string", + "original_timestamp": "datetime", + "received_at": "datetime", + "sent_at": "datetime", + "test_map_nested_map_n_1": "string", + "timestamp": "datetime", + "user_id": "string", + "uuid_ts": "datetime" + }, + "receivedAt": "2020-01-24T11:59:02.403+05:30", + "table": "groups" + } + } + ], + bq: [ + { + "data": { + "anonymous_id": "e6ab2c5e-2cda-44a9-a962-e2f67df78bca", + "channel": "web", + "city": "Disney", + "context_app_build": "1.0.0", + "context_app_name": "RudderLabs JavaScript SDK", + "context_app_namespace": "com.rudderlabs.javascript", + "context_app_version": "1.0.5", + "context_ctest_map_cnested_map_n_1": "context nested prop 1", + "context_ip": "0.0.0.0", + "context_library_name": "RudderLabs JavaScript SDK", + "context_library_version": "1.0.5", + "context_locale": "en-GB", + "context_passed_ip": "0.0.0.0", + "context_request_ip": "[::1]:53708", + "context_screen_density": 2, + "context_user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36", + "country": "USA", + "email": "mickey@disney.com", + "firstname": "Mickey", + "id": "a6a0ad5a-bd26-4f19-8f75-38484e580fc7", + "original_timestamp": "2020-01-24T06:29:02.364Z", + "received_at": "2020-01-24T06:29:02.403Z", + "sent_at": "2020-01-24T06:29:02.364Z", + "test_map_nested_map_n_1": "nested prop 1", + "timestamp": "2020-01-24T06:29:02.403Z", + "user_id": "9bb5d4c2-a7aa-4a36-9efb-dd2b1aec5d33" + }, + "metadata": { + "columns": { + "anonymous_id": "string", + "channel": "string", + "city": "string", + "context_app_build": "string", + "context_app_name": "string", + "context_app_namespace": "string", + "context_app_version": "string", + "context_ctest_map_cnested_map_n_1": "string", + "context_ip": "string", + "context_library_name": "string", + "context_library_version": "string", + "context_locale": "string", + "context_passed_ip": "string", + "context_request_ip": "string", + "context_screen_density": "int", + "context_user_agent": "string", + "country": "string", + "email": "string", + "firstname": "string", + "id": "string", + "loaded_at": "datetime", + "original_timestamp": "datetime", + "received_at": "datetime", + "sent_at": "datetime", + "test_map_nested_map_n_1": "string", + "timestamp": "datetime", + "user_id": "string", + "uuid_ts": "datetime" + }, + "receivedAt": "2020-01-24T11:59:02.403+05:30", + "table": "_groups" + } + } + ], + postgres: [ + { + "data": { + "anonymous_id": "e6ab2c5e-2cda-44a9-a962-e2f67df78bca", + "channel": "web", + "city": "Disney", + "context_app_build": "1.0.0", + "context_app_name": "RudderLabs JavaScript SDK", + "context_app_namespace": "com.rudderlabs.javascript", + "context_app_version": "1.0.5", + "context_ctest_map_cnested_map_n_1": "context nested prop 1", + "context_ip": "0.0.0.0", + "context_library_name": "RudderLabs JavaScript SDK", + "context_library_version": "1.0.5", + "context_locale": "en-GB", + "context_passed_ip": "0.0.0.0", + "context_request_ip": "[::1]:53708", + "context_screen_density": 2, + "context_user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36", + "country": "USA", + "email": "mickey@disney.com", + "firstname": "Mickey", + "id": "a6a0ad5a-bd26-4f19-8f75-38484e580fc7", + "original_timestamp": "2020-01-24T06:29:02.364Z", + "received_at": "2020-01-24T06:29:02.403Z", + "sent_at": "2020-01-24T06:29:02.364Z", + "test_map_nested_map_n_1": "nested prop 1", + "timestamp": "2020-01-24T06:29:02.403Z", + "user_id": "9bb5d4c2-a7aa-4a36-9efb-dd2b1aec5d33" + }, + "metadata": { + "columns": { + "anonymous_id": "string", + "channel": "string", + "city": "string", + "context_app_build": "string", + "context_app_name": "string", + "context_app_namespace": "string", + "context_app_version": "string", + "context_ctest_map_cnested_map_n_1": "string", + "context_ip": "string", + "context_library_name": "string", + "context_library_version": "string", + "context_locale": "string", + "context_passed_ip": "string", + "context_request_ip": "string", + "context_screen_density": "int", + "context_user_agent": "string", + "country": "string", + "email": "string", + "firstname": "string", + "id": "string", + "original_timestamp": "datetime", + "received_at": "datetime", + "sent_at": "datetime", + "test_map_nested_map_n_1": "string", + "timestamp": "datetime", + "user_id": "string", + "uuid_ts": "datetime" + }, + "receivedAt": "2020-01-24T11:59:02.403+05:30", + "table": "groups" + } + } + ], + snowflake: [ + { + "data": { + "ANONYMOUS_ID": "e6ab2c5e-2cda-44a9-a962-e2f67df78bca", + "CHANNEL": "web", + "CITY": "Disney", + "CONTEXT_APP_BUILD": "1.0.0", + "CONTEXT_APP_NAME": "RudderLabs JavaScript SDK", + "CONTEXT_APP_NAMESPACE": "com.rudderlabs.javascript", + "CONTEXT_APP_VERSION": "1.0.5", + "CONTEXT_CTEST_MAP_CNESTED_MAP_N_1": "context nested prop 1", + "CONTEXT_IP": "0.0.0.0", + "CONTEXT_LIBRARY_NAME": "RudderLabs JavaScript SDK", + "CONTEXT_LIBRARY_VERSION": "1.0.5", + "CONTEXT_LOCALE": "en-GB", + "CONTEXT_PASSED_IP": "0.0.0.0", + "CONTEXT_REQUEST_IP": "[::1]:53708", + "CONTEXT_SCREEN_DENSITY": 2, + "CONTEXT_USER_AGENT": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36", + "COUNTRY": "USA", + "EMAIL": "mickey@disney.com", + "FIRSTNAME": "Mickey", + "ID": "a6a0ad5a-bd26-4f19-8f75-38484e580fc7", + "ORIGINAL_TIMESTAMP": "2020-01-24T06:29:02.364Z", + "RECEIVED_AT": "2020-01-24T06:29:02.403Z", + "SENT_AT": "2020-01-24T06:29:02.364Z", + "TEST_MAP_NESTED_MAP_N_1": "nested prop 1", + "TIMESTAMP": "2020-01-24T06:29:02.403Z", + "USER_ID": "9bb5d4c2-a7aa-4a36-9efb-dd2b1aec5d33" + }, + "metadata": { + "columns": { + "ANONYMOUS_ID": "string", + "CHANNEL": "string", + "CITY": "string", + "CONTEXT_APP_BUILD": "string", + "CONTEXT_APP_NAME": "string", + "CONTEXT_APP_NAMESPACE": "string", + "CONTEXT_APP_VERSION": "string", + "CONTEXT_CTEST_MAP_CNESTED_MAP_N_1": "string", + "CONTEXT_IP": "string", + "CONTEXT_LIBRARY_NAME": "string", + "CONTEXT_LIBRARY_VERSION": "string", + "CONTEXT_LOCALE": "string", + "CONTEXT_PASSED_IP": "string", + "CONTEXT_REQUEST_IP": "string", + "CONTEXT_SCREEN_DENSITY": "int", + "CONTEXT_USER_AGENT": "string", + "COUNTRY": "string", + "EMAIL": "string", + "FIRSTNAME": "string", + "ID": "string", + "ORIGINAL_TIMESTAMP": "datetime", + "RECEIVED_AT": "datetime", + "SENT_AT": "datetime", + "TEST_MAP_NESTED_MAP_N_1": "string", + "TIMESTAMP": "datetime", + "USER_ID": "string", + "UUID_TS": "datetime" + }, + "receivedAt": "2020-01-24T11:59:02.403+05:30", + "table": "GROUPS" + } + } + ], + } +} diff --git a/test/__tests__/data/warehouse/integrations/jsonpaths/legacy/identifies.js b/test/__tests__/data/warehouse/integrations/jsonpaths/legacy/identifies.js new file mode 100644 index 0000000000..47b7f1209a --- /dev/null +++ b/test/__tests__/data/warehouse/integrations/jsonpaths/legacy/identifies.js @@ -0,0 +1,850 @@ +module.exports = { + input: { + destination: { + Config: {} + }, + message: { + type: "identify", + sentAt: "2021-01-03T17:02:53.195Z", + userId: "user123", + channel: "web", + integrations: { + All: true, + RS: { + options: { + jsonPaths: [ + "UPMap.nestedMap", + "CTMap.nestedMap", + "TMap.nestedMap", + "CMap.nestedMap", + ] + } + }, + BQ: { + options: { + jsonPaths: [ + "UPMap.nestedMap", + "CTMap.nestedMap", + "TMap.nestedMap", + "CMap.nestedMap", + ] + } + }, + POSTGRES: { + options: { + jsonPaths: [ + "UPMap.nestedMap", + "CTMap.nestedMap", + "TMap.nestedMap", + "CMap.nestedMap", + ] + } + }, + SNOWFLAKE: { + options: { + jsonPaths: [ + "UPMap.nestedMap", + "CTMap.nestedMap", + "TMap.nestedMap", + "CMap.nestedMap", + ] + } + }, + S3_DATALAKE: { + options: { + skipReservedKeywordsEscaping: true + } + }, + }, + userProperties: { + email: "test@gmail.com", + UPMap: { + nestedMap: { + n1: "nested prop 1" + } + }, + }, + traits: { + TMap: { + nestedMap: { + n1: "nested prop 1" + } + }, + }, + context: { + os: { + "name": "android", + "version": "1.12.3" + }, + app: { + name: "RudderLabs JavaScript SDK", + build: "1.0.0", + version: "1.1.11", + namespace: "com.rudderlabs.javascript" + }, + traits: { + email: "user123@email.com", + phone: "+917836362334", + userId: "user123", + CTMap: { + nestedMap: { + n1: "nested prop 1" + } + }, + }, + CMap: { + nestedMap: { + n1: "context nested prop 1" + } + }, + locale: "en-US", + device: { + token: "token", + id: "id", + type: "ios" + }, + library: { + name: "RudderLabs JavaScript SDK", + version: "1.1.11" + }, + userAgent: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.16; rv:84.0) Gecko/20100101 Firefox/84.0" + }, + rudderId: "8f8fa6b5-8e24-489c-8e22-61f23f2e364f", + messageId: "2116ef8c-efc3-4ca4-851b-02ee60dad6ff", + anonymousId: "97c46c81-3140-456d-b2a9-690d70aaca35", + originalTimestamp: "2020-01-24T06:29:02.364Z", + receivedAt: "2020-01-24T11:59:02.403+05:30", + request_ip: "[::1]:53708", + timestamp: "2020-01-24T11:59:02.403+05:30" + }, + request: { + query: { + whSchemaVersion: "v1" + } + } + }, + output: { + default: [ + { + "data": { + "anonymous_id": "97c46c81-3140-456d-b2a9-690d70aaca35", + "channel": "web", + "context_app_build": "1.0.0", + "context_app_name": "RudderLabs JavaScript SDK", + "context_app_namespace": "com.rudderlabs.javascript", + "context_app_version": "1.1.11", + "context_c_map_nested_map_n_1": "context nested prop 1", + "context_device_id": "id", + "context_device_token": "token", + "context_device_type": "ios", + "context_ip": "[::1]:53708", + "context_library_name": "RudderLabs JavaScript SDK", + "context_library_version": "1.1.11", + "context_locale": "en-US", + "context_os_name": "android", + "context_os_version": "1.12.3", + "context_request_ip": "[::1]:53708", + "context_traits_ct_map_nested_map_n_1": "nested prop 1", + "context_traits_email": "user123@email.com", + "context_traits_phone": "+917836362334", + "context_traits_user_id": "user123", + "context_user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.16; rv:84.0) Gecko/20100101 Firefox/84.0", + "ct_map_nested_map_n_1": "nested prop 1", + "email": "user123@email.com", + "id": "2116ef8c-efc3-4ca4-851b-02ee60dad6ff", + "original_timestamp": "2020-01-24T06:29:02.364Z", + "phone": "+917836362334", + "received_at": "2020-01-24T06:29:02.403Z", + "sent_at": "2021-01-03T17:02:53.195Z", + "t_map_nested_map_n_1": "nested prop 1", + "timestamp": "2020-01-24T06:29:02.403Z", + "up_map_nested_map_n_1": "nested prop 1", + "user_id": "user123" + }, + "metadata": { + "columns": { + "anonymous_id": "string", + "channel": "string", + "context_app_build": "string", + "context_app_name": "string", + "context_app_namespace": "string", + "context_app_version": "string", + "context_c_map_nested_map_n_1": "string", + "context_device_id": "string", + "context_device_token": "string", + "context_device_type": "string", + "context_ip": "string", + "context_library_name": "string", + "context_library_version": "string", + "context_locale": "string", + "context_os_name": "string", + "context_os_version": "string", + "context_request_ip": "string", + "context_traits_ct_map_nested_map_n_1": "string", + "context_traits_email": "string", + "context_traits_phone": "string", + "context_traits_user_id": "string", + "context_user_agent": "string", + "ct_map_nested_map_n_1": "string", + "email": "string", + "id": "string", + "original_timestamp": "datetime", + "phone": "string", + "received_at": "datetime", + "sent_at": "datetime", + "t_map_nested_map_n_1": "string", + "timestamp": "datetime", + "up_map_nested_map_n_1": "string", + "user_id": "string", + "uuid_ts": "datetime" + }, + "receivedAt": "2020-01-24T11:59:02.403+05:30", + "table": "identifies" + } + }, + { + "data": { + "context_app_build": "1.0.0", + "context_app_name": "RudderLabs JavaScript SDK", + "context_app_namespace": "com.rudderlabs.javascript", + "context_app_version": "1.1.11", + "context_c_map_nested_map_n_1": "context nested prop 1", + "context_device_id": "id", + "context_device_token": "token", + "context_device_type": "ios", + "context_ip": "[::1]:53708", + "context_library_name": "RudderLabs JavaScript SDK", + "context_library_version": "1.1.11", + "context_locale": "en-US", + "context_os_name": "android", + "context_os_version": "1.12.3", + "context_request_ip": "[::1]:53708", + "context_traits_ct_map_nested_map_n_1": "nested prop 1", + "context_traits_email": "user123@email.com", + "context_traits_phone": "+917836362334", + "context_traits_user_id": "user123", + "context_user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.16; rv:84.0) Gecko/20100101 Firefox/84.0", + "ct_map_nested_map_n_1": "nested prop 1", + "email": "user123@email.com", + "id": "user123", + "phone": "+917836362334", + "received_at": "2020-01-24T06:29:02.403Z", + "t_map_nested_map_n_1": "nested prop 1", + "up_map_nested_map_n_1": "nested prop 1" + }, + "metadata": { + "columns": { + "context_app_build": "string", + "context_app_name": "string", + "context_app_namespace": "string", + "context_app_version": "string", + "context_c_map_nested_map_n_1": "string", + "context_device_id": "string", + "context_device_token": "string", + "context_device_type": "string", + "context_ip": "string", + "context_library_name": "string", + "context_library_version": "string", + "context_locale": "string", + "context_os_name": "string", + "context_os_version": "string", + "context_request_ip": "string", + "context_traits_ct_map_nested_map_n_1": "string", + "context_traits_email": "string", + "context_traits_phone": "string", + "context_traits_user_id": "string", + "context_user_agent": "string", + "ct_map_nested_map_n_1": "string", + "email": "string", + "id": "string", + "phone": "string", + "received_at": "datetime", + "t_map_nested_map_n_1": "string", + "up_map_nested_map_n_1": "string", + "uuid_ts": "datetime" + }, + "receivedAt": "2020-01-24T11:59:02.403+05:30", + "table": "users" + } + } + ], + rs: [ + { + "data": { + "anonymous_id": "97c46c81-3140-456d-b2a9-690d70aaca35", + "channel": "web", + "context_app_build": "1.0.0", + "context_app_name": "RudderLabs JavaScript SDK", + "context_app_namespace": "com.rudderlabs.javascript", + "context_app_version": "1.1.11", + "context_c_map_nested_map_n_1": "context nested prop 1", + "context_device_id": "id", + "context_device_token": "token", + "context_device_type": "ios", + "context_ip": "[::1]:53708", + "context_library_name": "RudderLabs JavaScript SDK", + "context_library_version": "1.1.11", + "context_locale": "en-US", + "context_os_name": "android", + "context_os_version": "1.12.3", + "context_request_ip": "[::1]:53708", + "context_traits_ct_map_nested_map_n_1": "nested prop 1", + "context_traits_email": "user123@email.com", + "context_traits_phone": "+917836362334", + "context_traits_user_id": "user123", + "context_user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.16; rv:84.0) Gecko/20100101 Firefox/84.0", + "ct_map_nested_map_n_1": "nested prop 1", + "email": "user123@email.com", + "id": "2116ef8c-efc3-4ca4-851b-02ee60dad6ff", + "original_timestamp": "2020-01-24T06:29:02.364Z", + "phone": "+917836362334", + "received_at": "2020-01-24T06:29:02.403Z", + "sent_at": "2021-01-03T17:02:53.195Z", + "t_map_nested_map_n_1": "nested prop 1", + "timestamp": "2020-01-24T06:29:02.403Z", + "up_map_nested_map_n_1": "nested prop 1", + "user_id": "user123" + }, + "metadata": { + "columns": { + "anonymous_id": "string", + "channel": "string", + "context_app_build": "string", + "context_app_name": "string", + "context_app_namespace": "string", + "context_app_version": "string", + "context_c_map_nested_map_n_1": "string", + "context_device_id": "string", + "context_device_token": "string", + "context_device_type": "string", + "context_ip": "string", + "context_library_name": "string", + "context_library_version": "string", + "context_locale": "string", + "context_os_name": "string", + "context_os_version": "string", + "context_request_ip": "string", + "context_traits_ct_map_nested_map_n_1": "string", + "context_traits_email": "string", + "context_traits_phone": "string", + "context_traits_user_id": "string", + "context_user_agent": "string", + "ct_map_nested_map_n_1": "string", + "email": "string", + "id": "string", + "original_timestamp": "datetime", + "phone": "string", + "received_at": "datetime", + "sent_at": "datetime", + "t_map_nested_map_n_1": "string", + "timestamp": "datetime", + "up_map_nested_map_n_1": "string", + "user_id": "string", + "uuid_ts": "datetime" + }, + "receivedAt": "2020-01-24T11:59:02.403+05:30", + "table": "identifies" + } + }, + { + "data": { + "context_app_build": "1.0.0", + "context_app_name": "RudderLabs JavaScript SDK", + "context_app_namespace": "com.rudderlabs.javascript", + "context_app_version": "1.1.11", + "context_c_map_nested_map_n_1": "context nested prop 1", + "context_device_id": "id", + "context_device_token": "token", + "context_device_type": "ios", + "context_ip": "[::1]:53708", + "context_library_name": "RudderLabs JavaScript SDK", + "context_library_version": "1.1.11", + "context_locale": "en-US", + "context_os_name": "android", + "context_os_version": "1.12.3", + "context_request_ip": "[::1]:53708", + "context_traits_ct_map_nested_map_n_1": "nested prop 1", + "context_traits_email": "user123@email.com", + "context_traits_phone": "+917836362334", + "context_traits_user_id": "user123", + "context_user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.16; rv:84.0) Gecko/20100101 Firefox/84.0", + "ct_map_nested_map_n_1": "nested prop 1", + "email": "user123@email.com", + "id": "user123", + "phone": "+917836362334", + "received_at": "2020-01-24T06:29:02.403Z", + "t_map_nested_map_n_1": "nested prop 1", + "up_map_nested_map_n_1": "nested prop 1" + }, + "metadata": { + "columns": { + "context_app_build": "string", + "context_app_name": "string", + "context_app_namespace": "string", + "context_app_version": "string", + "context_c_map_nested_map_n_1": "string", + "context_device_id": "string", + "context_device_token": "string", + "context_device_type": "string", + "context_ip": "string", + "context_library_name": "string", + "context_library_version": "string", + "context_locale": "string", + "context_os_name": "string", + "context_os_version": "string", + "context_request_ip": "string", + "context_traits_ct_map_nested_map_n_1": "string", + "context_traits_email": "string", + "context_traits_phone": "string", + "context_traits_user_id": "string", + "context_user_agent": "string", + "ct_map_nested_map_n_1": "string", + "email": "string", + "id": "string", + "phone": "string", + "received_at": "datetime", + "t_map_nested_map_n_1": "string", + "up_map_nested_map_n_1": "string", + "uuid_ts": "datetime" + }, + "receivedAt": "2020-01-24T11:59:02.403+05:30", + "table": "users" + } + } + ], + bq: [ + { + "data": { + "anonymous_id": "97c46c81-3140-456d-b2a9-690d70aaca35", + "channel": "web", + "context_app_build": "1.0.0", + "context_app_name": "RudderLabs JavaScript SDK", + "context_app_namespace": "com.rudderlabs.javascript", + "context_app_version": "1.1.11", + "context_c_map_nested_map_n_1": "context nested prop 1", + "context_device_id": "id", + "context_device_token": "token", + "context_device_type": "ios", + "context_ip": "[::1]:53708", + "context_library_name": "RudderLabs JavaScript SDK", + "context_library_version": "1.1.11", + "context_locale": "en-US", + "context_os_name": "android", + "context_os_version": "1.12.3", + "context_request_ip": "[::1]:53708", + "context_traits_ct_map_nested_map_n_1": "nested prop 1", + "context_traits_email": "user123@email.com", + "context_traits_phone": "+917836362334", + "context_traits_user_id": "user123", + "context_user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.16; rv:84.0) Gecko/20100101 Firefox/84.0", + "ct_map_nested_map_n_1": "nested prop 1", + "email": "user123@email.com", + "id": "2116ef8c-efc3-4ca4-851b-02ee60dad6ff", + "original_timestamp": "2020-01-24T06:29:02.364Z", + "phone": "+917836362334", + "received_at": "2020-01-24T06:29:02.403Z", + "sent_at": "2021-01-03T17:02:53.195Z", + "t_map_nested_map_n_1": "nested prop 1", + "timestamp": "2020-01-24T06:29:02.403Z", + "up_map_nested_map_n_1": "nested prop 1", + "user_id": "user123" + }, + "metadata": { + "columns": { + "anonymous_id": "string", + "channel": "string", + "context_app_build": "string", + "context_app_name": "string", + "context_app_namespace": "string", + "context_app_version": "string", + "context_c_map_nested_map_n_1": "string", + "context_device_id": "string", + "context_device_token": "string", + "context_device_type": "string", + "context_ip": "string", + "context_library_name": "string", + "context_library_version": "string", + "context_locale": "string", + "context_os_name": "string", + "context_os_version": "string", + "context_request_ip": "string", + "context_traits_ct_map_nested_map_n_1": "string", + "context_traits_email": "string", + "context_traits_phone": "string", + "context_traits_user_id": "string", + "context_user_agent": "string", + "ct_map_nested_map_n_1": "string", + "email": "string", + "id": "string", + "loaded_at": "datetime", + "original_timestamp": "datetime", + "phone": "string", + "received_at": "datetime", + "sent_at": "datetime", + "t_map_nested_map_n_1": "string", + "timestamp": "datetime", + "up_map_nested_map_n_1": "string", + "user_id": "string", + "uuid_ts": "datetime" + }, + "receivedAt": "2020-01-24T11:59:02.403+05:30", + "table": "identifies" + } + }, + { + "data": { + "context_app_build": "1.0.0", + "context_app_name": "RudderLabs JavaScript SDK", + "context_app_namespace": "com.rudderlabs.javascript", + "context_app_version": "1.1.11", + "context_c_map_nested_map_n_1": "context nested prop 1", + "context_device_id": "id", + "context_device_token": "token", + "context_device_type": "ios", + "context_ip": "[::1]:53708", + "context_library_name": "RudderLabs JavaScript SDK", + "context_library_version": "1.1.11", + "context_locale": "en-US", + "context_os_name": "android", + "context_os_version": "1.12.3", + "context_request_ip": "[::1]:53708", + "context_traits_ct_map_nested_map_n_1": "nested prop 1", + "context_traits_email": "user123@email.com", + "context_traits_phone": "+917836362334", + "context_traits_user_id": "user123", + "context_user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.16; rv:84.0) Gecko/20100101 Firefox/84.0", + "ct_map_nested_map_n_1": "nested prop 1", + "email": "user123@email.com", + "id": "user123", + "phone": "+917836362334", + "received_at": "2020-01-24T06:29:02.403Z", + "t_map_nested_map_n_1": "nested prop 1", + "up_map_nested_map_n_1": "nested prop 1" + }, + "metadata": { + "columns": { + "context_app_build": "string", + "context_app_name": "string", + "context_app_namespace": "string", + "context_app_version": "string", + "context_c_map_nested_map_n_1": "string", + "context_device_id": "string", + "context_device_token": "string", + "context_device_type": "string", + "context_ip": "string", + "context_library_name": "string", + "context_library_version": "string", + "context_locale": "string", + "context_os_name": "string", + "context_os_version": "string", + "context_request_ip": "string", + "context_traits_ct_map_nested_map_n_1": "string", + "context_traits_email": "string", + "context_traits_phone": "string", + "context_traits_user_id": "string", + "context_user_agent": "string", + "ct_map_nested_map_n_1": "string", + "email": "string", + "id": "string", + "loaded_at": "datetime", + "phone": "string", + "received_at": "datetime", + "t_map_nested_map_n_1": "string", + "up_map_nested_map_n_1": "string", + "uuid_ts": "datetime" + }, + "receivedAt": "2020-01-24T11:59:02.403+05:30", + "table": "users" + } + } + ], + postgres: [ + { + "data": { + "anonymous_id": "97c46c81-3140-456d-b2a9-690d70aaca35", + "channel": "web", + "context_app_build": "1.0.0", + "context_app_name": "RudderLabs JavaScript SDK", + "context_app_namespace": "com.rudderlabs.javascript", + "context_app_version": "1.1.11", + "context_c_map_nested_map_n_1": "context nested prop 1", + "context_device_id": "id", + "context_device_token": "token", + "context_device_type": "ios", + "context_ip": "[::1]:53708", + "context_library_name": "RudderLabs JavaScript SDK", + "context_library_version": "1.1.11", + "context_locale": "en-US", + "context_os_name": "android", + "context_os_version": "1.12.3", + "context_request_ip": "[::1]:53708", + "context_traits_ct_map_nested_map_n_1": "nested prop 1", + "context_traits_email": "user123@email.com", + "context_traits_phone": "+917836362334", + "context_traits_user_id": "user123", + "context_user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.16; rv:84.0) Gecko/20100101 Firefox/84.0", + "ct_map_nested_map_n_1": "nested prop 1", + "email": "user123@email.com", + "id": "2116ef8c-efc3-4ca4-851b-02ee60dad6ff", + "original_timestamp": "2020-01-24T06:29:02.364Z", + "phone": "+917836362334", + "received_at": "2020-01-24T06:29:02.403Z", + "sent_at": "2021-01-03T17:02:53.195Z", + "t_map_nested_map_n_1": "nested prop 1", + "timestamp": "2020-01-24T06:29:02.403Z", + "up_map_nested_map_n_1": "nested prop 1", + "user_id": "user123" + }, + "metadata": { + "columns": { + "anonymous_id": "string", + "channel": "string", + "context_app_build": "string", + "context_app_name": "string", + "context_app_namespace": "string", + "context_app_version": "string", + "context_c_map_nested_map_n_1": "string", + "context_device_id": "string", + "context_device_token": "string", + "context_device_type": "string", + "context_ip": "string", + "context_library_name": "string", + "context_library_version": "string", + "context_locale": "string", + "context_os_name": "string", + "context_os_version": "string", + "context_request_ip": "string", + "context_traits_ct_map_nested_map_n_1": "string", + "context_traits_email": "string", + "context_traits_phone": "string", + "context_traits_user_id": "string", + "context_user_agent": "string", + "ct_map_nested_map_n_1": "string", + "email": "string", + "id": "string", + "original_timestamp": "datetime", + "phone": "string", + "received_at": "datetime", + "sent_at": "datetime", + "t_map_nested_map_n_1": "string", + "timestamp": "datetime", + "up_map_nested_map_n_1": "string", + "user_id": "string", + "uuid_ts": "datetime" + }, + "receivedAt": "2020-01-24T11:59:02.403+05:30", + "table": "identifies" + } + }, + { + "data": { + "context_app_build": "1.0.0", + "context_app_name": "RudderLabs JavaScript SDK", + "context_app_namespace": "com.rudderlabs.javascript", + "context_app_version": "1.1.11", + "context_c_map_nested_map_n_1": "context nested prop 1", + "context_device_id": "id", + "context_device_token": "token", + "context_device_type": "ios", + "context_ip": "[::1]:53708", + "context_library_name": "RudderLabs JavaScript SDK", + "context_library_version": "1.1.11", + "context_locale": "en-US", + "context_os_name": "android", + "context_os_version": "1.12.3", + "context_request_ip": "[::1]:53708", + "context_traits_ct_map_nested_map_n_1": "nested prop 1", + "context_traits_email": "user123@email.com", + "context_traits_phone": "+917836362334", + "context_traits_user_id": "user123", + "context_user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.16; rv:84.0) Gecko/20100101 Firefox/84.0", + "ct_map_nested_map_n_1": "nested prop 1", + "email": "user123@email.com", + "id": "user123", + "phone": "+917836362334", + "received_at": "2020-01-24T06:29:02.403Z", + "t_map_nested_map_n_1": "nested prop 1", + "up_map_nested_map_n_1": "nested prop 1" + }, + "metadata": { + "columns": { + "context_app_build": "string", + "context_app_name": "string", + "context_app_namespace": "string", + "context_app_version": "string", + "context_c_map_nested_map_n_1": "string", + "context_device_id": "string", + "context_device_token": "string", + "context_device_type": "string", + "context_ip": "string", + "context_library_name": "string", + "context_library_version": "string", + "context_locale": "string", + "context_os_name": "string", + "context_os_version": "string", + "context_request_ip": "string", + "context_traits_ct_map_nested_map_n_1": "string", + "context_traits_email": "string", + "context_traits_phone": "string", + "context_traits_user_id": "string", + "context_user_agent": "string", + "ct_map_nested_map_n_1": "string", + "email": "string", + "id": "string", + "phone": "string", + "received_at": "datetime", + "t_map_nested_map_n_1": "string", + "up_map_nested_map_n_1": "string", + "uuid_ts": "datetime" + }, + "receivedAt": "2020-01-24T11:59:02.403+05:30", + "table": "users" + } + } + ], + snowflake: [ + { + "data": { + "ANONYMOUS_ID": "97c46c81-3140-456d-b2a9-690d70aaca35", + "CHANNEL": "web", + "CONTEXT_APP_BUILD": "1.0.0", + "CONTEXT_APP_NAME": "RudderLabs JavaScript SDK", + "CONTEXT_APP_NAMESPACE": "com.rudderlabs.javascript", + "CONTEXT_APP_VERSION": "1.1.11", + "CONTEXT_C_MAP_NESTED_MAP_N_1": "context nested prop 1", + "CONTEXT_DEVICE_ID": "id", + "CONTEXT_DEVICE_TOKEN": "token", + "CONTEXT_DEVICE_TYPE": "ios", + "CONTEXT_IP": "[::1]:53708", + "CONTEXT_LIBRARY_NAME": "RudderLabs JavaScript SDK", + "CONTEXT_LIBRARY_VERSION": "1.1.11", + "CONTEXT_LOCALE": "en-US", + "CONTEXT_OS_NAME": "android", + "CONTEXT_OS_VERSION": "1.12.3", + "CONTEXT_REQUEST_IP": "[::1]:53708", + "CONTEXT_TRAITS_CT_MAP_NESTED_MAP_N_1": "nested prop 1", + "CONTEXT_TRAITS_EMAIL": "user123@email.com", + "CONTEXT_TRAITS_PHONE": "+917836362334", + "CONTEXT_TRAITS_USER_ID": "user123", + "CONTEXT_USER_AGENT": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.16; rv:84.0) Gecko/20100101 Firefox/84.0", + "CT_MAP_NESTED_MAP_N_1": "nested prop 1", + "EMAIL": "user123@email.com", + "ID": "2116ef8c-efc3-4ca4-851b-02ee60dad6ff", + "ORIGINAL_TIMESTAMP": "2020-01-24T06:29:02.364Z", + "PHONE": "+917836362334", + "RECEIVED_AT": "2020-01-24T06:29:02.403Z", + "SENT_AT": "2021-01-03T17:02:53.195Z", + "TIMESTAMP": "2020-01-24T06:29:02.403Z", + "T_MAP_NESTED_MAP_N_1": "nested prop 1", + "UP_MAP_NESTED_MAP_N_1": "nested prop 1", + "USER_ID": "user123" + }, + "metadata": { + "columns": { + "ANONYMOUS_ID": "string", + "CHANNEL": "string", + "CONTEXT_APP_BUILD": "string", + "CONTEXT_APP_NAME": "string", + "CONTEXT_APP_NAMESPACE": "string", + "CONTEXT_APP_VERSION": "string", + "CONTEXT_C_MAP_NESTED_MAP_N_1": "string", + "CONTEXT_DEVICE_ID": "string", + "CONTEXT_DEVICE_TOKEN": "string", + "CONTEXT_DEVICE_TYPE": "string", + "CONTEXT_IP": "string", + "CONTEXT_LIBRARY_NAME": "string", + "CONTEXT_LIBRARY_VERSION": "string", + "CONTEXT_LOCALE": "string", + "CONTEXT_OS_NAME": "string", + "CONTEXT_OS_VERSION": "string", + "CONTEXT_REQUEST_IP": "string", + "CONTEXT_TRAITS_CT_MAP_NESTED_MAP_N_1": "string", + "CONTEXT_TRAITS_EMAIL": "string", + "CONTEXT_TRAITS_PHONE": "string", + "CONTEXT_TRAITS_USER_ID": "string", + "CONTEXT_USER_AGENT": "string", + "CT_MAP_NESTED_MAP_N_1": "string", + "EMAIL": "string", + "ID": "string", + "ORIGINAL_TIMESTAMP": "datetime", + "PHONE": "string", + "RECEIVED_AT": "datetime", + "SENT_AT": "datetime", + "TIMESTAMP": "datetime", + "T_MAP_NESTED_MAP_N_1": "string", + "UP_MAP_NESTED_MAP_N_1": "string", + "USER_ID": "string", + "UUID_TS": "datetime" + }, + "receivedAt": "2020-01-24T11:59:02.403+05:30", + "table": "IDENTIFIES" + } + }, + { + "data": { + "CONTEXT_APP_BUILD": "1.0.0", + "CONTEXT_APP_NAME": "RudderLabs JavaScript SDK", + "CONTEXT_APP_NAMESPACE": "com.rudderlabs.javascript", + "CONTEXT_APP_VERSION": "1.1.11", + "CONTEXT_C_MAP_NESTED_MAP_N_1": "context nested prop 1", + "CONTEXT_DEVICE_ID": "id", + "CONTEXT_DEVICE_TOKEN": "token", + "CONTEXT_DEVICE_TYPE": "ios", + "CONTEXT_IP": "[::1]:53708", + "CONTEXT_LIBRARY_NAME": "RudderLabs JavaScript SDK", + "CONTEXT_LIBRARY_VERSION": "1.1.11", + "CONTEXT_LOCALE": "en-US", + "CONTEXT_OS_NAME": "android", + "CONTEXT_OS_VERSION": "1.12.3", + "CONTEXT_REQUEST_IP": "[::1]:53708", + "CONTEXT_TRAITS_CT_MAP_NESTED_MAP_N_1": "nested prop 1", + "CONTEXT_TRAITS_EMAIL": "user123@email.com", + "CONTEXT_TRAITS_PHONE": "+917836362334", + "CONTEXT_TRAITS_USER_ID": "user123", + "CONTEXT_USER_AGENT": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.16; rv:84.0) Gecko/20100101 Firefox/84.0", + "CT_MAP_NESTED_MAP_N_1": "nested prop 1", + "EMAIL": "user123@email.com", + "ID": "user123", + "PHONE": "+917836362334", + "RECEIVED_AT": "2020-01-24T06:29:02.403Z", + "T_MAP_NESTED_MAP_N_1": "nested prop 1", + "UP_MAP_NESTED_MAP_N_1": "nested prop 1" + }, + "metadata": { + "columns": { + "CONTEXT_APP_BUILD": "string", + "CONTEXT_APP_NAME": "string", + "CONTEXT_APP_NAMESPACE": "string", + "CONTEXT_APP_VERSION": "string", + "CONTEXT_C_MAP_NESTED_MAP_N_1": "string", + "CONTEXT_DEVICE_ID": "string", + "CONTEXT_DEVICE_TOKEN": "string", + "CONTEXT_DEVICE_TYPE": "string", + "CONTEXT_IP": "string", + "CONTEXT_LIBRARY_NAME": "string", + "CONTEXT_LIBRARY_VERSION": "string", + "CONTEXT_LOCALE": "string", + "CONTEXT_OS_NAME": "string", + "CONTEXT_OS_VERSION": "string", + "CONTEXT_REQUEST_IP": "string", + "CONTEXT_TRAITS_CT_MAP_NESTED_MAP_N_1": "string", + "CONTEXT_TRAITS_EMAIL": "string", + "CONTEXT_TRAITS_PHONE": "string", + "CONTEXT_TRAITS_USER_ID": "string", + "CONTEXT_USER_AGENT": "string", + "CT_MAP_NESTED_MAP_N_1": "string", + "EMAIL": "string", + "ID": "string", + "PHONE": "string", + "RECEIVED_AT": "datetime", + "T_MAP_NESTED_MAP_N_1": "string", + "UP_MAP_NESTED_MAP_N_1": "string", + "UUID_TS": "datetime" + }, + "receivedAt": "2020-01-24T11:59:02.403+05:30", + "table": "USERS" + } + } + ], + } +} diff --git a/test/__tests__/data/warehouse/integrations/jsonpaths/legacy/pages.js b/test/__tests__/data/warehouse/integrations/jsonpaths/legacy/pages.js new file mode 100644 index 0000000000..0aac8a3c23 --- /dev/null +++ b/test/__tests__/data/warehouse/integrations/jsonpaths/legacy/pages.js @@ -0,0 +1,405 @@ +module.exports = { + input: { + destination: { + Config: {} + }, + message: { + anonymousId: "e6ab2c5e-2cda-44a9-a962-e2f67df78bca", + channel: "web", + context: { + app: { + build: "1.0.0", + name: "RudderLabs JavaScript SDK", + namespace: "com.rudderlabs.javascript", + version: "1.0.5" + }, + ip: "0.0.0.0", + library: { + name: "RudderLabs JavaScript SDK", + version: "1.0.5" + }, + ctestMap: { + cnestedMap: { + n1: "context nested prop 1" + } + }, + locale: "en-GB", + 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.117 Safari/537.36" + }, + integrations: { + All: true, + RS: { + options: { + jsonPaths: [ + "testMap.nestedMap", + "ctestMap.cnestedMap", + ] + } + }, + BQ: { + options: { + jsonPaths: [ + "testMap.nestedMap", + "ctestMap.cnestedMap", + ] + } + }, + POSTGRES: { + options: { + jsonPaths: [ + "testMap.nestedMap", + "ctestMap.cnestedMap", + ] + } + }, + SNOWFLAKE: { + options: { + jsonPaths: [ + "testMap.nestedMap", + "ctestMap.cnestedMap", + ] + } + }, + S3_DATALAKE: { + options: { + skipReservedKeywordsEscaping: true + } + }, + }, + messageId: "a6a0ad5a-bd26-4f19-8f75-38484e580fc7", + originalTimestamp: "2020-01-24T06:29:02.364Z", + properties: { + currency: "USD", + revenue: 50, + testMap: { + nestedMap: { + n1: "nested prop 1" + } + }, + }, + receivedAt: "2020-01-24T11:59:02.403+05:30", + request_ip: "[::1]:53708", + sentAt: "2020-01-24T06:29:02.364Z", + timestamp: "2020-01-24T11:59:02.403+05:30", + type: "page", + userId: "9bb5d4c2-a7aa-4a36-9efb-dd2b1aec5d33" + }, + request: { + query: { + whSchemaVersion: "v1" + } + } + }, + output: { + default: [ + { + "data": { + "anonymous_id": "e6ab2c5e-2cda-44a9-a962-e2f67df78bca", + "channel": "web", + "context_app_build": "1.0.0", + "context_app_name": "RudderLabs JavaScript SDK", + "context_app_namespace": "com.rudderlabs.javascript", + "context_app_version": "1.0.5", + "context_ctest_map_cnested_map_n_1": "context nested prop 1", + "context_ip": "0.0.0.0", + "context_library_name": "RudderLabs JavaScript SDK", + "context_library_version": "1.0.5", + "context_locale": "en-GB", + "context_passed_ip": "0.0.0.0", + "context_request_ip": "[::1]:53708", + "context_screen_density": 2, + "context_user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36", + "currency": "USD", + "id": "a6a0ad5a-bd26-4f19-8f75-38484e580fc7", + "original_timestamp": "2020-01-24T06:29:02.364Z", + "received_at": "2020-01-24T06:29:02.403Z", + "revenue": 50, + "sent_at": "2020-01-24T06:29:02.364Z", + "test_map_nested_map_n_1": "nested prop 1", + "timestamp": "2020-01-24T06:29:02.403Z", + "user_id": "9bb5d4c2-a7aa-4a36-9efb-dd2b1aec5d33" + }, + "metadata": { + "columns": { + "anonymous_id": "string", + "channel": "string", + "context_app_build": "string", + "context_app_name": "string", + "context_app_namespace": "string", + "context_app_version": "string", + "context_ctest_map_cnested_map_n_1": "string", + "context_ip": "string", + "context_library_name": "string", + "context_library_version": "string", + "context_locale": "string", + "context_passed_ip": "string", + "context_request_ip": "string", + "context_screen_density": "int", + "context_user_agent": "string", + "currency": "string", + "id": "string", + "original_timestamp": "datetime", + "received_at": "datetime", + "revenue": "int", + "sent_at": "datetime", + "test_map_nested_map_n_1": "string", + "timestamp": "datetime", + "user_id": "string", + "uuid_ts": "datetime" + }, + "receivedAt": "2020-01-24T11:59:02.403+05:30", + "table": "pages" + } + } + ], + rs: [ + { + "data": { + "anonymous_id": "e6ab2c5e-2cda-44a9-a962-e2f67df78bca", + "channel": "web", + "context_app_build": "1.0.0", + "context_app_name": "RudderLabs JavaScript SDK", + "context_app_namespace": "com.rudderlabs.javascript", + "context_app_version": "1.0.5", + "context_ctest_map_cnested_map_n_1": "context nested prop 1", + "context_ip": "0.0.0.0", + "context_library_name": "RudderLabs JavaScript SDK", + "context_library_version": "1.0.5", + "context_locale": "en-GB", + "context_passed_ip": "0.0.0.0", + "context_request_ip": "[::1]:53708", + "context_screen_density": 2, + "context_user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36", + "currency": "USD", + "id": "a6a0ad5a-bd26-4f19-8f75-38484e580fc7", + "original_timestamp": "2020-01-24T06:29:02.364Z", + "received_at": "2020-01-24T06:29:02.403Z", + "revenue": 50, + "sent_at": "2020-01-24T06:29:02.364Z", + "test_map_nested_map_n_1": "nested prop 1", + "timestamp": "2020-01-24T06:29:02.403Z", + "user_id": "9bb5d4c2-a7aa-4a36-9efb-dd2b1aec5d33" + }, + "metadata": { + "columns": { + "anonymous_id": "string", + "channel": "string", + "context_app_build": "string", + "context_app_name": "string", + "context_app_namespace": "string", + "context_app_version": "string", + "context_ctest_map_cnested_map_n_1": "string", + "context_ip": "string", + "context_library_name": "string", + "context_library_version": "string", + "context_locale": "string", + "context_passed_ip": "string", + "context_request_ip": "string", + "context_screen_density": "int", + "context_user_agent": "string", + "currency": "string", + "id": "string", + "original_timestamp": "datetime", + "received_at": "datetime", + "revenue": "int", + "sent_at": "datetime", + "test_map_nested_map_n_1": "string", + "timestamp": "datetime", + "user_id": "string", + "uuid_ts": "datetime" + }, + "receivedAt": "2020-01-24T11:59:02.403+05:30", + "table": "pages" + } + } + ], + bq: [ + { + "data": { + "anonymous_id": "e6ab2c5e-2cda-44a9-a962-e2f67df78bca", + "channel": "web", + "context_app_build": "1.0.0", + "context_app_name": "RudderLabs JavaScript SDK", + "context_app_namespace": "com.rudderlabs.javascript", + "context_app_version": "1.0.5", + "context_ctest_map_cnested_map_n_1": "context nested prop 1", + "context_ip": "0.0.0.0", + "context_library_name": "RudderLabs JavaScript SDK", + "context_library_version": "1.0.5", + "context_locale": "en-GB", + "context_passed_ip": "0.0.0.0", + "context_request_ip": "[::1]:53708", + "context_screen_density": 2, + "context_user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36", + "currency": "USD", + "id": "a6a0ad5a-bd26-4f19-8f75-38484e580fc7", + "original_timestamp": "2020-01-24T06:29:02.364Z", + "received_at": "2020-01-24T06:29:02.403Z", + "revenue": 50, + "sent_at": "2020-01-24T06:29:02.364Z", + "test_map_nested_map_n_1": "nested prop 1", + "timestamp": "2020-01-24T06:29:02.403Z", + "user_id": "9bb5d4c2-a7aa-4a36-9efb-dd2b1aec5d33" + }, + "metadata": { + "columns": { + "anonymous_id": "string", + "channel": "string", + "context_app_build": "string", + "context_app_name": "string", + "context_app_namespace": "string", + "context_app_version": "string", + "context_ctest_map_cnested_map_n_1": "string", + "context_ip": "string", + "context_library_name": "string", + "context_library_version": "string", + "context_locale": "string", + "context_passed_ip": "string", + "context_request_ip": "string", + "context_screen_density": "int", + "context_user_agent": "string", + "currency": "string", + "id": "string", + "loaded_at": "datetime", + "original_timestamp": "datetime", + "received_at": "datetime", + "revenue": "int", + "sent_at": "datetime", + "test_map_nested_map_n_1": "string", + "timestamp": "datetime", + "user_id": "string", + "uuid_ts": "datetime" + }, + "receivedAt": "2020-01-24T11:59:02.403+05:30", + "table": "pages" + } + } + ], + postgres: [ + { + "data": { + "anonymous_id": "e6ab2c5e-2cda-44a9-a962-e2f67df78bca", + "channel": "web", + "context_app_build": "1.0.0", + "context_app_name": "RudderLabs JavaScript SDK", + "context_app_namespace": "com.rudderlabs.javascript", + "context_app_version": "1.0.5", + "context_ctest_map_cnested_map_n_1": "context nested prop 1", + "context_ip": "0.0.0.0", + "context_library_name": "RudderLabs JavaScript SDK", + "context_library_version": "1.0.5", + "context_locale": "en-GB", + "context_passed_ip": "0.0.0.0", + "context_request_ip": "[::1]:53708", + "context_screen_density": 2, + "context_user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36", + "currency": "USD", + "id": "a6a0ad5a-bd26-4f19-8f75-38484e580fc7", + "original_timestamp": "2020-01-24T06:29:02.364Z", + "received_at": "2020-01-24T06:29:02.403Z", + "revenue": 50, + "sent_at": "2020-01-24T06:29:02.364Z", + "test_map_nested_map_n_1": "nested prop 1", + "timestamp": "2020-01-24T06:29:02.403Z", + "user_id": "9bb5d4c2-a7aa-4a36-9efb-dd2b1aec5d33" + }, + "metadata": { + "columns": { + "anonymous_id": "string", + "channel": "string", + "context_app_build": "string", + "context_app_name": "string", + "context_app_namespace": "string", + "context_app_version": "string", + "context_ctest_map_cnested_map_n_1": "string", + "context_ip": "string", + "context_library_name": "string", + "context_library_version": "string", + "context_locale": "string", + "context_passed_ip": "string", + "context_request_ip": "string", + "context_screen_density": "int", + "context_user_agent": "string", + "currency": "string", + "id": "string", + "original_timestamp": "datetime", + "received_at": "datetime", + "revenue": "int", + "sent_at": "datetime", + "test_map_nested_map_n_1": "string", + "timestamp": "datetime", + "user_id": "string", + "uuid_ts": "datetime" + }, + "receivedAt": "2020-01-24T11:59:02.403+05:30", + "table": "pages" + } + } + ], + snowflake: [ + { + "data": { + "ANONYMOUS_ID": "e6ab2c5e-2cda-44a9-a962-e2f67df78bca", + "CHANNEL": "web", + "CONTEXT_APP_BUILD": "1.0.0", + "CONTEXT_APP_NAME": "RudderLabs JavaScript SDK", + "CONTEXT_APP_NAMESPACE": "com.rudderlabs.javascript", + "CONTEXT_APP_VERSION": "1.0.5", + "CONTEXT_CTEST_MAP_CNESTED_MAP_N_1": "context nested prop 1", + "CONTEXT_IP": "0.0.0.0", + "CONTEXT_LIBRARY_NAME": "RudderLabs JavaScript SDK", + "CONTEXT_LIBRARY_VERSION": "1.0.5", + "CONTEXT_LOCALE": "en-GB", + "CONTEXT_PASSED_IP": "0.0.0.0", + "CONTEXT_REQUEST_IP": "[::1]:53708", + "CONTEXT_SCREEN_DENSITY": 2, + "CONTEXT_USER_AGENT": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36", + "CURRENCY": "USD", + "ID": "a6a0ad5a-bd26-4f19-8f75-38484e580fc7", + "ORIGINAL_TIMESTAMP": "2020-01-24T06:29:02.364Z", + "RECEIVED_AT": "2020-01-24T06:29:02.403Z", + "REVENUE": 50, + "SENT_AT": "2020-01-24T06:29:02.364Z", + "TEST_MAP_NESTED_MAP_N_1": "nested prop 1", + "TIMESTAMP": "2020-01-24T06:29:02.403Z", + "USER_ID": "9bb5d4c2-a7aa-4a36-9efb-dd2b1aec5d33" + }, + "metadata": { + "columns": { + "ANONYMOUS_ID": "string", + "CHANNEL": "string", + "CONTEXT_APP_BUILD": "string", + "CONTEXT_APP_NAME": "string", + "CONTEXT_APP_NAMESPACE": "string", + "CONTEXT_APP_VERSION": "string", + "CONTEXT_CTEST_MAP_CNESTED_MAP_N_1": "string", + "CONTEXT_IP": "string", + "CONTEXT_LIBRARY_NAME": "string", + "CONTEXT_LIBRARY_VERSION": "string", + "CONTEXT_LOCALE": "string", + "CONTEXT_PASSED_IP": "string", + "CONTEXT_REQUEST_IP": "string", + "CONTEXT_SCREEN_DENSITY": "int", + "CONTEXT_USER_AGENT": "string", + "CURRENCY": "string", + "ID": "string", + "ORIGINAL_TIMESTAMP": "datetime", + "RECEIVED_AT": "datetime", + "REVENUE": "int", + "SENT_AT": "datetime", + "TEST_MAP_NESTED_MAP_N_1": "string", + "TIMESTAMP": "datetime", + "USER_ID": "string", + "UUID_TS": "datetime" + }, + "receivedAt": "2020-01-24T11:59:02.403+05:30", + "table": "PAGES" + } + } + ], + } +} diff --git a/test/__tests__/data/warehouse/integrations/jsonpaths/legacy/screens.js b/test/__tests__/data/warehouse/integrations/jsonpaths/legacy/screens.js new file mode 100644 index 0000000000..bad325c908 --- /dev/null +++ b/test/__tests__/data/warehouse/integrations/jsonpaths/legacy/screens.js @@ -0,0 +1,405 @@ +module.exports = { + input: { + destination: { + Config: {} + }, + message: { + anonymousId: "e6ab2c5e-2cda-44a9-a962-e2f67df78bca", + channel: "web", + context: { + app: { + build: "1.0.0", + name: "RudderLabs JavaScript SDK", + namespace: "com.rudderlabs.javascript", + version: "1.0.5" + }, + ip: "0.0.0.0", + library: { + name: "RudderLabs JavaScript SDK", + version: "1.0.5" + }, + ctestMap: { + cnestedMap: { + n1: "context nested prop 1" + } + }, + locale: "en-GB", + 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.117 Safari/537.36" + }, + integrations: { + All: true, + RS: { + options: { + jsonPaths: [ + "testMap.nestedMap", + ".ctestMap.cnestedMap", + ] + } + }, + BQ: { + options: { + jsonPaths: [ + "testMap.nestedMap", + ".ctestMap.cnestedMap", + ] + } + }, + POSTGRES: { + options: { + jsonPaths: [ + "testMap.nestedMap", + ".ctestMap.cnestedMap", + ] + } + }, + SNOWFLAKE: { + options: { + jsonPaths: [ + "testMap.nestedMap", + ".ctestMap.cnestedMap", + ] + } + }, + S3_DATALAKE: { + options: { + skipReservedKeywordsEscaping: true + } + }, + }, + messageId: "a6a0ad5a-bd26-4f19-8f75-38484e580fc7", + originalTimestamp: "2020-01-24T06:29:02.364Z", + properties: { + currency: "USD", + revenue: 50, + testMap: { + nestedMap: { + n1: "nested prop 1" + } + }, + }, + receivedAt: "2020-01-24T11:59:02.403+05:30", + request_ip: "[::1]:53708", + sentAt: "2020-01-24T06:29:02.364Z", + timestamp: "2020-01-24T11:59:02.403+05:30", + type: "screen", + userId: "9bb5d4c2-a7aa-4a36-9efb-dd2b1aec5d33" + }, + request: { + query: { + whSchemaVersion: "v1" + } + } + }, + output: { + default: [ + { + "data": { + "anonymous_id": "e6ab2c5e-2cda-44a9-a962-e2f67df78bca", + "channel": "web", + "context_app_build": "1.0.0", + "context_app_name": "RudderLabs JavaScript SDK", + "context_app_namespace": "com.rudderlabs.javascript", + "context_app_version": "1.0.5", + "context_ctest_map_cnested_map_n_1": "context nested prop 1", + "context_ip": "0.0.0.0", + "context_library_name": "RudderLabs JavaScript SDK", + "context_library_version": "1.0.5", + "context_locale": "en-GB", + "context_passed_ip": "0.0.0.0", + "context_request_ip": "[::1]:53708", + "context_screen_density": 2, + "context_user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36", + "currency": "USD", + "id": "a6a0ad5a-bd26-4f19-8f75-38484e580fc7", + "original_timestamp": "2020-01-24T06:29:02.364Z", + "received_at": "2020-01-24T06:29:02.403Z", + "revenue": 50, + "sent_at": "2020-01-24T06:29:02.364Z", + "test_map_nested_map_n_1": "nested prop 1", + "timestamp": "2020-01-24T06:29:02.403Z", + "user_id": "9bb5d4c2-a7aa-4a36-9efb-dd2b1aec5d33" + }, + "metadata": { + "columns": { + "anonymous_id": "string", + "channel": "string", + "context_app_build": "string", + "context_app_name": "string", + "context_app_namespace": "string", + "context_app_version": "string", + "context_ctest_map_cnested_map_n_1": "string", + "context_ip": "string", + "context_library_name": "string", + "context_library_version": "string", + "context_locale": "string", + "context_passed_ip": "string", + "context_request_ip": "string", + "context_screen_density": "int", + "context_user_agent": "string", + "currency": "string", + "id": "string", + "original_timestamp": "datetime", + "received_at": "datetime", + "revenue": "int", + "sent_at": "datetime", + "test_map_nested_map_n_1": "string", + "timestamp": "datetime", + "user_id": "string", + "uuid_ts": "datetime" + }, + "receivedAt": "2020-01-24T11:59:02.403+05:30", + "table": "screens" + } + } + ], + rs: [ + { + "data": { + "anonymous_id": "e6ab2c5e-2cda-44a9-a962-e2f67df78bca", + "channel": "web", + "context_app_build": "1.0.0", + "context_app_name": "RudderLabs JavaScript SDK", + "context_app_namespace": "com.rudderlabs.javascript", + "context_app_version": "1.0.5", + "context_ctest_map_cnested_map_n_1": "context nested prop 1", + "context_ip": "0.0.0.0", + "context_library_name": "RudderLabs JavaScript SDK", + "context_library_version": "1.0.5", + "context_locale": "en-GB", + "context_passed_ip": "0.0.0.0", + "context_request_ip": "[::1]:53708", + "context_screen_density": 2, + "context_user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36", + "currency": "USD", + "id": "a6a0ad5a-bd26-4f19-8f75-38484e580fc7", + "original_timestamp": "2020-01-24T06:29:02.364Z", + "received_at": "2020-01-24T06:29:02.403Z", + "revenue": 50, + "sent_at": "2020-01-24T06:29:02.364Z", + "test_map_nested_map_n_1": "nested prop 1", + "timestamp": "2020-01-24T06:29:02.403Z", + "user_id": "9bb5d4c2-a7aa-4a36-9efb-dd2b1aec5d33" + }, + "metadata": { + "columns": { + "anonymous_id": "string", + "channel": "string", + "context_app_build": "string", + "context_app_name": "string", + "context_app_namespace": "string", + "context_app_version": "string", + "context_ctest_map_cnested_map_n_1": "string", + "context_ip": "string", + "context_library_name": "string", + "context_library_version": "string", + "context_locale": "string", + "context_passed_ip": "string", + "context_request_ip": "string", + "context_screen_density": "int", + "context_user_agent": "string", + "currency": "string", + "id": "string", + "original_timestamp": "datetime", + "received_at": "datetime", + "revenue": "int", + "sent_at": "datetime", + "test_map_nested_map_n_1": "string", + "timestamp": "datetime", + "user_id": "string", + "uuid_ts": "datetime" + }, + "receivedAt": "2020-01-24T11:59:02.403+05:30", + "table": "screens" + } + } + ], + bq: [ + { + "data": { + "anonymous_id": "e6ab2c5e-2cda-44a9-a962-e2f67df78bca", + "channel": "web", + "context_app_build": "1.0.0", + "context_app_name": "RudderLabs JavaScript SDK", + "context_app_namespace": "com.rudderlabs.javascript", + "context_app_version": "1.0.5", + "context_ctest_map_cnested_map_n_1": "context nested prop 1", + "context_ip": "0.0.0.0", + "context_library_name": "RudderLabs JavaScript SDK", + "context_library_version": "1.0.5", + "context_locale": "en-GB", + "context_passed_ip": "0.0.0.0", + "context_request_ip": "[::1]:53708", + "context_screen_density": 2, + "context_user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36", + "currency": "USD", + "id": "a6a0ad5a-bd26-4f19-8f75-38484e580fc7", + "original_timestamp": "2020-01-24T06:29:02.364Z", + "received_at": "2020-01-24T06:29:02.403Z", + "revenue": 50, + "sent_at": "2020-01-24T06:29:02.364Z", + "test_map_nested_map_n_1": "nested prop 1", + "timestamp": "2020-01-24T06:29:02.403Z", + "user_id": "9bb5d4c2-a7aa-4a36-9efb-dd2b1aec5d33" + }, + "metadata": { + "columns": { + "anonymous_id": "string", + "channel": "string", + "context_app_build": "string", + "context_app_name": "string", + "context_app_namespace": "string", + "context_app_version": "string", + "context_ctest_map_cnested_map_n_1": "string", + "context_ip": "string", + "context_library_name": "string", + "context_library_version": "string", + "context_locale": "string", + "context_passed_ip": "string", + "context_request_ip": "string", + "context_screen_density": "int", + "context_user_agent": "string", + "currency": "string", + "id": "string", + "loaded_at": "datetime", + "original_timestamp": "datetime", + "received_at": "datetime", + "revenue": "int", + "sent_at": "datetime", + "test_map_nested_map_n_1": "string", + "timestamp": "datetime", + "user_id": "string", + "uuid_ts": "datetime" + }, + "receivedAt": "2020-01-24T11:59:02.403+05:30", + "table": "screens" + } + } + ], + postgres: [ + { + "data": { + "anonymous_id": "e6ab2c5e-2cda-44a9-a962-e2f67df78bca", + "channel": "web", + "context_app_build": "1.0.0", + "context_app_name": "RudderLabs JavaScript SDK", + "context_app_namespace": "com.rudderlabs.javascript", + "context_app_version": "1.0.5", + "context_ctest_map_cnested_map_n_1": "context nested prop 1", + "context_ip": "0.0.0.0", + "context_library_name": "RudderLabs JavaScript SDK", + "context_library_version": "1.0.5", + "context_locale": "en-GB", + "context_passed_ip": "0.0.0.0", + "context_request_ip": "[::1]:53708", + "context_screen_density": 2, + "context_user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36", + "currency": "USD", + "id": "a6a0ad5a-bd26-4f19-8f75-38484e580fc7", + "original_timestamp": "2020-01-24T06:29:02.364Z", + "received_at": "2020-01-24T06:29:02.403Z", + "revenue": 50, + "sent_at": "2020-01-24T06:29:02.364Z", + "test_map_nested_map_n_1": "nested prop 1", + "timestamp": "2020-01-24T06:29:02.403Z", + "user_id": "9bb5d4c2-a7aa-4a36-9efb-dd2b1aec5d33" + }, + "metadata": { + "columns": { + "anonymous_id": "string", + "channel": "string", + "context_app_build": "string", + "context_app_name": "string", + "context_app_namespace": "string", + "context_app_version": "string", + "context_ctest_map_cnested_map_n_1": "string", + "context_ip": "string", + "context_library_name": "string", + "context_library_version": "string", + "context_locale": "string", + "context_passed_ip": "string", + "context_request_ip": "string", + "context_screen_density": "int", + "context_user_agent": "string", + "currency": "string", + "id": "string", + "original_timestamp": "datetime", + "received_at": "datetime", + "revenue": "int", + "sent_at": "datetime", + "test_map_nested_map_n_1": "string", + "timestamp": "datetime", + "user_id": "string", + "uuid_ts": "datetime" + }, + "receivedAt": "2020-01-24T11:59:02.403+05:30", + "table": "screens" + } + } + ], + snowflake: [ + { + "data": { + "ANONYMOUS_ID": "e6ab2c5e-2cda-44a9-a962-e2f67df78bca", + "CHANNEL": "web", + "CONTEXT_APP_BUILD": "1.0.0", + "CONTEXT_APP_NAME": "RudderLabs JavaScript SDK", + "CONTEXT_APP_NAMESPACE": "com.rudderlabs.javascript", + "CONTEXT_APP_VERSION": "1.0.5", + "CONTEXT_CTEST_MAP_CNESTED_MAP_N_1": "context nested prop 1", + "CONTEXT_IP": "0.0.0.0", + "CONTEXT_LIBRARY_NAME": "RudderLabs JavaScript SDK", + "CONTEXT_LIBRARY_VERSION": "1.0.5", + "CONTEXT_LOCALE": "en-GB", + "CONTEXT_PASSED_IP": "0.0.0.0", + "CONTEXT_REQUEST_IP": "[::1]:53708", + "CONTEXT_SCREEN_DENSITY": 2, + "CONTEXT_USER_AGENT": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36", + "CURRENCY": "USD", + "ID": "a6a0ad5a-bd26-4f19-8f75-38484e580fc7", + "ORIGINAL_TIMESTAMP": "2020-01-24T06:29:02.364Z", + "RECEIVED_AT": "2020-01-24T06:29:02.403Z", + "REVENUE": 50, + "SENT_AT": "2020-01-24T06:29:02.364Z", + "TEST_MAP_NESTED_MAP_N_1": "nested prop 1", + "TIMESTAMP": "2020-01-24T06:29:02.403Z", + "USER_ID": "9bb5d4c2-a7aa-4a36-9efb-dd2b1aec5d33" + }, + "metadata": { + "columns": { + "ANONYMOUS_ID": "string", + "CHANNEL": "string", + "CONTEXT_APP_BUILD": "string", + "CONTEXT_APP_NAME": "string", + "CONTEXT_APP_NAMESPACE": "string", + "CONTEXT_APP_VERSION": "string", + "CONTEXT_CTEST_MAP_CNESTED_MAP_N_1": "string", + "CONTEXT_IP": "string", + "CONTEXT_LIBRARY_NAME": "string", + "CONTEXT_LIBRARY_VERSION": "string", + "CONTEXT_LOCALE": "string", + "CONTEXT_PASSED_IP": "string", + "CONTEXT_REQUEST_IP": "string", + "CONTEXT_SCREEN_DENSITY": "int", + "CONTEXT_USER_AGENT": "string", + "CURRENCY": "string", + "ID": "string", + "ORIGINAL_TIMESTAMP": "datetime", + "RECEIVED_AT": "datetime", + "REVENUE": "int", + "SENT_AT": "datetime", + "TEST_MAP_NESTED_MAP_N_1": "string", + "TIMESTAMP": "datetime", + "USER_ID": "string", + "UUID_TS": "datetime" + }, + "receivedAt": "2020-01-24T11:59:02.403+05:30", + "table": "SCREENS" + } + } + ], + } +} diff --git a/test/__tests__/data/warehouse/integrations/jsonpaths/legacy/tracks.js b/test/__tests__/data/warehouse/integrations/jsonpaths/legacy/tracks.js new file mode 100644 index 0000000000..5070284e99 --- /dev/null +++ b/test/__tests__/data/warehouse/integrations/jsonpaths/legacy/tracks.js @@ -0,0 +1,830 @@ +module.exports = { + input: { + destination: { + Config: {} + }, + message: { + anonymousId: "e6ab2c5e-2cda-44a9-a962-e2f67df78bca", + channel: "web", + context: { + app: { + build: "1.0.0", + name: "RudderLabs JavaScript SDK", + namespace: "com.rudderlabs.javascript", + version: "1.0.5" + }, + ip: "0.0.0.0", + library: { + name: "RudderLabs JavaScript SDK", + version: "1.0.5" + }, + locale: "en-GB", + screen: { + density: 2 + }, + traits: { + city: "Disney", + country: "USA", + email: "mickey@disney.com", + firstname: "Mickey" + }, + CMap: { + nestedMap: { + n1: "context nested prop 1" + } + }, + userAgent: + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36" + }, + event: "Product Added", + integrations: { + All: true, + RS: { + options: { + jsonPaths: [ + "UPMap.nestedMap", + "PMap.nestedMap", + "CMap.nestedMap", + ] + } + }, + BQ: { + options: { + jsonPaths: [ + "UPMap.nestedMap", + "PMap.nestedMap", + "CMap.nestedMap", + ] + } + }, + POSTGRES: { + options: { + jsonPaths: [ + "UPMap.nestedMap", + "PMap.nestedMap", + "CMap.nestedMap", + ] + } + }, + SNOWFLAKE: { + options: { + jsonPaths: [ + "UPMap.nestedMap", + "PMap.nestedMap", + "CMap.nestedMap", + ] + } + }, + S3_DATALAKE: { + options: { + skipReservedKeywordsEscaping: true + } + }, + }, + messageId: "a6a0ad5a-bd26-4f19-8f75-38484e580fc7", + originalTimestamp: "2020-01-24T06:29:02.364Z", + userProperties: { + email: "test@gmail.com", + UPMap: { + nestedMap: { + n1: "nested prop 1" + } + }, + }, + properties: { + currency: "USD", + revenue: 50, + PMap: { + nestedMap: { + n1: "nested prop 1" + } + }, + }, + receivedAt: "2020-01-24T11:59:02.403+05:30", + request_ip: "[::1]:53708", + sentAt: "2020-01-24T06:29:02.364Z", + timestamp: "2020-01-24T11:59:02.403+05:30", + type: "track", + userId: "9bb5d4c2-a7aa-4a36-9efb-dd2b1aec5d33" + }, + request: { + query: { + whSchemaVersion: "v1" + } + } + }, + output: { + default: [ + { + "data": { + "anonymous_id": "e6ab2c5e-2cda-44a9-a962-e2f67df78bca", + "channel": "web", + "context_app_build": "1.0.0", + "context_app_name": "RudderLabs JavaScript SDK", + "context_app_namespace": "com.rudderlabs.javascript", + "context_app_version": "1.0.5", + "context_c_map_nested_map_n_1": "context nested prop 1", + "context_ip": "0.0.0.0", + "context_library_name": "RudderLabs JavaScript SDK", + "context_library_version": "1.0.5", + "context_locale": "en-GB", + "context_passed_ip": "0.0.0.0", + "context_request_ip": "[::1]:53708", + "context_screen_density": 2, + "context_traits_city": "Disney", + "context_traits_country": "USA", + "context_traits_email": "mickey@disney.com", + "context_traits_firstname": "Mickey", + "context_user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36", + "event": "product_added", + "event_text": "Product Added", + "id": "a6a0ad5a-bd26-4f19-8f75-38484e580fc7", + "original_timestamp": "2020-01-24T06:29:02.364Z", + "received_at": "2020-01-24T06:29:02.403Z", + "sent_at": "2020-01-24T06:29:02.364Z", + "timestamp": "2020-01-24T06:29:02.403Z", + "user_id": "9bb5d4c2-a7aa-4a36-9efb-dd2b1aec5d33" + }, + "metadata": { + "columns": { + "anonymous_id": "string", + "channel": "string", + "context_app_build": "string", + "context_app_name": "string", + "context_app_namespace": "string", + "context_app_version": "string", + "context_c_map_nested_map_n_1": "string", + "context_ip": "string", + "context_library_name": "string", + "context_library_version": "string", + "context_locale": "string", + "context_passed_ip": "string", + "context_request_ip": "string", + "context_screen_density": "int", + "context_traits_city": "string", + "context_traits_country": "string", + "context_traits_email": "string", + "context_traits_firstname": "string", + "context_user_agent": "string", + "event": "string", + "event_text": "string", + "id": "string", + "original_timestamp": "datetime", + "received_at": "datetime", + "sent_at": "datetime", + "timestamp": "datetime", + "user_id": "string", + "uuid_ts": "datetime" + }, + "receivedAt": "2020-01-24T11:59:02.403+05:30", + "table": "tracks" + } + }, + { + "data": { + "anonymous_id": "e6ab2c5e-2cda-44a9-a962-e2f67df78bca", + "channel": "web", + "context_app_build": "1.0.0", + "context_app_name": "RudderLabs JavaScript SDK", + "context_app_namespace": "com.rudderlabs.javascript", + "context_app_version": "1.0.5", + "context_c_map_nested_map_n_1": "context nested prop 1", + "context_ip": "0.0.0.0", + "context_library_name": "RudderLabs JavaScript SDK", + "context_library_version": "1.0.5", + "context_locale": "en-GB", + "context_passed_ip": "0.0.0.0", + "context_request_ip": "[::1]:53708", + "context_screen_density": 2, + "context_traits_city": "Disney", + "context_traits_country": "USA", + "context_traits_email": "mickey@disney.com", + "context_traits_firstname": "Mickey", + "context_user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36", + "currency": "USD", + "email": "test@gmail.com", + "event": "product_added", + "event_text": "Product Added", + "id": "a6a0ad5a-bd26-4f19-8f75-38484e580fc7", + "original_timestamp": "2020-01-24T06:29:02.364Z", + "p_map_nested_map_n_1": "nested prop 1", + "received_at": "2020-01-24T06:29:02.403Z", + "revenue": 50, + "sent_at": "2020-01-24T06:29:02.364Z", + "timestamp": "2020-01-24T06:29:02.403Z", + "up_map_nested_map_n_1": "nested prop 1", + "user_id": "9bb5d4c2-a7aa-4a36-9efb-dd2b1aec5d33" + }, + "metadata": { + "columns": { + "anonymous_id": "string", + "channel": "string", + "context_app_build": "string", + "context_app_name": "string", + "context_app_namespace": "string", + "context_app_version": "string", + "context_c_map_nested_map_n_1": "string", + "context_ip": "string", + "context_library_name": "string", + "context_library_version": "string", + "context_locale": "string", + "context_passed_ip": "string", + "context_request_ip": "string", + "context_screen_density": "int", + "context_traits_city": "string", + "context_traits_country": "string", + "context_traits_email": "string", + "context_traits_firstname": "string", + "context_user_agent": "string", + "currency": "string", + "email": "string", + "event": "string", + "event_text": "string", + "id": "string", + "original_timestamp": "datetime", + "p_map_nested_map_n_1": "string", + "received_at": "datetime", + "revenue": "int", + "sent_at": "datetime", + "timestamp": "datetime", + "up_map_nested_map_n_1": "string", + "user_id": "string", + "uuid_ts": "datetime" + }, + "receivedAt": "2020-01-24T11:59:02.403+05:30", + "table": "product_added" + } + } + ], + rs: [ + { + "data": { + "anonymous_id": "e6ab2c5e-2cda-44a9-a962-e2f67df78bca", + "channel": "web", + "context_app_build": "1.0.0", + "context_app_name": "RudderLabs JavaScript SDK", + "context_app_namespace": "com.rudderlabs.javascript", + "context_app_version": "1.0.5", + "context_c_map_nested_map_n_1": "context nested prop 1", + "context_ip": "0.0.0.0", + "context_library_name": "RudderLabs JavaScript SDK", + "context_library_version": "1.0.5", + "context_locale": "en-GB", + "context_passed_ip": "0.0.0.0", + "context_request_ip": "[::1]:53708", + "context_screen_density": 2, + "context_traits_city": "Disney", + "context_traits_country": "USA", + "context_traits_email": "mickey@disney.com", + "context_traits_firstname": "Mickey", + "context_user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36", + "event": "product_added", + "event_text": "Product Added", + "id": "a6a0ad5a-bd26-4f19-8f75-38484e580fc7", + "original_timestamp": "2020-01-24T06:29:02.364Z", + "received_at": "2020-01-24T06:29:02.403Z", + "sent_at": "2020-01-24T06:29:02.364Z", + "timestamp": "2020-01-24T06:29:02.403Z", + "user_id": "9bb5d4c2-a7aa-4a36-9efb-dd2b1aec5d33" + }, + "metadata": { + "columns": { + "anonymous_id": "string", + "channel": "string", + "context_app_build": "string", + "context_app_name": "string", + "context_app_namespace": "string", + "context_app_version": "string", + "context_c_map_nested_map_n_1": "string", + "context_ip": "string", + "context_library_name": "string", + "context_library_version": "string", + "context_locale": "string", + "context_passed_ip": "string", + "context_request_ip": "string", + "context_screen_density": "int", + "context_traits_city": "string", + "context_traits_country": "string", + "context_traits_email": "string", + "context_traits_firstname": "string", + "context_user_agent": "string", + "event": "string", + "event_text": "string", + "id": "string", + "original_timestamp": "datetime", + "received_at": "datetime", + "sent_at": "datetime", + "timestamp": "datetime", + "user_id": "string", + "uuid_ts": "datetime" + }, + "receivedAt": "2020-01-24T11:59:02.403+05:30", + "table": "tracks" + } + }, + { + "data": { + "anonymous_id": "e6ab2c5e-2cda-44a9-a962-e2f67df78bca", + "channel": "web", + "context_app_build": "1.0.0", + "context_app_name": "RudderLabs JavaScript SDK", + "context_app_namespace": "com.rudderlabs.javascript", + "context_app_version": "1.0.5", + "context_c_map_nested_map_n_1": "context nested prop 1", + "context_ip": "0.0.0.0", + "context_library_name": "RudderLabs JavaScript SDK", + "context_library_version": "1.0.5", + "context_locale": "en-GB", + "context_passed_ip": "0.0.0.0", + "context_request_ip": "[::1]:53708", + "context_screen_density": 2, + "context_traits_city": "Disney", + "context_traits_country": "USA", + "context_traits_email": "mickey@disney.com", + "context_traits_firstname": "Mickey", + "context_user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36", + "currency": "USD", + "email": "test@gmail.com", + "event": "product_added", + "event_text": "Product Added", + "id": "a6a0ad5a-bd26-4f19-8f75-38484e580fc7", + "original_timestamp": "2020-01-24T06:29:02.364Z", + "p_map_nested_map": "{\"n1\":\"nested prop 1\"}", + "received_at": "2020-01-24T06:29:02.403Z", + "revenue": 50, + "sent_at": "2020-01-24T06:29:02.364Z", + "timestamp": "2020-01-24T06:29:02.403Z", + "up_map_nested_map": "{\"n1\":\"nested prop 1\"}", + "user_id": "9bb5d4c2-a7aa-4a36-9efb-dd2b1aec5d33" + }, + "metadata": { + "columns": { + "anonymous_id": "string", + "channel": "string", + "context_app_build": "string", + "context_app_name": "string", + "context_app_namespace": "string", + "context_app_version": "string", + "context_c_map_nested_map_n_1": "string", + "context_ip": "string", + "context_library_name": "string", + "context_library_version": "string", + "context_locale": "string", + "context_passed_ip": "string", + "context_request_ip": "string", + "context_screen_density": "int", + "context_traits_city": "string", + "context_traits_country": "string", + "context_traits_email": "string", + "context_traits_firstname": "string", + "context_user_agent": "string", + "currency": "string", + "email": "string", + "event": "string", + "event_text": "string", + "id": "string", + "original_timestamp": "datetime", + "p_map_nested_map": "json", + "received_at": "datetime", + "revenue": "int", + "sent_at": "datetime", + "timestamp": "datetime", + "up_map_nested_map": "json", + "user_id": "string", + "uuid_ts": "datetime" + }, + "receivedAt": "2020-01-24T11:59:02.403+05:30", + "table": "product_added" + } + } + ], + bq: [ + { + "data": { + "anonymous_id": "e6ab2c5e-2cda-44a9-a962-e2f67df78bca", + "channel": "web", + "context_app_build": "1.0.0", + "context_app_name": "RudderLabs JavaScript SDK", + "context_app_namespace": "com.rudderlabs.javascript", + "context_app_version": "1.0.5", + "context_c_map_nested_map_n_1": "context nested prop 1", + "context_ip": "0.0.0.0", + "context_library_name": "RudderLabs JavaScript SDK", + "context_library_version": "1.0.5", + "context_locale": "en-GB", + "context_passed_ip": "0.0.0.0", + "context_request_ip": "[::1]:53708", + "context_screen_density": 2, + "context_traits_city": "Disney", + "context_traits_country": "USA", + "context_traits_email": "mickey@disney.com", + "context_traits_firstname": "Mickey", + "context_user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36", + "event": "product_added", + "event_text": "Product Added", + "id": "a6a0ad5a-bd26-4f19-8f75-38484e580fc7", + "original_timestamp": "2020-01-24T06:29:02.364Z", + "received_at": "2020-01-24T06:29:02.403Z", + "sent_at": "2020-01-24T06:29:02.364Z", + "timestamp": "2020-01-24T06:29:02.403Z", + "user_id": "9bb5d4c2-a7aa-4a36-9efb-dd2b1aec5d33" + }, + "metadata": { + "columns": { + "anonymous_id": "string", + "channel": "string", + "context_app_build": "string", + "context_app_name": "string", + "context_app_namespace": "string", + "context_app_version": "string", + "context_c_map_nested_map_n_1": "string", + "context_ip": "string", + "context_library_name": "string", + "context_library_version": "string", + "context_locale": "string", + "context_passed_ip": "string", + "context_request_ip": "string", + "context_screen_density": "int", + "context_traits_city": "string", + "context_traits_country": "string", + "context_traits_email": "string", + "context_traits_firstname": "string", + "context_user_agent": "string", + "event": "string", + "event_text": "string", + "id": "string", + "loaded_at": "datetime", + "original_timestamp": "datetime", + "received_at": "datetime", + "sent_at": "datetime", + "timestamp": "datetime", + "user_id": "string", + "uuid_ts": "datetime" + }, + "receivedAt": "2020-01-24T11:59:02.403+05:30", + "table": "tracks" + } + }, + { + "data": { + "anonymous_id": "e6ab2c5e-2cda-44a9-a962-e2f67df78bca", + "channel": "web", + "context_app_build": "1.0.0", + "context_app_name": "RudderLabs JavaScript SDK", + "context_app_namespace": "com.rudderlabs.javascript", + "context_app_version": "1.0.5", + "context_c_map_nested_map_n_1": "context nested prop 1", + "context_ip": "0.0.0.0", + "context_library_name": "RudderLabs JavaScript SDK", + "context_library_version": "1.0.5", + "context_locale": "en-GB", + "context_passed_ip": "0.0.0.0", + "context_request_ip": "[::1]:53708", + "context_screen_density": 2, + "context_traits_city": "Disney", + "context_traits_country": "USA", + "context_traits_email": "mickey@disney.com", + "context_traits_firstname": "Mickey", + "context_user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36", + "currency": "USD", + "email": "test@gmail.com", + "event": "product_added", + "event_text": "Product Added", + "id": "a6a0ad5a-bd26-4f19-8f75-38484e580fc7", + "original_timestamp": "2020-01-24T06:29:02.364Z", + "p_map_nested_map": "{\"n1\":\"nested prop 1\"}", + "received_at": "2020-01-24T06:29:02.403Z", + "revenue": 50, + "sent_at": "2020-01-24T06:29:02.364Z", + "timestamp": "2020-01-24T06:29:02.403Z", + "up_map_nested_map": "{\"n1\":\"nested prop 1\"}", + "user_id": "9bb5d4c2-a7aa-4a36-9efb-dd2b1aec5d33" + }, + "metadata": { + "columns": { + "anonymous_id": "string", + "channel": "string", + "context_app_build": "string", + "context_app_name": "string", + "context_app_namespace": "string", + "context_app_version": "string", + "context_c_map_nested_map_n_1": "string", + "context_ip": "string", + "context_library_name": "string", + "context_library_version": "string", + "context_locale": "string", + "context_passed_ip": "string", + "context_request_ip": "string", + "context_screen_density": "int", + "context_traits_city": "string", + "context_traits_country": "string", + "context_traits_email": "string", + "context_traits_firstname": "string", + "context_user_agent": "string", + "currency": "string", + "email": "string", + "event": "string", + "event_text": "string", + "id": "string", + "loaded_at": "datetime", + "original_timestamp": "datetime", + "p_map_nested_map": "string", + "received_at": "datetime", + "revenue": "int", + "sent_at": "datetime", + "timestamp": "datetime", + "up_map_nested_map": "string", + "user_id": "string", + "uuid_ts": "datetime" + }, + "receivedAt": "2020-01-24T11:59:02.403+05:30", + "table": "product_added" + } + } + ], + postgres: [ + { + "data": { + "anonymous_id": "e6ab2c5e-2cda-44a9-a962-e2f67df78bca", + "channel": "web", + "context_app_build": "1.0.0", + "context_app_name": "RudderLabs JavaScript SDK", + "context_app_namespace": "com.rudderlabs.javascript", + "context_app_version": "1.0.5", + "context_c_map_nested_map_n_1": "context nested prop 1", + "context_ip": "0.0.0.0", + "context_library_name": "RudderLabs JavaScript SDK", + "context_library_version": "1.0.5", + "context_locale": "en-GB", + "context_passed_ip": "0.0.0.0", + "context_request_ip": "[::1]:53708", + "context_screen_density": 2, + "context_traits_city": "Disney", + "context_traits_country": "USA", + "context_traits_email": "mickey@disney.com", + "context_traits_firstname": "Mickey", + "context_user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36", + "event": "product_added", + "event_text": "Product Added", + "id": "a6a0ad5a-bd26-4f19-8f75-38484e580fc7", + "original_timestamp": "2020-01-24T06:29:02.364Z", + "received_at": "2020-01-24T06:29:02.403Z", + "sent_at": "2020-01-24T06:29:02.364Z", + "timestamp": "2020-01-24T06:29:02.403Z", + "user_id": "9bb5d4c2-a7aa-4a36-9efb-dd2b1aec5d33" + }, + "metadata": { + "columns": { + "anonymous_id": "string", + "channel": "string", + "context_app_build": "string", + "context_app_name": "string", + "context_app_namespace": "string", + "context_app_version": "string", + "context_c_map_nested_map_n_1": "string", + "context_ip": "string", + "context_library_name": "string", + "context_library_version": "string", + "context_locale": "string", + "context_passed_ip": "string", + "context_request_ip": "string", + "context_screen_density": "int", + "context_traits_city": "string", + "context_traits_country": "string", + "context_traits_email": "string", + "context_traits_firstname": "string", + "context_user_agent": "string", + "event": "string", + "event_text": "string", + "id": "string", + "original_timestamp": "datetime", + "received_at": "datetime", + "sent_at": "datetime", + "timestamp": "datetime", + "user_id": "string", + "uuid_ts": "datetime" + }, + "receivedAt": "2020-01-24T11:59:02.403+05:30", + "table": "tracks" + } + }, + { + "data": { + "anonymous_id": "e6ab2c5e-2cda-44a9-a962-e2f67df78bca", + "channel": "web", + "context_app_build": "1.0.0", + "context_app_name": "RudderLabs JavaScript SDK", + "context_app_namespace": "com.rudderlabs.javascript", + "context_app_version": "1.0.5", + "context_c_map_nested_map_n_1": "context nested prop 1", + "context_ip": "0.0.0.0", + "context_library_name": "RudderLabs JavaScript SDK", + "context_library_version": "1.0.5", + "context_locale": "en-GB", + "context_passed_ip": "0.0.0.0", + "context_request_ip": "[::1]:53708", + "context_screen_density": 2, + "context_traits_city": "Disney", + "context_traits_country": "USA", + "context_traits_email": "mickey@disney.com", + "context_traits_firstname": "Mickey", + "context_user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36", + "currency": "USD", + "email": "test@gmail.com", + "event": "product_added", + "event_text": "Product Added", + "id": "a6a0ad5a-bd26-4f19-8f75-38484e580fc7", + "original_timestamp": "2020-01-24T06:29:02.364Z", + "p_map_nested_map": "{\"n1\":\"nested prop 1\"}", + "received_at": "2020-01-24T06:29:02.403Z", + "revenue": 50, + "sent_at": "2020-01-24T06:29:02.364Z", + "timestamp": "2020-01-24T06:29:02.403Z", + "up_map_nested_map": "{\"n1\":\"nested prop 1\"}", + "user_id": "9bb5d4c2-a7aa-4a36-9efb-dd2b1aec5d33" + }, + "metadata": { + "columns": { + "anonymous_id": "string", + "channel": "string", + "context_app_build": "string", + "context_app_name": "string", + "context_app_namespace": "string", + "context_app_version": "string", + "context_c_map_nested_map_n_1": "string", + "context_ip": "string", + "context_library_name": "string", + "context_library_version": "string", + "context_locale": "string", + "context_passed_ip": "string", + "context_request_ip": "string", + "context_screen_density": "int", + "context_traits_city": "string", + "context_traits_country": "string", + "context_traits_email": "string", + "context_traits_firstname": "string", + "context_user_agent": "string", + "currency": "string", + "email": "string", + "event": "string", + "event_text": "string", + "id": "string", + "original_timestamp": "datetime", + "p_map_nested_map": "json", + "received_at": "datetime", + "revenue": "int", + "sent_at": "datetime", + "timestamp": "datetime", + "up_map_nested_map": "json", + "user_id": "string", + "uuid_ts": "datetime" + }, + "receivedAt": "2020-01-24T11:59:02.403+05:30", + "table": "product_added" + } + } + ], + snowflake: [ + { + "data": { + "ANONYMOUS_ID": "e6ab2c5e-2cda-44a9-a962-e2f67df78bca", + "CHANNEL": "web", + "CONTEXT_APP_BUILD": "1.0.0", + "CONTEXT_APP_NAME": "RudderLabs JavaScript SDK", + "CONTEXT_APP_NAMESPACE": "com.rudderlabs.javascript", + "CONTEXT_APP_VERSION": "1.0.5", + "CONTEXT_C_MAP_NESTED_MAP_N_1": "context nested prop 1", + "CONTEXT_IP": "0.0.0.0", + "CONTEXT_LIBRARY_NAME": "RudderLabs JavaScript SDK", + "CONTEXT_LIBRARY_VERSION": "1.0.5", + "CONTEXT_LOCALE": "en-GB", + "CONTEXT_PASSED_IP": "0.0.0.0", + "CONTEXT_REQUEST_IP": "[::1]:53708", + "CONTEXT_SCREEN_DENSITY": 2, + "CONTEXT_TRAITS_CITY": "Disney", + "CONTEXT_TRAITS_COUNTRY": "USA", + "CONTEXT_TRAITS_EMAIL": "mickey@disney.com", + "CONTEXT_TRAITS_FIRSTNAME": "Mickey", + "CONTEXT_USER_AGENT": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36", + "EVENT": "product_added", + "EVENT_TEXT": "Product Added", + "ID": "a6a0ad5a-bd26-4f19-8f75-38484e580fc7", + "ORIGINAL_TIMESTAMP": "2020-01-24T06:29:02.364Z", + "RECEIVED_AT": "2020-01-24T06:29:02.403Z", + "SENT_AT": "2020-01-24T06:29:02.364Z", + "TIMESTAMP": "2020-01-24T06:29:02.403Z", + "USER_ID": "9bb5d4c2-a7aa-4a36-9efb-dd2b1aec5d33" + }, + "metadata": { + "columns": { + "ANONYMOUS_ID": "string", + "CHANNEL": "string", + "CONTEXT_APP_BUILD": "string", + "CONTEXT_APP_NAME": "string", + "CONTEXT_APP_NAMESPACE": "string", + "CONTEXT_APP_VERSION": "string", + "CONTEXT_C_MAP_NESTED_MAP_N_1": "string", + "CONTEXT_IP": "string", + "CONTEXT_LIBRARY_NAME": "string", + "CONTEXT_LIBRARY_VERSION": "string", + "CONTEXT_LOCALE": "string", + "CONTEXT_PASSED_IP": "string", + "CONTEXT_REQUEST_IP": "string", + "CONTEXT_SCREEN_DENSITY": "int", + "CONTEXT_TRAITS_CITY": "string", + "CONTEXT_TRAITS_COUNTRY": "string", + "CONTEXT_TRAITS_EMAIL": "string", + "CONTEXT_TRAITS_FIRSTNAME": "string", + "CONTEXT_USER_AGENT": "string", + "EVENT": "string", + "EVENT_TEXT": "string", + "ID": "string", + "ORIGINAL_TIMESTAMP": "datetime", + "RECEIVED_AT": "datetime", + "SENT_AT": "datetime", + "TIMESTAMP": "datetime", + "USER_ID": "string", + "UUID_TS": "datetime" + }, + "receivedAt": "2020-01-24T11:59:02.403+05:30", + "table": "TRACKS" + } + }, + { + "data": { + "ANONYMOUS_ID": "e6ab2c5e-2cda-44a9-a962-e2f67df78bca", + "CHANNEL": "web", + "CONTEXT_APP_BUILD": "1.0.0", + "CONTEXT_APP_NAME": "RudderLabs JavaScript SDK", + "CONTEXT_APP_NAMESPACE": "com.rudderlabs.javascript", + "CONTEXT_APP_VERSION": "1.0.5", + "CONTEXT_C_MAP_NESTED_MAP_N_1": "context nested prop 1", + "CONTEXT_IP": "0.0.0.0", + "CONTEXT_LIBRARY_NAME": "RudderLabs JavaScript SDK", + "CONTEXT_LIBRARY_VERSION": "1.0.5", + "CONTEXT_LOCALE": "en-GB", + "CONTEXT_PASSED_IP": "0.0.0.0", + "CONTEXT_REQUEST_IP": "[::1]:53708", + "CONTEXT_SCREEN_DENSITY": 2, + "CONTEXT_TRAITS_CITY": "Disney", + "CONTEXT_TRAITS_COUNTRY": "USA", + "CONTEXT_TRAITS_EMAIL": "mickey@disney.com", + "CONTEXT_TRAITS_FIRSTNAME": "Mickey", + "CONTEXT_USER_AGENT": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36", + "CURRENCY": "USD", + "EMAIL": "test@gmail.com", + "EVENT": "product_added", + "EVENT_TEXT": "Product Added", + "ID": "a6a0ad5a-bd26-4f19-8f75-38484e580fc7", + "ORIGINAL_TIMESTAMP": "2020-01-24T06:29:02.364Z", + "P_MAP_NESTED_MAP": "{\"n1\":\"nested prop 1\"}", + "RECEIVED_AT": "2020-01-24T06:29:02.403Z", + "REVENUE": 50, + "SENT_AT": "2020-01-24T06:29:02.364Z", + "TIMESTAMP": "2020-01-24T06:29:02.403Z", + "UP_MAP_NESTED_MAP": "{\"n1\":\"nested prop 1\"}", + "USER_ID": "9bb5d4c2-a7aa-4a36-9efb-dd2b1aec5d33" + }, + "metadata": { + "columns": { + "ANONYMOUS_ID": "string", + "CHANNEL": "string", + "CONTEXT_APP_BUILD": "string", + "CONTEXT_APP_NAME": "string", + "CONTEXT_APP_NAMESPACE": "string", + "CONTEXT_APP_VERSION": "string", + "CONTEXT_C_MAP_NESTED_MAP_N_1": "string", + "CONTEXT_IP": "string", + "CONTEXT_LIBRARY_NAME": "string", + "CONTEXT_LIBRARY_VERSION": "string", + "CONTEXT_LOCALE": "string", + "CONTEXT_PASSED_IP": "string", + "CONTEXT_REQUEST_IP": "string", + "CONTEXT_SCREEN_DENSITY": "int", + "CONTEXT_TRAITS_CITY": "string", + "CONTEXT_TRAITS_COUNTRY": "string", + "CONTEXT_TRAITS_EMAIL": "string", + "CONTEXT_TRAITS_FIRSTNAME": "string", + "CONTEXT_USER_AGENT": "string", + "CURRENCY": "string", + "EMAIL": "string", + "EVENT": "string", + "EVENT_TEXT": "string", + "ID": "string", + "ORIGINAL_TIMESTAMP": "datetime", + "P_MAP_NESTED_MAP": "json", + "RECEIVED_AT": "datetime", + "REVENUE": "int", + "SENT_AT": "datetime", + "TIMESTAMP": "datetime", + "UP_MAP_NESTED_MAP": "json", + "USER_ID": "string", + "UUID_TS": "datetime" + }, + "receivedAt": "2020-01-24T11:59:02.403+05:30", + "table": "PRODUCT_ADDED" + } + } + ] + } +} diff --git a/test/__tests__/data/warehouse/integrations/jsonpaths/new/aliases.js b/test/__tests__/data/warehouse/integrations/jsonpaths/new/aliases.js new file mode 100644 index 0000000000..91f19c5c77 --- /dev/null +++ b/test/__tests__/data/warehouse/integrations/jsonpaths/new/aliases.js @@ -0,0 +1,415 @@ +module.exports = { + input: { + destination: { + Config: {} + }, + message: { + anonymousId: "e6ab2c5e-2cda-44a9-a962-e2f67df78bca", + channel: "web", + traits: { + city: "Disney", + country: "USA", + email: "mickey@disney.com", + firstname: "Mickey", + testMap: { + nestedMap: { + n1: "nested prop 1" + } + }, + }, + context: { + app: { + build: "1.0.0", + name: "RudderLabs JavaScript SDK", + namespace: "com.rudderlabs.javascript", + version: "1.0.5" + }, + ip: "0.0.0.0", + library: { + name: "RudderLabs JavaScript SDK", + version: "1.0.5" + }, + ctestMap: { + cnestedMap: { + n1: "context nested prop 1" + } + }, + locale: "en-GB", + 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.117 Safari/537.36" + }, + integrations: { + All: true, + RS: { + options: { + jsonPaths: ["alias.traits.testMap.nestedMap", "alias.context.ctestMap.cnestedMap"] + } + }, + BQ: { + options: { + jsonPaths: ["alias.traits.testMap.nestedMap", "alias.context.ctestMap.cnestedMap"] + } + }, + POSTGRES: { + options: { + jsonPaths: ["alias.traits.testMap.nestedMap", "alias.context.ctestMap.cnestedMap"] + } + }, + SNOWFLAKE: { + options: { + jsonPaths: ["alias.traits.testMap.nestedMap", "alias.context.ctestMap.cnestedMap"] + } + }, + S3_DATALAKE: { + options: { + skipReservedKeywordsEscaping: true + } + }, + }, + messageId: "a6a0ad5a-bd26-4f19-8f75-38484e580fc7", + originalTimestamp: "2020-01-24T06:29:02.364Z", + receivedAt: "2020-01-24T11:59:02.403+05:30", + request_ip: "[::1]:53708", + sentAt: "2020-01-24T06:29:02.364Z", + timestamp: "2020-01-24T11:59:02.403+05:30", + type: "alias", + userId: "9bb5d4c2-a7aa-4a36-9efb-dd2b1aec5d33" + }, + request: { + query: { + whSchemaVersion: "v1" + } + } + }, + output: { + default: [ + { + "data": { + "anonymous_id": "e6ab2c5e-2cda-44a9-a962-e2f67df78bca", + "channel": "web", + "city": "Disney", + "context_app_build": "1.0.0", + "context_app_name": "RudderLabs JavaScript SDK", + "context_app_namespace": "com.rudderlabs.javascript", + "context_app_version": "1.0.5", + "context_ctest_map_cnested_map_n_1": "context nested prop 1", + "context_ip": "0.0.0.0", + "context_library_name": "RudderLabs JavaScript SDK", + "context_library_version": "1.0.5", + "context_locale": "en-GB", + "context_passed_ip": "0.0.0.0", + "context_request_ip": "[::1]:53708", + "context_screen_density": 2, + "context_user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36", + "country": "USA", + "email": "mickey@disney.com", + "firstname": "Mickey", + "id": "a6a0ad5a-bd26-4f19-8f75-38484e580fc7", + "original_timestamp": "2020-01-24T06:29:02.364Z", + "received_at": "2020-01-24T06:29:02.403Z", + "sent_at": "2020-01-24T06:29:02.364Z", + "test_map_nested_map_n_1": "nested prop 1", + "timestamp": "2020-01-24T06:29:02.403Z", + "user_id": "9bb5d4c2-a7aa-4a36-9efb-dd2b1aec5d33" + }, + "metadata": { + "columns": { + "anonymous_id": "string", + "channel": "string", + "city": "string", + "context_app_build": "string", + "context_app_name": "string", + "context_app_namespace": "string", + "context_app_version": "string", + "context_ctest_map_cnested_map_n_1": "string", + "context_ip": "string", + "context_library_name": "string", + "context_library_version": "string", + "context_locale": "string", + "context_passed_ip": "string", + "context_request_ip": "string", + "context_screen_density": "int", + "context_user_agent": "string", + "country": "string", + "email": "string", + "firstname": "string", + "id": "string", + "original_timestamp": "datetime", + "received_at": "datetime", + "sent_at": "datetime", + "test_map_nested_map_n_1": "string", + "timestamp": "datetime", + "user_id": "string", + "uuid_ts": "datetime" + }, + "receivedAt": "2020-01-24T11:59:02.403+05:30", + "table": "aliases" + } + } + ], + rs: [ + { + "data": { + "anonymous_id": "e6ab2c5e-2cda-44a9-a962-e2f67df78bca", + "channel": "web", + "city": "Disney", + "context_app_build": "1.0.0", + "context_app_name": "RudderLabs JavaScript SDK", + "context_app_namespace": "com.rudderlabs.javascript", + "context_app_version": "1.0.5", + "context_ctest_map_cnested_map": "{\"n1\":\"context nested prop 1\"}", + "context_ip": "0.0.0.0", + "context_library_name": "RudderLabs JavaScript SDK", + "context_library_version": "1.0.5", + "context_locale": "en-GB", + "context_passed_ip": "0.0.0.0", + "context_request_ip": "[::1]:53708", + "context_screen_density": 2, + "context_user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36", + "country": "USA", + "email": "mickey@disney.com", + "firstname": "Mickey", + "id": "a6a0ad5a-bd26-4f19-8f75-38484e580fc7", + "original_timestamp": "2020-01-24T06:29:02.364Z", + "received_at": "2020-01-24T06:29:02.403Z", + "sent_at": "2020-01-24T06:29:02.364Z", + "test_map_nested_map": "{\"n1\":\"nested prop 1\"}", + "timestamp": "2020-01-24T06:29:02.403Z", + "user_id": "9bb5d4c2-a7aa-4a36-9efb-dd2b1aec5d33" + }, + "metadata": { + "columns": { + "anonymous_id": "string", + "channel": "string", + "city": "string", + "context_app_build": "string", + "context_app_name": "string", + "context_app_namespace": "string", + "context_app_version": "string", + "context_ctest_map_cnested_map": "json", + "context_ip": "string", + "context_library_name": "string", + "context_library_version": "string", + "context_locale": "string", + "context_passed_ip": "string", + "context_request_ip": "string", + "context_screen_density": "int", + "context_user_agent": "string", + "country": "string", + "email": "string", + "firstname": "string", + "id": "string", + "original_timestamp": "datetime", + "received_at": "datetime", + "sent_at": "datetime", + "test_map_nested_map": "json", + "timestamp": "datetime", + "user_id": "string", + "uuid_ts": "datetime" + }, + "receivedAt": "2020-01-24T11:59:02.403+05:30", + "table": "aliases" + } + } + ], + bq: [ + { + "data": { + "anonymous_id": "e6ab2c5e-2cda-44a9-a962-e2f67df78bca", + "channel": "web", + "city": "Disney", + "context_app_build": "1.0.0", + "context_app_name": "RudderLabs JavaScript SDK", + "context_app_namespace": "com.rudderlabs.javascript", + "context_app_version": "1.0.5", + "context_ctest_map_cnested_map": "{\"n1\":\"context nested prop 1\"}", + "context_ip": "0.0.0.0", + "context_library_name": "RudderLabs JavaScript SDK", + "context_library_version": "1.0.5", + "context_locale": "en-GB", + "context_passed_ip": "0.0.0.0", + "context_request_ip": "[::1]:53708", + "context_screen_density": 2, + "context_user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36", + "country": "USA", + "email": "mickey@disney.com", + "firstname": "Mickey", + "id": "a6a0ad5a-bd26-4f19-8f75-38484e580fc7", + "original_timestamp": "2020-01-24T06:29:02.364Z", + "received_at": "2020-01-24T06:29:02.403Z", + "sent_at": "2020-01-24T06:29:02.364Z", + "test_map_nested_map": "{\"n1\":\"nested prop 1\"}", + "timestamp": "2020-01-24T06:29:02.403Z", + "user_id": "9bb5d4c2-a7aa-4a36-9efb-dd2b1aec5d33" + }, + "metadata": { + "columns": { + "anonymous_id": "string", + "channel": "string", + "city": "string", + "context_app_build": "string", + "context_app_name": "string", + "context_app_namespace": "string", + "context_app_version": "string", + "context_ctest_map_cnested_map": "string", + "context_ip": "string", + "context_library_name": "string", + "context_library_version": "string", + "context_locale": "string", + "context_passed_ip": "string", + "context_request_ip": "string", + "context_screen_density": "int", + "context_user_agent": "string", + "country": "string", + "email": "string", + "firstname": "string", + "id": "string", + "loaded_at": "datetime", + "original_timestamp": "datetime", + "received_at": "datetime", + "sent_at": "datetime", + "test_map_nested_map": "string", + "timestamp": "datetime", + "user_id": "string", + "uuid_ts": "datetime" + }, + "receivedAt": "2020-01-24T11:59:02.403+05:30", + "table": "aliases" + } + } + ], + postgres: [ + { + "data": { + "anonymous_id": "e6ab2c5e-2cda-44a9-a962-e2f67df78bca", + "channel": "web", + "city": "Disney", + "context_app_build": "1.0.0", + "context_app_name": "RudderLabs JavaScript SDK", + "context_app_namespace": "com.rudderlabs.javascript", + "context_app_version": "1.0.5", + "context_ctest_map_cnested_map": "{\"n1\":\"context nested prop 1\"}", + "context_ip": "0.0.0.0", + "context_library_name": "RudderLabs JavaScript SDK", + "context_library_version": "1.0.5", + "context_locale": "en-GB", + "context_passed_ip": "0.0.0.0", + "context_request_ip": "[::1]:53708", + "context_screen_density": 2, + "context_user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36", + "country": "USA", + "email": "mickey@disney.com", + "firstname": "Mickey", + "id": "a6a0ad5a-bd26-4f19-8f75-38484e580fc7", + "original_timestamp": "2020-01-24T06:29:02.364Z", + "received_at": "2020-01-24T06:29:02.403Z", + "sent_at": "2020-01-24T06:29:02.364Z", + "test_map_nested_map": "{\"n1\":\"nested prop 1\"}", + "timestamp": "2020-01-24T06:29:02.403Z", + "user_id": "9bb5d4c2-a7aa-4a36-9efb-dd2b1aec5d33" + }, + "metadata": { + "columns": { + "anonymous_id": "string", + "channel": "string", + "city": "string", + "context_app_build": "string", + "context_app_name": "string", + "context_app_namespace": "string", + "context_app_version": "string", + "context_ctest_map_cnested_map": "json", + "context_ip": "string", + "context_library_name": "string", + "context_library_version": "string", + "context_locale": "string", + "context_passed_ip": "string", + "context_request_ip": "string", + "context_screen_density": "int", + "context_user_agent": "string", + "country": "string", + "email": "string", + "firstname": "string", + "id": "string", + "original_timestamp": "datetime", + "received_at": "datetime", + "sent_at": "datetime", + "test_map_nested_map": "json", + "timestamp": "datetime", + "user_id": "string", + "uuid_ts": "datetime" + }, + "receivedAt": "2020-01-24T11:59:02.403+05:30", + "table": "aliases" + } + } + ], + snowflake: [ + { + "data": { + "ANONYMOUS_ID": "e6ab2c5e-2cda-44a9-a962-e2f67df78bca", + "CHANNEL": "web", + "CITY": "Disney", + "CONTEXT_APP_BUILD": "1.0.0", + "CONTEXT_APP_NAME": "RudderLabs JavaScript SDK", + "CONTEXT_APP_NAMESPACE": "com.rudderlabs.javascript", + "CONTEXT_APP_VERSION": "1.0.5", + "CONTEXT_CTEST_MAP_CNESTED_MAP": "{\"n1\":\"context nested prop 1\"}", + "CONTEXT_IP": "0.0.0.0", + "CONTEXT_LIBRARY_NAME": "RudderLabs JavaScript SDK", + "CONTEXT_LIBRARY_VERSION": "1.0.5", + "CONTEXT_LOCALE": "en-GB", + "CONTEXT_PASSED_IP": "0.0.0.0", + "CONTEXT_REQUEST_IP": "[::1]:53708", + "CONTEXT_SCREEN_DENSITY": 2, + "CONTEXT_USER_AGENT": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36", + "COUNTRY": "USA", + "EMAIL": "mickey@disney.com", + "FIRSTNAME": "Mickey", + "ID": "a6a0ad5a-bd26-4f19-8f75-38484e580fc7", + "ORIGINAL_TIMESTAMP": "2020-01-24T06:29:02.364Z", + "RECEIVED_AT": "2020-01-24T06:29:02.403Z", + "SENT_AT": "2020-01-24T06:29:02.364Z", + "TEST_MAP_NESTED_MAP": "{\"n1\":\"nested prop 1\"}", + "TIMESTAMP": "2020-01-24T06:29:02.403Z", + "USER_ID": "9bb5d4c2-a7aa-4a36-9efb-dd2b1aec5d33" + }, + "metadata": { + "columns": { + "ANONYMOUS_ID": "string", + "CHANNEL": "string", + "CITY": "string", + "CONTEXT_APP_BUILD": "string", + "CONTEXT_APP_NAME": "string", + "CONTEXT_APP_NAMESPACE": "string", + "CONTEXT_APP_VERSION": "string", + "CONTEXT_CTEST_MAP_CNESTED_MAP": "json", + "CONTEXT_IP": "string", + "CONTEXT_LIBRARY_NAME": "string", + "CONTEXT_LIBRARY_VERSION": "string", + "CONTEXT_LOCALE": "string", + "CONTEXT_PASSED_IP": "string", + "CONTEXT_REQUEST_IP": "string", + "CONTEXT_SCREEN_DENSITY": "int", + "CONTEXT_USER_AGENT": "string", + "COUNTRY": "string", + "EMAIL": "string", + "FIRSTNAME": "string", + "ID": "string", + "ORIGINAL_TIMESTAMP": "datetime", + "RECEIVED_AT": "datetime", + "SENT_AT": "datetime", + "TEST_MAP_NESTED_MAP": "json", + "TIMESTAMP": "datetime", + "USER_ID": "string", + "UUID_TS": "datetime" + }, + "receivedAt": "2020-01-24T11:59:02.403+05:30", + "table": "ALIASES" + } + } + ], + } +} diff --git a/test/__tests__/data/warehouse/integrations/jsonpaths/new/extract.js b/test/__tests__/data/warehouse/integrations/jsonpaths/new/extract.js new file mode 100644 index 0000000000..7a36e4787e --- /dev/null +++ b/test/__tests__/data/warehouse/integrations/jsonpaths/new/extract.js @@ -0,0 +1,278 @@ +module.exports = { + input: { + destination: { + Config: {} + }, + message: { + anonymousId: "e6ab2c5e-2cda-44a9-a962-e2f67df78bca", + channel: "web", + context: { + sources: { + job_id: "djfhksdjhfkjdhfkjahkf", + version: "1169/merge", + job_run_id: "job_run_id", + task_run_id: "task_run_id" + }, + CMap: { + nestedMap: { + n1: "context nested prop 1" + } + }, + userAgent: + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36" + }, + event: "Product Added", + integrations: { + All: true, + RS: { + options: { + jsonPaths: [ + "extract.properties.PMap.nestedMap", + "extract.context.CMap.nestedMap", + ] + } + }, + BQ: { + options: { + jsonPaths: [ + "extract.properties.PMap.nestedMap", + "extract.context.CMap.nestedMap", + ] + } + }, + POSTGRES: { + options: { + jsonPaths: [ + "extract.properties.PMap.nestedMap", + "extract.context.CMap.nestedMap", + ] + } + }, + SNOWFLAKE: { + options: { + jsonPaths: [ + "extract.properties.PMap.nestedMap", + "extract.context.CMap.nestedMap", + ] + } + }, + S3_DATALAKE: { + options: { + skipReservedKeywordsEscaping: true + } + }, + }, + recordId: "a6a0ad5a-bd26-4f19-8f75-38484e580fc7", + messageId: "a6a0ad5a-bd26-4f19-8f75-38484e580fc7", + originalTimestamp: "2020-01-24T06:29:02.364Z", + properties: { + currency: "USD", + revenue: 50, + PMap: { + nestedMap: { + n1: "nested prop 1" + } + }, + }, + type: "extract", + receivedAt: "2020-01-24T11:59:02.403+05:30", + request_ip: "[::1]:53708", + sentAt: "2020-01-24T06:29:02.364Z", + timestamp: "2020-01-24T11:59:02.403+05:30", + userId: "9bb5d4c2-a7aa-4a36-9efb-dd2b1aec5d33" + }, + request: { + query: { + whSchemaVersion: "v1" + } + } + }, + output: { + default: [ + { + "data": { + "context_c_map_nested_map_n_1": "context nested prop 1", + "context_sources_job_id": "djfhksdjhfkjdhfkjahkf", + "context_sources_job_run_id": "job_run_id", + "context_sources_task_run_id": "task_run_id", + "context_sources_version": "1169/merge", + "context_user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36", + "currency": "USD", + "event": "Product Added", + "id": "a6a0ad5a-bd26-4f19-8f75-38484e580fc7", + "p_map_nested_map_n_1": "nested prop 1", + "received_at": "2020-01-24T06:29:02.403Z", + "revenue": 50 + }, + "metadata": { + "columns": { + "context_c_map_nested_map_n_1": "string", + "context_sources_job_id": "string", + "context_sources_job_run_id": "string", + "context_sources_task_run_id": "string", + "context_sources_version": "string", + "context_user_agent": "string", + "currency": "string", + "event": "string", + "id": "string", + "p_map_nested_map_n_1": "string", + "received_at": "datetime", + "revenue": "int", + "uuid_ts": "datetime" + }, + "receivedAt": "2020-01-24T11:59:02.403+05:30", + "table": "product_added" + } + } + ], + rs: [ + { + "data": { + "context_c_map_nested_map": "{\"n1\":\"context nested prop 1\"}", + "context_sources_job_id": "djfhksdjhfkjdhfkjahkf", + "context_sources_job_run_id": "job_run_id", + "context_sources_task_run_id": "task_run_id", + "context_sources_version": "1169/merge", + "context_user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36", + "currency": "USD", + "event": "Product Added", + "id": "a6a0ad5a-bd26-4f19-8f75-38484e580fc7", + "p_map_nested_map": "{\"n1\":\"nested prop 1\"}", + "received_at": "2020-01-24T06:29:02.403Z", + "revenue": 50 + }, + "metadata": { + "columns": { + "context_c_map_nested_map": "json", + "context_sources_job_id": "string", + "context_sources_job_run_id": "string", + "context_sources_task_run_id": "string", + "context_sources_version": "string", + "context_user_agent": "string", + "currency": "string", + "event": "string", + "id": "string", + "p_map_nested_map": "json", + "received_at": "datetime", + "revenue": "int", + "uuid_ts": "datetime" + }, + "receivedAt": "2020-01-24T11:59:02.403+05:30", + "table": "product_added" + } + } + ], + bq:[ + { + "data": { + "context_c_map_nested_map": "{\"n1\":\"context nested prop 1\"}", + "context_sources_job_id": "djfhksdjhfkjdhfkjahkf", + "context_sources_job_run_id": "job_run_id", + "context_sources_task_run_id": "task_run_id", + "context_sources_version": "1169/merge", + "context_user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36", + "currency": "USD", + "event": "Product Added", + "id": "a6a0ad5a-bd26-4f19-8f75-38484e580fc7", + "p_map_nested_map": "{\"n1\":\"nested prop 1\"}", + "received_at": "2020-01-24T06:29:02.403Z", + "revenue": 50 + }, + "metadata": { + "columns": { + "context_c_map_nested_map": "string", + "context_sources_job_id": "string", + "context_sources_job_run_id": "string", + "context_sources_task_run_id": "string", + "context_sources_version": "string", + "context_user_agent": "string", + "currency": "string", + "event": "string", + "id": "string", + "loaded_at": "datetime", + "p_map_nested_map": "string", + "received_at": "datetime", + "revenue": "int", + "uuid_ts": "datetime" + }, + "receivedAt": "2020-01-24T11:59:02.403+05:30", + "table": "product_added" + } + } + ], + postgres: [ + { + "data": { + "context_c_map_nested_map": "{\"n1\":\"context nested prop 1\"}", + "context_sources_job_id": "djfhksdjhfkjdhfkjahkf", + "context_sources_job_run_id": "job_run_id", + "context_sources_task_run_id": "task_run_id", + "context_sources_version": "1169/merge", + "context_user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36", + "currency": "USD", + "event": "Product Added", + "id": "a6a0ad5a-bd26-4f19-8f75-38484e580fc7", + "p_map_nested_map": "{\"n1\":\"nested prop 1\"}", + "received_at": "2020-01-24T06:29:02.403Z", + "revenue": 50 + }, + "metadata": { + "columns": { + "context_c_map_nested_map": "json", + "context_sources_job_id": "string", + "context_sources_job_run_id": "string", + "context_sources_task_run_id": "string", + "context_sources_version": "string", + "context_user_agent": "string", + "currency": "string", + "event": "string", + "id": "string", + "p_map_nested_map": "json", + "received_at": "datetime", + "revenue": "int", + "uuid_ts": "datetime" + }, + "receivedAt": "2020-01-24T11:59:02.403+05:30", + "table": "product_added" + } + } + ], + snowflake: [ + { + "data": { + "CONTEXT_C_MAP_NESTED_MAP": "{\"n1\":\"context nested prop 1\"}", + "CONTEXT_SOURCES_JOB_ID": "djfhksdjhfkjdhfkjahkf", + "CONTEXT_SOURCES_JOB_RUN_ID": "job_run_id", + "CONTEXT_SOURCES_TASK_RUN_ID": "task_run_id", + "CONTEXT_SOURCES_VERSION": "1169/merge", + "CONTEXT_USER_AGENT": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36", + "CURRENCY": "USD", + "EVENT": "Product Added", + "ID": "a6a0ad5a-bd26-4f19-8f75-38484e580fc7", + "P_MAP_NESTED_MAP": "{\"n1\":\"nested prop 1\"}", + "RECEIVED_AT": "2020-01-24T06:29:02.403Z", + "REVENUE": 50 + }, + "metadata": { + "columns": { + "CONTEXT_C_MAP_NESTED_MAP": "json", + "CONTEXT_SOURCES_JOB_ID": "string", + "CONTEXT_SOURCES_JOB_RUN_ID": "string", + "CONTEXT_SOURCES_TASK_RUN_ID": "string", + "CONTEXT_SOURCES_VERSION": "string", + "CONTEXT_USER_AGENT": "string", + "CURRENCY": "string", + "EVENT": "string", + "ID": "string", + "P_MAP_NESTED_MAP": "json", + "RECEIVED_AT": "datetime", + "REVENUE": "int", + "UUID_TS": "datetime" + }, + "receivedAt": "2020-01-24T11:59:02.403+05:30", + "table": "PRODUCT_ADDED" + } + } + ] + } +} diff --git a/test/__tests__/data/warehouse/integrations/jsonpaths/new/groups.js b/test/__tests__/data/warehouse/integrations/jsonpaths/new/groups.js new file mode 100644 index 0000000000..f84f9d33ed --- /dev/null +++ b/test/__tests__/data/warehouse/integrations/jsonpaths/new/groups.js @@ -0,0 +1,420 @@ +module.exports = { + input: { + destination: { + Config: {} + }, + message: { + anonymousId: "e6ab2c5e-2cda-44a9-a962-e2f67df78bca", + channel: "web", + traits: { + city: "Disney", + country: "USA", + email: "mickey@disney.com", + firstname: "Mickey", + testMap: { + nestedMap: { + n1: "nested prop 1" + } + }, + }, + context: { + app: { + build: "1.0.0", + name: "RudderLabs JavaScript SDK", + namespace: "com.rudderlabs.javascript", + version: "1.0.5" + }, + ip: "0.0.0.0", + library: { + name: "RudderLabs JavaScript SDK", + version: "1.0.5" + }, + ctestMap: { + cnestedMap: { + n1: "context nested prop 1" + } + }, + locale: "en-GB", + 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.117 Safari/537.36" + }, + integrations: { + All: true, + RS: { + options: { + jsonPaths: ["group.traits.testMap.nestedMap", "group.context.ctestMap.cnestedMap"] + } + }, + BQ: { + options: { + jsonPaths: ["group.traits.testMap.nestedMap", "group.context.ctestMap.cnestedMap"] + } + }, + POSTGRES: { + options: { + jsonPaths: ["group.traits.testMap.nestedMap", "group.context.ctestMap.cnestedMap"] + } + }, + SNOWFLAKE: { + options: { + jsonPaths: ["group.traits.testMap.nestedMap", "group.context.ctestMap.cnestedMap"] + } + }, + GCS_DATALAKE: { + options: { + skipReservedKeywordsEscaping: true + } + }, + S3_DATALAKE: { + options: { + skipReservedKeywordsEscaping: true + } + }, + }, + messageId: "a6a0ad5a-bd26-4f19-8f75-38484e580fc7", + originalTimestamp: "2020-01-24T06:29:02.364Z", + receivedAt: "2020-01-24T11:59:02.403+05:30", + request_ip: "[::1]:53708", + sentAt: "2020-01-24T06:29:02.364Z", + timestamp: "2020-01-24T11:59:02.403+05:30", + type: "group", + userId: "9bb5d4c2-a7aa-4a36-9efb-dd2b1aec5d33" + }, + request: { + query: { + whSchemaVersion: "v1" + } + } + }, + output: { + default: [ + { + "data": { + "anonymous_id": "e6ab2c5e-2cda-44a9-a962-e2f67df78bca", + "channel": "web", + "city": "Disney", + "context_app_build": "1.0.0", + "context_app_name": "RudderLabs JavaScript SDK", + "context_app_namespace": "com.rudderlabs.javascript", + "context_app_version": "1.0.5", + "context_ctest_map_cnested_map_n_1": "context nested prop 1", + "context_ip": "0.0.0.0", + "context_library_name": "RudderLabs JavaScript SDK", + "context_library_version": "1.0.5", + "context_locale": "en-GB", + "context_passed_ip": "0.0.0.0", + "context_request_ip": "[::1]:53708", + "context_screen_density": 2, + "context_user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36", + "country": "USA", + "email": "mickey@disney.com", + "firstname": "Mickey", + "id": "a6a0ad5a-bd26-4f19-8f75-38484e580fc7", + "original_timestamp": "2020-01-24T06:29:02.364Z", + "received_at": "2020-01-24T06:29:02.403Z", + "sent_at": "2020-01-24T06:29:02.364Z", + "test_map_nested_map_n_1": "nested prop 1", + "timestamp": "2020-01-24T06:29:02.403Z", + "user_id": "9bb5d4c2-a7aa-4a36-9efb-dd2b1aec5d33" + }, + "metadata": { + "columns": { + "anonymous_id": "string", + "channel": "string", + "city": "string", + "context_app_build": "string", + "context_app_name": "string", + "context_app_namespace": "string", + "context_app_version": "string", + "context_ctest_map_cnested_map_n_1": "string", + "context_ip": "string", + "context_library_name": "string", + "context_library_version": "string", + "context_locale": "string", + "context_passed_ip": "string", + "context_request_ip": "string", + "context_screen_density": "int", + "context_user_agent": "string", + "country": "string", + "email": "string", + "firstname": "string", + "id": "string", + "original_timestamp": "datetime", + "received_at": "datetime", + "sent_at": "datetime", + "test_map_nested_map_n_1": "string", + "timestamp": "datetime", + "user_id": "string", + "uuid_ts": "datetime" + }, + "receivedAt": "2020-01-24T11:59:02.403+05:30", + "table": "groups" + } + } + ], + rs: [ + { + "data": { + "anonymous_id": "e6ab2c5e-2cda-44a9-a962-e2f67df78bca", + "channel": "web", + "city": "Disney", + "context_app_build": "1.0.0", + "context_app_name": "RudderLabs JavaScript SDK", + "context_app_namespace": "com.rudderlabs.javascript", + "context_app_version": "1.0.5", + "context_ctest_map_cnested_map": "{\"n1\":\"context nested prop 1\"}", + "context_ip": "0.0.0.0", + "context_library_name": "RudderLabs JavaScript SDK", + "context_library_version": "1.0.5", + "context_locale": "en-GB", + "context_passed_ip": "0.0.0.0", + "context_request_ip": "[::1]:53708", + "context_screen_density": 2, + "context_user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36", + "country": "USA", + "email": "mickey@disney.com", + "firstname": "Mickey", + "id": "a6a0ad5a-bd26-4f19-8f75-38484e580fc7", + "original_timestamp": "2020-01-24T06:29:02.364Z", + "received_at": "2020-01-24T06:29:02.403Z", + "sent_at": "2020-01-24T06:29:02.364Z", + "test_map_nested_map": "{\"n1\":\"nested prop 1\"}", + "timestamp": "2020-01-24T06:29:02.403Z", + "user_id": "9bb5d4c2-a7aa-4a36-9efb-dd2b1aec5d33" + }, + "metadata": { + "columns": { + "anonymous_id": "string", + "channel": "string", + "city": "string", + "context_app_build": "string", + "context_app_name": "string", + "context_app_namespace": "string", + "context_app_version": "string", + "context_ctest_map_cnested_map": "json", + "context_ip": "string", + "context_library_name": "string", + "context_library_version": "string", + "context_locale": "string", + "context_passed_ip": "string", + "context_request_ip": "string", + "context_screen_density": "int", + "context_user_agent": "string", + "country": "string", + "email": "string", + "firstname": "string", + "id": "string", + "original_timestamp": "datetime", + "received_at": "datetime", + "sent_at": "datetime", + "test_map_nested_map": "json", + "timestamp": "datetime", + "user_id": "string", + "uuid_ts": "datetime" + }, + "receivedAt": "2020-01-24T11:59:02.403+05:30", + "table": "groups" + } + } + ], + bq: [ + { + "data": { + "anonymous_id": "e6ab2c5e-2cda-44a9-a962-e2f67df78bca", + "channel": "web", + "city": "Disney", + "context_app_build": "1.0.0", + "context_app_name": "RudderLabs JavaScript SDK", + "context_app_namespace": "com.rudderlabs.javascript", + "context_app_version": "1.0.5", + "context_ctest_map_cnested_map": "{\"n1\":\"context nested prop 1\"}", + "context_ip": "0.0.0.0", + "context_library_name": "RudderLabs JavaScript SDK", + "context_library_version": "1.0.5", + "context_locale": "en-GB", + "context_passed_ip": "0.0.0.0", + "context_request_ip": "[::1]:53708", + "context_screen_density": 2, + "context_user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36", + "country": "USA", + "email": "mickey@disney.com", + "firstname": "Mickey", + "id": "a6a0ad5a-bd26-4f19-8f75-38484e580fc7", + "original_timestamp": "2020-01-24T06:29:02.364Z", + "received_at": "2020-01-24T06:29:02.403Z", + "sent_at": "2020-01-24T06:29:02.364Z", + "test_map_nested_map": "{\"n1\":\"nested prop 1\"}", + "timestamp": "2020-01-24T06:29:02.403Z", + "user_id": "9bb5d4c2-a7aa-4a36-9efb-dd2b1aec5d33" + }, + "metadata": { + "columns": { + "anonymous_id": "string", + "channel": "string", + "city": "string", + "context_app_build": "string", + "context_app_name": "string", + "context_app_namespace": "string", + "context_app_version": "string", + "context_ctest_map_cnested_map": "string", + "context_ip": "string", + "context_library_name": "string", + "context_library_version": "string", + "context_locale": "string", + "context_passed_ip": "string", + "context_request_ip": "string", + "context_screen_density": "int", + "context_user_agent": "string", + "country": "string", + "email": "string", + "firstname": "string", + "id": "string", + "loaded_at": "datetime", + "original_timestamp": "datetime", + "received_at": "datetime", + "sent_at": "datetime", + "test_map_nested_map": "string", + "timestamp": "datetime", + "user_id": "string", + "uuid_ts": "datetime" + }, + "receivedAt": "2020-01-24T11:59:02.403+05:30", + "table": "_groups" + } + } + ], + postgres: [ + { + "data": { + "anonymous_id": "e6ab2c5e-2cda-44a9-a962-e2f67df78bca", + "channel": "web", + "city": "Disney", + "context_app_build": "1.0.0", + "context_app_name": "RudderLabs JavaScript SDK", + "context_app_namespace": "com.rudderlabs.javascript", + "context_app_version": "1.0.5", + "context_ctest_map_cnested_map": "{\"n1\":\"context nested prop 1\"}", + "context_ip": "0.0.0.0", + "context_library_name": "RudderLabs JavaScript SDK", + "context_library_version": "1.0.5", + "context_locale": "en-GB", + "context_passed_ip": "0.0.0.0", + "context_request_ip": "[::1]:53708", + "context_screen_density": 2, + "context_user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36", + "country": "USA", + "email": "mickey@disney.com", + "firstname": "Mickey", + "id": "a6a0ad5a-bd26-4f19-8f75-38484e580fc7", + "original_timestamp": "2020-01-24T06:29:02.364Z", + "received_at": "2020-01-24T06:29:02.403Z", + "sent_at": "2020-01-24T06:29:02.364Z", + "test_map_nested_map": "{\"n1\":\"nested prop 1\"}", + "timestamp": "2020-01-24T06:29:02.403Z", + "user_id": "9bb5d4c2-a7aa-4a36-9efb-dd2b1aec5d33" + }, + "metadata": { + "columns": { + "anonymous_id": "string", + "channel": "string", + "city": "string", + "context_app_build": "string", + "context_app_name": "string", + "context_app_namespace": "string", + "context_app_version": "string", + "context_ctest_map_cnested_map": "json", + "context_ip": "string", + "context_library_name": "string", + "context_library_version": "string", + "context_locale": "string", + "context_passed_ip": "string", + "context_request_ip": "string", + "context_screen_density": "int", + "context_user_agent": "string", + "country": "string", + "email": "string", + "firstname": "string", + "id": "string", + "original_timestamp": "datetime", + "received_at": "datetime", + "sent_at": "datetime", + "test_map_nested_map": "json", + "timestamp": "datetime", + "user_id": "string", + "uuid_ts": "datetime" + }, + "receivedAt": "2020-01-24T11:59:02.403+05:30", + "table": "groups" + } + } + ], + snowflake: [ + { + "data": { + "ANONYMOUS_ID": "e6ab2c5e-2cda-44a9-a962-e2f67df78bca", + "CHANNEL": "web", + "CITY": "Disney", + "CONTEXT_APP_BUILD": "1.0.0", + "CONTEXT_APP_NAME": "RudderLabs JavaScript SDK", + "CONTEXT_APP_NAMESPACE": "com.rudderlabs.javascript", + "CONTEXT_APP_VERSION": "1.0.5", + "CONTEXT_CTEST_MAP_CNESTED_MAP": "{\"n1\":\"context nested prop 1\"}", + "CONTEXT_IP": "0.0.0.0", + "CONTEXT_LIBRARY_NAME": "RudderLabs JavaScript SDK", + "CONTEXT_LIBRARY_VERSION": "1.0.5", + "CONTEXT_LOCALE": "en-GB", + "CONTEXT_PASSED_IP": "0.0.0.0", + "CONTEXT_REQUEST_IP": "[::1]:53708", + "CONTEXT_SCREEN_DENSITY": 2, + "CONTEXT_USER_AGENT": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36", + "COUNTRY": "USA", + "EMAIL": "mickey@disney.com", + "FIRSTNAME": "Mickey", + "ID": "a6a0ad5a-bd26-4f19-8f75-38484e580fc7", + "ORIGINAL_TIMESTAMP": "2020-01-24T06:29:02.364Z", + "RECEIVED_AT": "2020-01-24T06:29:02.403Z", + "SENT_AT": "2020-01-24T06:29:02.364Z", + "TEST_MAP_NESTED_MAP": "{\"n1\":\"nested prop 1\"}", + "TIMESTAMP": "2020-01-24T06:29:02.403Z", + "USER_ID": "9bb5d4c2-a7aa-4a36-9efb-dd2b1aec5d33" + }, + "metadata": { + "columns": { + "ANONYMOUS_ID": "string", + "CHANNEL": "string", + "CITY": "string", + "CONTEXT_APP_BUILD": "string", + "CONTEXT_APP_NAME": "string", + "CONTEXT_APP_NAMESPACE": "string", + "CONTEXT_APP_VERSION": "string", + "CONTEXT_CTEST_MAP_CNESTED_MAP": "json", + "CONTEXT_IP": "string", + "CONTEXT_LIBRARY_NAME": "string", + "CONTEXT_LIBRARY_VERSION": "string", + "CONTEXT_LOCALE": "string", + "CONTEXT_PASSED_IP": "string", + "CONTEXT_REQUEST_IP": "string", + "CONTEXT_SCREEN_DENSITY": "int", + "CONTEXT_USER_AGENT": "string", + "COUNTRY": "string", + "EMAIL": "string", + "FIRSTNAME": "string", + "ID": "string", + "ORIGINAL_TIMESTAMP": "datetime", + "RECEIVED_AT": "datetime", + "SENT_AT": "datetime", + "TEST_MAP_NESTED_MAP": "json", + "TIMESTAMP": "datetime", + "USER_ID": "string", + "UUID_TS": "datetime" + }, + "receivedAt": "2020-01-24T11:59:02.403+05:30", + "table": "GROUPS" + } + } + ], + } +} diff --git a/test/__tests__/data/warehouse/integrations/jsonpaths/new/identifies.js b/test/__tests__/data/warehouse/integrations/jsonpaths/new/identifies.js new file mode 100644 index 0000000000..3d6164b430 --- /dev/null +++ b/test/__tests__/data/warehouse/integrations/jsonpaths/new/identifies.js @@ -0,0 +1,850 @@ +module.exports = { + input: { + destination: { + Config: {} + }, + message: { + type: "identify", + sentAt: "2021-01-03T17:02:53.195Z", + userId: "user123", + channel: "web", + integrations: { + All: true, + RS: { + options: { + jsonPaths: [ + "identify.userProperties.UPMap.nestedMap", + "identify.context.traits.CTMap.nestedMap", + "identify.traits.TMap.nestedMap", + "identify.context.CMap.nestedMap", + ] + } + }, + BQ: { + options: { + jsonPaths: [ + "identify.userProperties.UPMap.nestedMap", + "identify.context.traits.CTMap.nestedMap", + "identify.traits.TMap.nestedMap", + "identify.context.CMap.nestedMap", + ] + } + }, + POSTGRES: { + options: { + jsonPaths: [ + "identify.userProperties.UPMap.nestedMap", + "identify.context.traits.CTMap.nestedMap", + "identify.traits.TMap.nestedMap", + "identify.context.CMap.nestedMap", + ] + } + }, + SNOWFLAKE: { + options: { + jsonPaths: [ + "identify.userProperties.UPMap.nestedMap", + "identify.context.traits.CTMap.nestedMap", + "identify.traits.TMap.nestedMap", + "identify.context.CMap.nestedMap", + ] + } + }, + S3_DATALAKE: { + options: { + skipReservedKeywordsEscaping: true + } + }, + }, + userProperties: { + email: "test@gmail.com", + UPMap: { + nestedMap: { + n1: "nested prop 1" + } + }, + }, + traits: { + TMap: { + nestedMap: { + n1: "nested prop 1" + } + }, + }, + context: { + os: { + "name": "android", + "version": "1.12.3" + }, + app: { + name: "RudderLabs JavaScript SDK", + build: "1.0.0", + version: "1.1.11", + namespace: "com.rudderlabs.javascript" + }, + traits: { + email: "user123@email.com", + phone: "+917836362334", + userId: "user123", + CTMap: { + nestedMap: { + n1: "nested prop 1" + } + }, + }, + CMap: { + nestedMap: { + n1: "context nested prop 1" + } + }, + locale: "en-US", + device: { + token: "token", + id: "id", + type: "ios" + }, + library: { + name: "RudderLabs JavaScript SDK", + version: "1.1.11" + }, + userAgent: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.16; rv:84.0) Gecko/20100101 Firefox/84.0" + }, + rudderId: "8f8fa6b5-8e24-489c-8e22-61f23f2e364f", + messageId: "2116ef8c-efc3-4ca4-851b-02ee60dad6ff", + anonymousId: "97c46c81-3140-456d-b2a9-690d70aaca35", + originalTimestamp: "2020-01-24T06:29:02.364Z", + receivedAt: "2020-01-24T11:59:02.403+05:30", + request_ip: "[::1]:53708", + timestamp: "2020-01-24T11:59:02.403+05:30" + }, + request: { + query: { + whSchemaVersion: "v1" + } + } + }, + output: { + default: [ + { + "data": { + "anonymous_id": "97c46c81-3140-456d-b2a9-690d70aaca35", + "channel": "web", + "context_app_build": "1.0.0", + "context_app_name": "RudderLabs JavaScript SDK", + "context_app_namespace": "com.rudderlabs.javascript", + "context_app_version": "1.1.11", + "context_c_map_nested_map_n_1": "context nested prop 1", + "context_device_id": "id", + "context_device_token": "token", + "context_device_type": "ios", + "context_ip": "[::1]:53708", + "context_library_name": "RudderLabs JavaScript SDK", + "context_library_version": "1.1.11", + "context_locale": "en-US", + "context_os_name": "android", + "context_os_version": "1.12.3", + "context_request_ip": "[::1]:53708", + "context_traits_ct_map_nested_map_n_1": "nested prop 1", + "context_traits_email": "user123@email.com", + "context_traits_phone": "+917836362334", + "context_traits_user_id": "user123", + "context_user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.16; rv:84.0) Gecko/20100101 Firefox/84.0", + "ct_map_nested_map_n_1": "nested prop 1", + "email": "user123@email.com", + "id": "2116ef8c-efc3-4ca4-851b-02ee60dad6ff", + "original_timestamp": "2020-01-24T06:29:02.364Z", + "phone": "+917836362334", + "received_at": "2020-01-24T06:29:02.403Z", + "sent_at": "2021-01-03T17:02:53.195Z", + "t_map_nested_map_n_1": "nested prop 1", + "timestamp": "2020-01-24T06:29:02.403Z", + "up_map_nested_map_n_1": "nested prop 1", + "user_id": "user123" + }, + "metadata": { + "columns": { + "anonymous_id": "string", + "channel": "string", + "context_app_build": "string", + "context_app_name": "string", + "context_app_namespace": "string", + "context_app_version": "string", + "context_c_map_nested_map_n_1": "string", + "context_device_id": "string", + "context_device_token": "string", + "context_device_type": "string", + "context_ip": "string", + "context_library_name": "string", + "context_library_version": "string", + "context_locale": "string", + "context_os_name": "string", + "context_os_version": "string", + "context_request_ip": "string", + "context_traits_ct_map_nested_map_n_1": "string", + "context_traits_email": "string", + "context_traits_phone": "string", + "context_traits_user_id": "string", + "context_user_agent": "string", + "ct_map_nested_map_n_1": "string", + "email": "string", + "id": "string", + "original_timestamp": "datetime", + "phone": "string", + "received_at": "datetime", + "sent_at": "datetime", + "t_map_nested_map_n_1": "string", + "timestamp": "datetime", + "up_map_nested_map_n_1": "string", + "user_id": "string", + "uuid_ts": "datetime" + }, + "receivedAt": "2020-01-24T11:59:02.403+05:30", + "table": "identifies" + } + }, + { + "data": { + "context_app_build": "1.0.0", + "context_app_name": "RudderLabs JavaScript SDK", + "context_app_namespace": "com.rudderlabs.javascript", + "context_app_version": "1.1.11", + "context_c_map_nested_map_n_1": "context nested prop 1", + "context_device_id": "id", + "context_device_token": "token", + "context_device_type": "ios", + "context_ip": "[::1]:53708", + "context_library_name": "RudderLabs JavaScript SDK", + "context_library_version": "1.1.11", + "context_locale": "en-US", + "context_os_name": "android", + "context_os_version": "1.12.3", + "context_request_ip": "[::1]:53708", + "context_traits_ct_map_nested_map_n_1": "nested prop 1", + "context_traits_email": "user123@email.com", + "context_traits_phone": "+917836362334", + "context_traits_user_id": "user123", + "context_user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.16; rv:84.0) Gecko/20100101 Firefox/84.0", + "ct_map_nested_map_n_1": "nested prop 1", + "email": "user123@email.com", + "id": "user123", + "phone": "+917836362334", + "received_at": "2020-01-24T06:29:02.403Z", + "t_map_nested_map_n_1": "nested prop 1", + "up_map_nested_map_n_1": "nested prop 1" + }, + "metadata": { + "columns": { + "context_app_build": "string", + "context_app_name": "string", + "context_app_namespace": "string", + "context_app_version": "string", + "context_c_map_nested_map_n_1": "string", + "context_device_id": "string", + "context_device_token": "string", + "context_device_type": "string", + "context_ip": "string", + "context_library_name": "string", + "context_library_version": "string", + "context_locale": "string", + "context_os_name": "string", + "context_os_version": "string", + "context_request_ip": "string", + "context_traits_ct_map_nested_map_n_1": "string", + "context_traits_email": "string", + "context_traits_phone": "string", + "context_traits_user_id": "string", + "context_user_agent": "string", + "ct_map_nested_map_n_1": "string", + "email": "string", + "id": "string", + "phone": "string", + "received_at": "datetime", + "t_map_nested_map_n_1": "string", + "up_map_nested_map_n_1": "string", + "uuid_ts": "datetime" + }, + "receivedAt": "2020-01-24T11:59:02.403+05:30", + "table": "users" + } + } + ], + rs: [ + { + "data": { + "anonymous_id": "97c46c81-3140-456d-b2a9-690d70aaca35", + "channel": "web", + "context_app_build": "1.0.0", + "context_app_name": "RudderLabs JavaScript SDK", + "context_app_namespace": "com.rudderlabs.javascript", + "context_app_version": "1.1.11", + "context_c_map_nested_map": "{\"n1\":\"context nested prop 1\"}", + "context_device_id": "id", + "context_device_token": "token", + "context_device_type": "ios", + "context_ip": "[::1]:53708", + "context_library_name": "RudderLabs JavaScript SDK", + "context_library_version": "1.1.11", + "context_locale": "en-US", + "context_os_name": "android", + "context_os_version": "1.12.3", + "context_request_ip": "[::1]:53708", + "context_traits_ct_map_nested_map": "{\"n1\":\"nested prop 1\"}", + "context_traits_email": "user123@email.com", + "context_traits_phone": "+917836362334", + "context_traits_user_id": "user123", + "context_user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.16; rv:84.0) Gecko/20100101 Firefox/84.0", + "ct_map_nested_map": "{\"n1\":\"nested prop 1\"}", + "email": "user123@email.com", + "id": "2116ef8c-efc3-4ca4-851b-02ee60dad6ff", + "original_timestamp": "2020-01-24T06:29:02.364Z", + "phone": "+917836362334", + "received_at": "2020-01-24T06:29:02.403Z", + "sent_at": "2021-01-03T17:02:53.195Z", + "t_map_nested_map": "{\"n1\":\"nested prop 1\"}", + "timestamp": "2020-01-24T06:29:02.403Z", + "up_map_nested_map": "{\"n1\":\"nested prop 1\"}", + "user_id": "user123" + }, + "metadata": { + "columns": { + "anonymous_id": "string", + "channel": "string", + "context_app_build": "string", + "context_app_name": "string", + "context_app_namespace": "string", + "context_app_version": "string", + "context_c_map_nested_map": "json", + "context_device_id": "string", + "context_device_token": "string", + "context_device_type": "string", + "context_ip": "string", + "context_library_name": "string", + "context_library_version": "string", + "context_locale": "string", + "context_os_name": "string", + "context_os_version": "string", + "context_request_ip": "string", + "context_traits_ct_map_nested_map": "json", + "context_traits_email": "string", + "context_traits_phone": "string", + "context_traits_user_id": "string", + "context_user_agent": "string", + "ct_map_nested_map": "json", + "email": "string", + "id": "string", + "original_timestamp": "datetime", + "phone": "string", + "received_at": "datetime", + "sent_at": "datetime", + "t_map_nested_map": "json", + "timestamp": "datetime", + "up_map_nested_map": "json", + "user_id": "string", + "uuid_ts": "datetime" + }, + "receivedAt": "2020-01-24T11:59:02.403+05:30", + "table": "identifies" + } + }, + { + "data": { + "context_app_build": "1.0.0", + "context_app_name": "RudderLabs JavaScript SDK", + "context_app_namespace": "com.rudderlabs.javascript", + "context_app_version": "1.1.11", + "context_c_map_nested_map": "{\"n1\":\"context nested prop 1\"}", + "context_device_id": "id", + "context_device_token": "token", + "context_device_type": "ios", + "context_ip": "[::1]:53708", + "context_library_name": "RudderLabs JavaScript SDK", + "context_library_version": "1.1.11", + "context_locale": "en-US", + "context_os_name": "android", + "context_os_version": "1.12.3", + "context_request_ip": "[::1]:53708", + "context_traits_ct_map_nested_map": "{\"n1\":\"nested prop 1\"}", + "context_traits_email": "user123@email.com", + "context_traits_phone": "+917836362334", + "context_traits_user_id": "user123", + "context_user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.16; rv:84.0) Gecko/20100101 Firefox/84.0", + "ct_map_nested_map": "{\"n1\":\"nested prop 1\"}", + "email": "user123@email.com", + "id": "user123", + "phone": "+917836362334", + "received_at": "2020-01-24T06:29:02.403Z", + "t_map_nested_map": "{\"n1\":\"nested prop 1\"}", + "up_map_nested_map": "{\"n1\":\"nested prop 1\"}" + }, + "metadata": { + "columns": { + "context_app_build": "string", + "context_app_name": "string", + "context_app_namespace": "string", + "context_app_version": "string", + "context_c_map_nested_map": "json", + "context_device_id": "string", + "context_device_token": "string", + "context_device_type": "string", + "context_ip": "string", + "context_library_name": "string", + "context_library_version": "string", + "context_locale": "string", + "context_os_name": "string", + "context_os_version": "string", + "context_request_ip": "string", + "context_traits_ct_map_nested_map": "json", + "context_traits_email": "string", + "context_traits_phone": "string", + "context_traits_user_id": "string", + "context_user_agent": "string", + "ct_map_nested_map": "json", + "email": "string", + "id": "string", + "phone": "string", + "received_at": "datetime", + "t_map_nested_map": "json", + "up_map_nested_map": "json", + "uuid_ts": "datetime" + }, + "receivedAt": "2020-01-24T11:59:02.403+05:30", + "table": "users" + } + } + ], + bq: [ + { + "data": { + "anonymous_id": "97c46c81-3140-456d-b2a9-690d70aaca35", + "channel": "web", + "context_app_build": "1.0.0", + "context_app_name": "RudderLabs JavaScript SDK", + "context_app_namespace": "com.rudderlabs.javascript", + "context_app_version": "1.1.11", + "context_c_map_nested_map": "{\"n1\":\"context nested prop 1\"}", + "context_device_id": "id", + "context_device_token": "token", + "context_device_type": "ios", + "context_ip": "[::1]:53708", + "context_library_name": "RudderLabs JavaScript SDK", + "context_library_version": "1.1.11", + "context_locale": "en-US", + "context_os_name": "android", + "context_os_version": "1.12.3", + "context_request_ip": "[::1]:53708", + "context_traits_ct_map_nested_map": "{\"n1\":\"nested prop 1\"}", + "context_traits_email": "user123@email.com", + "context_traits_phone": "+917836362334", + "context_traits_user_id": "user123", + "context_user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.16; rv:84.0) Gecko/20100101 Firefox/84.0", + "ct_map_nested_map": "{\"n1\":\"nested prop 1\"}", + "email": "user123@email.com", + "id": "2116ef8c-efc3-4ca4-851b-02ee60dad6ff", + "original_timestamp": "2020-01-24T06:29:02.364Z", + "phone": "+917836362334", + "received_at": "2020-01-24T06:29:02.403Z", + "sent_at": "2021-01-03T17:02:53.195Z", + "t_map_nested_map": "{\"n1\":\"nested prop 1\"}", + "timestamp": "2020-01-24T06:29:02.403Z", + "up_map_nested_map": "{\"n1\":\"nested prop 1\"}", + "user_id": "user123" + }, + "metadata": { + "columns": { + "anonymous_id": "string", + "channel": "string", + "context_app_build": "string", + "context_app_name": "string", + "context_app_namespace": "string", + "context_app_version": "string", + "context_c_map_nested_map": "string", + "context_device_id": "string", + "context_device_token": "string", + "context_device_type": "string", + "context_ip": "string", + "context_library_name": "string", + "context_library_version": "string", + "context_locale": "string", + "context_os_name": "string", + "context_os_version": "string", + "context_request_ip": "string", + "context_traits_ct_map_nested_map": "string", + "context_traits_email": "string", + "context_traits_phone": "string", + "context_traits_user_id": "string", + "context_user_agent": "string", + "ct_map_nested_map": "string", + "email": "string", + "id": "string", + "loaded_at": "datetime", + "original_timestamp": "datetime", + "phone": "string", + "received_at": "datetime", + "sent_at": "datetime", + "t_map_nested_map": "string", + "timestamp": "datetime", + "up_map_nested_map": "string", + "user_id": "string", + "uuid_ts": "datetime" + }, + "receivedAt": "2020-01-24T11:59:02.403+05:30", + "table": "identifies" + } + }, + { + "data": { + "context_app_build": "1.0.0", + "context_app_name": "RudderLabs JavaScript SDK", + "context_app_namespace": "com.rudderlabs.javascript", + "context_app_version": "1.1.11", + "context_c_map_nested_map": "{\"n1\":\"context nested prop 1\"}", + "context_device_id": "id", + "context_device_token": "token", + "context_device_type": "ios", + "context_ip": "[::1]:53708", + "context_library_name": "RudderLabs JavaScript SDK", + "context_library_version": "1.1.11", + "context_locale": "en-US", + "context_os_name": "android", + "context_os_version": "1.12.3", + "context_request_ip": "[::1]:53708", + "context_traits_ct_map_nested_map": "{\"n1\":\"nested prop 1\"}", + "context_traits_email": "user123@email.com", + "context_traits_phone": "+917836362334", + "context_traits_user_id": "user123", + "context_user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.16; rv:84.0) Gecko/20100101 Firefox/84.0", + "ct_map_nested_map": "{\"n1\":\"nested prop 1\"}", + "email": "user123@email.com", + "id": "user123", + "phone": "+917836362334", + "received_at": "2020-01-24T06:29:02.403Z", + "t_map_nested_map": "{\"n1\":\"nested prop 1\"}", + "up_map_nested_map": "{\"n1\":\"nested prop 1\"}" + }, + "metadata": { + "columns": { + "context_app_build": "string", + "context_app_name": "string", + "context_app_namespace": "string", + "context_app_version": "string", + "context_c_map_nested_map": "string", + "context_device_id": "string", + "context_device_token": "string", + "context_device_type": "string", + "context_ip": "string", + "context_library_name": "string", + "context_library_version": "string", + "context_locale": "string", + "context_os_name": "string", + "context_os_version": "string", + "context_request_ip": "string", + "context_traits_ct_map_nested_map": "string", + "context_traits_email": "string", + "context_traits_phone": "string", + "context_traits_user_id": "string", + "context_user_agent": "string", + "ct_map_nested_map": "string", + "email": "string", + "id": "string", + "loaded_at": "datetime", + "phone": "string", + "received_at": "datetime", + "t_map_nested_map": "string", + "up_map_nested_map": "string", + "uuid_ts": "datetime" + }, + "receivedAt": "2020-01-24T11:59:02.403+05:30", + "table": "users" + } + } + ], + postgres: [ + { + "data": { + "anonymous_id": "97c46c81-3140-456d-b2a9-690d70aaca35", + "channel": "web", + "context_app_build": "1.0.0", + "context_app_name": "RudderLabs JavaScript SDK", + "context_app_namespace": "com.rudderlabs.javascript", + "context_app_version": "1.1.11", + "context_c_map_nested_map": "{\"n1\":\"context nested prop 1\"}", + "context_device_id": "id", + "context_device_token": "token", + "context_device_type": "ios", + "context_ip": "[::1]:53708", + "context_library_name": "RudderLabs JavaScript SDK", + "context_library_version": "1.1.11", + "context_locale": "en-US", + "context_os_name": "android", + "context_os_version": "1.12.3", + "context_request_ip": "[::1]:53708", + "context_traits_ct_map_nested_map": "{\"n1\":\"nested prop 1\"}", + "context_traits_email": "user123@email.com", + "context_traits_phone": "+917836362334", + "context_traits_user_id": "user123", + "context_user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.16; rv:84.0) Gecko/20100101 Firefox/84.0", + "ct_map_nested_map": "{\"n1\":\"nested prop 1\"}", + "email": "user123@email.com", + "id": "2116ef8c-efc3-4ca4-851b-02ee60dad6ff", + "original_timestamp": "2020-01-24T06:29:02.364Z", + "phone": "+917836362334", + "received_at": "2020-01-24T06:29:02.403Z", + "sent_at": "2021-01-03T17:02:53.195Z", + "t_map_nested_map": "{\"n1\":\"nested prop 1\"}", + "timestamp": "2020-01-24T06:29:02.403Z", + "up_map_nested_map": "{\"n1\":\"nested prop 1\"}", + "user_id": "user123" + }, + "metadata": { + "columns": { + "anonymous_id": "string", + "channel": "string", + "context_app_build": "string", + "context_app_name": "string", + "context_app_namespace": "string", + "context_app_version": "string", + "context_c_map_nested_map": "json", + "context_device_id": "string", + "context_device_token": "string", + "context_device_type": "string", + "context_ip": "string", + "context_library_name": "string", + "context_library_version": "string", + "context_locale": "string", + "context_os_name": "string", + "context_os_version": "string", + "context_request_ip": "string", + "context_traits_ct_map_nested_map": "json", + "context_traits_email": "string", + "context_traits_phone": "string", + "context_traits_user_id": "string", + "context_user_agent": "string", + "ct_map_nested_map": "json", + "email": "string", + "id": "string", + "original_timestamp": "datetime", + "phone": "string", + "received_at": "datetime", + "sent_at": "datetime", + "t_map_nested_map": "json", + "timestamp": "datetime", + "up_map_nested_map": "json", + "user_id": "string", + "uuid_ts": "datetime" + }, + "receivedAt": "2020-01-24T11:59:02.403+05:30", + "table": "identifies" + } + }, + { + "data": { + "context_app_build": "1.0.0", + "context_app_name": "RudderLabs JavaScript SDK", + "context_app_namespace": "com.rudderlabs.javascript", + "context_app_version": "1.1.11", + "context_c_map_nested_map": "{\"n1\":\"context nested prop 1\"}", + "context_device_id": "id", + "context_device_token": "token", + "context_device_type": "ios", + "context_ip": "[::1]:53708", + "context_library_name": "RudderLabs JavaScript SDK", + "context_library_version": "1.1.11", + "context_locale": "en-US", + "context_os_name": "android", + "context_os_version": "1.12.3", + "context_request_ip": "[::1]:53708", + "context_traits_ct_map_nested_map": "{\"n1\":\"nested prop 1\"}", + "context_traits_email": "user123@email.com", + "context_traits_phone": "+917836362334", + "context_traits_user_id": "user123", + "context_user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.16; rv:84.0) Gecko/20100101 Firefox/84.0", + "ct_map_nested_map": "{\"n1\":\"nested prop 1\"}", + "email": "user123@email.com", + "id": "user123", + "phone": "+917836362334", + "received_at": "2020-01-24T06:29:02.403Z", + "t_map_nested_map": "{\"n1\":\"nested prop 1\"}", + "up_map_nested_map": "{\"n1\":\"nested prop 1\"}" + }, + "metadata": { + "columns": { + "context_app_build": "string", + "context_app_name": "string", + "context_app_namespace": "string", + "context_app_version": "string", + "context_c_map_nested_map": "json", + "context_device_id": "string", + "context_device_token": "string", + "context_device_type": "string", + "context_ip": "string", + "context_library_name": "string", + "context_library_version": "string", + "context_locale": "string", + "context_os_name": "string", + "context_os_version": "string", + "context_request_ip": "string", + "context_traits_ct_map_nested_map": "json", + "context_traits_email": "string", + "context_traits_phone": "string", + "context_traits_user_id": "string", + "context_user_agent": "string", + "ct_map_nested_map": "json", + "email": "string", + "id": "string", + "phone": "string", + "received_at": "datetime", + "t_map_nested_map": "json", + "up_map_nested_map": "json", + "uuid_ts": "datetime" + }, + "receivedAt": "2020-01-24T11:59:02.403+05:30", + "table": "users" + } + } + ], + snowflake: [ + { + "data": { + "ANONYMOUS_ID": "97c46c81-3140-456d-b2a9-690d70aaca35", + "CHANNEL": "web", + "CONTEXT_APP_BUILD": "1.0.0", + "CONTEXT_APP_NAME": "RudderLabs JavaScript SDK", + "CONTEXT_APP_NAMESPACE": "com.rudderlabs.javascript", + "CONTEXT_APP_VERSION": "1.1.11", + "CONTEXT_C_MAP_NESTED_MAP": "{\"n1\":\"context nested prop 1\"}", + "CONTEXT_DEVICE_ID": "id", + "CONTEXT_DEVICE_TOKEN": "token", + "CONTEXT_DEVICE_TYPE": "ios", + "CONTEXT_IP": "[::1]:53708", + "CONTEXT_LIBRARY_NAME": "RudderLabs JavaScript SDK", + "CONTEXT_LIBRARY_VERSION": "1.1.11", + "CONTEXT_LOCALE": "en-US", + "CONTEXT_OS_NAME": "android", + "CONTEXT_OS_VERSION": "1.12.3", + "CONTEXT_REQUEST_IP": "[::1]:53708", + "CONTEXT_TRAITS_CT_MAP_NESTED_MAP": "{\"n1\":\"nested prop 1\"}", + "CONTEXT_TRAITS_EMAIL": "user123@email.com", + "CONTEXT_TRAITS_PHONE": "+917836362334", + "CONTEXT_TRAITS_USER_ID": "user123", + "CONTEXT_USER_AGENT": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.16; rv:84.0) Gecko/20100101 Firefox/84.0", + "CT_MAP_NESTED_MAP": "{\"n1\":\"nested prop 1\"}", + "EMAIL": "user123@email.com", + "ID": "2116ef8c-efc3-4ca4-851b-02ee60dad6ff", + "ORIGINAL_TIMESTAMP": "2020-01-24T06:29:02.364Z", + "PHONE": "+917836362334", + "RECEIVED_AT": "2020-01-24T06:29:02.403Z", + "SENT_AT": "2021-01-03T17:02:53.195Z", + "TIMESTAMP": "2020-01-24T06:29:02.403Z", + "T_MAP_NESTED_MAP": "{\"n1\":\"nested prop 1\"}", + "UP_MAP_NESTED_MAP": "{\"n1\":\"nested prop 1\"}", + "USER_ID": "user123" + }, + "metadata": { + "columns": { + "ANONYMOUS_ID": "string", + "CHANNEL": "string", + "CONTEXT_APP_BUILD": "string", + "CONTEXT_APP_NAME": "string", + "CONTEXT_APP_NAMESPACE": "string", + "CONTEXT_APP_VERSION": "string", + "CONTEXT_C_MAP_NESTED_MAP": "json", + "CONTEXT_DEVICE_ID": "string", + "CONTEXT_DEVICE_TOKEN": "string", + "CONTEXT_DEVICE_TYPE": "string", + "CONTEXT_IP": "string", + "CONTEXT_LIBRARY_NAME": "string", + "CONTEXT_LIBRARY_VERSION": "string", + "CONTEXT_LOCALE": "string", + "CONTEXT_OS_NAME": "string", + "CONTEXT_OS_VERSION": "string", + "CONTEXT_REQUEST_IP": "string", + "CONTEXT_TRAITS_CT_MAP_NESTED_MAP": "json", + "CONTEXT_TRAITS_EMAIL": "string", + "CONTEXT_TRAITS_PHONE": "string", + "CONTEXT_TRAITS_USER_ID": "string", + "CONTEXT_USER_AGENT": "string", + "CT_MAP_NESTED_MAP": "json", + "EMAIL": "string", + "ID": "string", + "ORIGINAL_TIMESTAMP": "datetime", + "PHONE": "string", + "RECEIVED_AT": "datetime", + "SENT_AT": "datetime", + "TIMESTAMP": "datetime", + "T_MAP_NESTED_MAP": "json", + "UP_MAP_NESTED_MAP": "json", + "USER_ID": "string", + "UUID_TS": "datetime" + }, + "receivedAt": "2020-01-24T11:59:02.403+05:30", + "table": "IDENTIFIES" + } + }, + { + "data": { + "CONTEXT_APP_BUILD": "1.0.0", + "CONTEXT_APP_NAME": "RudderLabs JavaScript SDK", + "CONTEXT_APP_NAMESPACE": "com.rudderlabs.javascript", + "CONTEXT_APP_VERSION": "1.1.11", + "CONTEXT_C_MAP_NESTED_MAP": "{\"n1\":\"context nested prop 1\"}", + "CONTEXT_DEVICE_ID": "id", + "CONTEXT_DEVICE_TOKEN": "token", + "CONTEXT_DEVICE_TYPE": "ios", + "CONTEXT_IP": "[::1]:53708", + "CONTEXT_LIBRARY_NAME": "RudderLabs JavaScript SDK", + "CONTEXT_LIBRARY_VERSION": "1.1.11", + "CONTEXT_LOCALE": "en-US", + "CONTEXT_OS_NAME": "android", + "CONTEXT_OS_VERSION": "1.12.3", + "CONTEXT_REQUEST_IP": "[::1]:53708", + "CONTEXT_TRAITS_CT_MAP_NESTED_MAP": "{\"n1\":\"nested prop 1\"}", + "CONTEXT_TRAITS_EMAIL": "user123@email.com", + "CONTEXT_TRAITS_PHONE": "+917836362334", + "CONTEXT_TRAITS_USER_ID": "user123", + "CONTEXT_USER_AGENT": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.16; rv:84.0) Gecko/20100101 Firefox/84.0", + "CT_MAP_NESTED_MAP": "{\"n1\":\"nested prop 1\"}", + "EMAIL": "user123@email.com", + "ID": "user123", + "PHONE": "+917836362334", + "RECEIVED_AT": "2020-01-24T06:29:02.403Z", + "T_MAP_NESTED_MAP": "{\"n1\":\"nested prop 1\"}", + "UP_MAP_NESTED_MAP": "{\"n1\":\"nested prop 1\"}" + }, + "metadata": { + "columns": { + "CONTEXT_APP_BUILD": "string", + "CONTEXT_APP_NAME": "string", + "CONTEXT_APP_NAMESPACE": "string", + "CONTEXT_APP_VERSION": "string", + "CONTEXT_C_MAP_NESTED_MAP": "json", + "CONTEXT_DEVICE_ID": "string", + "CONTEXT_DEVICE_TOKEN": "string", + "CONTEXT_DEVICE_TYPE": "string", + "CONTEXT_IP": "string", + "CONTEXT_LIBRARY_NAME": "string", + "CONTEXT_LIBRARY_VERSION": "string", + "CONTEXT_LOCALE": "string", + "CONTEXT_OS_NAME": "string", + "CONTEXT_OS_VERSION": "string", + "CONTEXT_REQUEST_IP": "string", + "CONTEXT_TRAITS_CT_MAP_NESTED_MAP": "json", + "CONTEXT_TRAITS_EMAIL": "string", + "CONTEXT_TRAITS_PHONE": "string", + "CONTEXT_TRAITS_USER_ID": "string", + "CONTEXT_USER_AGENT": "string", + "CT_MAP_NESTED_MAP": "json", + "EMAIL": "string", + "ID": "string", + "PHONE": "string", + "RECEIVED_AT": "datetime", + "T_MAP_NESTED_MAP": "json", + "UP_MAP_NESTED_MAP": "json", + "UUID_TS": "datetime" + }, + "receivedAt": "2020-01-24T11:59:02.403+05:30", + "table": "USERS" + } + } + ], + } +} diff --git a/test/__tests__/data/warehouse/integrations/jsonpaths/new/pages.js b/test/__tests__/data/warehouse/integrations/jsonpaths/new/pages.js new file mode 100644 index 0000000000..136f355b21 --- /dev/null +++ b/test/__tests__/data/warehouse/integrations/jsonpaths/new/pages.js @@ -0,0 +1,393 @@ +module.exports = { + input: { + destination: { + Config: {} + }, + message: { + anonymousId: "e6ab2c5e-2cda-44a9-a962-e2f67df78bca", + channel: "web", + context: { + app: { + build: "1.0.0", + name: "RudderLabs JavaScript SDK", + namespace: "com.rudderlabs.javascript", + version: "1.0.5" + }, + ip: "0.0.0.0", + library: { + name: "RudderLabs JavaScript SDK", + version: "1.0.5" + }, + ctestMap: { + cnestedMap: { + n1: "context nested prop 1" + } + }, + locale: "en-GB", + 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.117 Safari/537.36" + }, + integrations: { + All: true, + RS: { + options: { + jsonPaths: ["page.properties.testMap.nestedMap", "page.context.ctestMap.cnestedMap"] + } + }, + BQ: { + options: { + jsonPaths: ["page.properties.testMap.nestedMap", "page.context.ctestMap.cnestedMap"] + } + }, + POSTGRES: { + options: { + jsonPaths: ["page.properties.testMap.nestedMap", "page.context.ctestMap.cnestedMap"] + } + }, + SNOWFLAKE: { + options: { + jsonPaths: ["page.properties.testMap.nestedMap", "page.context.ctestMap.cnestedMap"] + } + }, + S3_DATALAKE: { + options: { + skipReservedKeywordsEscaping: true + } + }, + }, + messageId: "a6a0ad5a-bd26-4f19-8f75-38484e580fc7", + originalTimestamp: "2020-01-24T06:29:02.364Z", + properties: { + currency: "USD", + revenue: 50, + testMap: { + nestedMap: { + n1: "nested prop 1" + } + }, + }, + receivedAt: "2020-01-24T11:59:02.403+05:30", + request_ip: "[::1]:53708", + sentAt: "2020-01-24T06:29:02.364Z", + timestamp: "2020-01-24T11:59:02.403+05:30", + type: "page", + userId: "9bb5d4c2-a7aa-4a36-9efb-dd2b1aec5d33" + }, + request: { + query: { + whSchemaVersion: "v1" + } + } + }, + output: { + default: [ + { + "data": { + "anonymous_id": "e6ab2c5e-2cda-44a9-a962-e2f67df78bca", + "channel": "web", + "context_app_build": "1.0.0", + "context_app_name": "RudderLabs JavaScript SDK", + "context_app_namespace": "com.rudderlabs.javascript", + "context_app_version": "1.0.5", + "context_ctest_map_cnested_map_n_1": "context nested prop 1", + "context_ip": "0.0.0.0", + "context_library_name": "RudderLabs JavaScript SDK", + "context_library_version": "1.0.5", + "context_locale": "en-GB", + "context_passed_ip": "0.0.0.0", + "context_request_ip": "[::1]:53708", + "context_screen_density": 2, + "context_user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36", + "currency": "USD", + "id": "a6a0ad5a-bd26-4f19-8f75-38484e580fc7", + "original_timestamp": "2020-01-24T06:29:02.364Z", + "received_at": "2020-01-24T06:29:02.403Z", + "revenue": 50, + "sent_at": "2020-01-24T06:29:02.364Z", + "test_map_nested_map_n_1": "nested prop 1", + "timestamp": "2020-01-24T06:29:02.403Z", + "user_id": "9bb5d4c2-a7aa-4a36-9efb-dd2b1aec5d33" + }, + "metadata": { + "columns": { + "anonymous_id": "string", + "channel": "string", + "context_app_build": "string", + "context_app_name": "string", + "context_app_namespace": "string", + "context_app_version": "string", + "context_ctest_map_cnested_map_n_1": "string", + "context_ip": "string", + "context_library_name": "string", + "context_library_version": "string", + "context_locale": "string", + "context_passed_ip": "string", + "context_request_ip": "string", + "context_screen_density": "int", + "context_user_agent": "string", + "currency": "string", + "id": "string", + "original_timestamp": "datetime", + "received_at": "datetime", + "revenue": "int", + "sent_at": "datetime", + "test_map_nested_map_n_1": "string", + "timestamp": "datetime", + "user_id": "string", + "uuid_ts": "datetime" + }, + "receivedAt": "2020-01-24T11:59:02.403+05:30", + "table": "pages" + } + } + ], + rs: [ + { + "data": { + "anonymous_id": "e6ab2c5e-2cda-44a9-a962-e2f67df78bca", + "channel": "web", + "context_app_build": "1.0.0", + "context_app_name": "RudderLabs JavaScript SDK", + "context_app_namespace": "com.rudderlabs.javascript", + "context_app_version": "1.0.5", + "context_ctest_map_cnested_map": "{\"n1\":\"context nested prop 1\"}", + "context_ip": "0.0.0.0", + "context_library_name": "RudderLabs JavaScript SDK", + "context_library_version": "1.0.5", + "context_locale": "en-GB", + "context_passed_ip": "0.0.0.0", + "context_request_ip": "[::1]:53708", + "context_screen_density": 2, + "context_user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36", + "currency": "USD", + "id": "a6a0ad5a-bd26-4f19-8f75-38484e580fc7", + "original_timestamp": "2020-01-24T06:29:02.364Z", + "received_at": "2020-01-24T06:29:02.403Z", + "revenue": 50, + "sent_at": "2020-01-24T06:29:02.364Z", + "test_map_nested_map": "{\"n1\":\"nested prop 1\"}", + "timestamp": "2020-01-24T06:29:02.403Z", + "user_id": "9bb5d4c2-a7aa-4a36-9efb-dd2b1aec5d33" + }, + "metadata": { + "columns": { + "anonymous_id": "string", + "channel": "string", + "context_app_build": "string", + "context_app_name": "string", + "context_app_namespace": "string", + "context_app_version": "string", + "context_ctest_map_cnested_map": "json", + "context_ip": "string", + "context_library_name": "string", + "context_library_version": "string", + "context_locale": "string", + "context_passed_ip": "string", + "context_request_ip": "string", + "context_screen_density": "int", + "context_user_agent": "string", + "currency": "string", + "id": "string", + "original_timestamp": "datetime", + "received_at": "datetime", + "revenue": "int", + "sent_at": "datetime", + "test_map_nested_map": "json", + "timestamp": "datetime", + "user_id": "string", + "uuid_ts": "datetime" + }, + "receivedAt": "2020-01-24T11:59:02.403+05:30", + "table": "pages" + } + } + ], + bq: [ + { + "data": { + "anonymous_id": "e6ab2c5e-2cda-44a9-a962-e2f67df78bca", + "channel": "web", + "context_app_build": "1.0.0", + "context_app_name": "RudderLabs JavaScript SDK", + "context_app_namespace": "com.rudderlabs.javascript", + "context_app_version": "1.0.5", + "context_ctest_map_cnested_map": "{\"n1\":\"context nested prop 1\"}", + "context_ip": "0.0.0.0", + "context_library_name": "RudderLabs JavaScript SDK", + "context_library_version": "1.0.5", + "context_locale": "en-GB", + "context_passed_ip": "0.0.0.0", + "context_request_ip": "[::1]:53708", + "context_screen_density": 2, + "context_user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36", + "currency": "USD", + "id": "a6a0ad5a-bd26-4f19-8f75-38484e580fc7", + "original_timestamp": "2020-01-24T06:29:02.364Z", + "received_at": "2020-01-24T06:29:02.403Z", + "revenue": 50, + "sent_at": "2020-01-24T06:29:02.364Z", + "test_map_nested_map": "{\"n1\":\"nested prop 1\"}", + "timestamp": "2020-01-24T06:29:02.403Z", + "user_id": "9bb5d4c2-a7aa-4a36-9efb-dd2b1aec5d33" + }, + "metadata": { + "columns": { + "anonymous_id": "string", + "channel": "string", + "context_app_build": "string", + "context_app_name": "string", + "context_app_namespace": "string", + "context_app_version": "string", + "context_ctest_map_cnested_map": "string", + "context_ip": "string", + "context_library_name": "string", + "context_library_version": "string", + "context_locale": "string", + "context_passed_ip": "string", + "context_request_ip": "string", + "context_screen_density": "int", + "context_user_agent": "string", + "currency": "string", + "id": "string", + "loaded_at": "datetime", + "original_timestamp": "datetime", + "received_at": "datetime", + "revenue": "int", + "sent_at": "datetime", + "test_map_nested_map": "string", + "timestamp": "datetime", + "user_id": "string", + "uuid_ts": "datetime" + }, + "receivedAt": "2020-01-24T11:59:02.403+05:30", + "table": "pages" + } + } + ], + postgres: [ + { + "data": { + "anonymous_id": "e6ab2c5e-2cda-44a9-a962-e2f67df78bca", + "channel": "web", + "context_app_build": "1.0.0", + "context_app_name": "RudderLabs JavaScript SDK", + "context_app_namespace": "com.rudderlabs.javascript", + "context_app_version": "1.0.5", + "context_ctest_map_cnested_map": "{\"n1\":\"context nested prop 1\"}", + "context_ip": "0.0.0.0", + "context_library_name": "RudderLabs JavaScript SDK", + "context_library_version": "1.0.5", + "context_locale": "en-GB", + "context_passed_ip": "0.0.0.0", + "context_request_ip": "[::1]:53708", + "context_screen_density": 2, + "context_user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36", + "currency": "USD", + "id": "a6a0ad5a-bd26-4f19-8f75-38484e580fc7", + "original_timestamp": "2020-01-24T06:29:02.364Z", + "received_at": "2020-01-24T06:29:02.403Z", + "revenue": 50, + "sent_at": "2020-01-24T06:29:02.364Z", + "test_map_nested_map": "{\"n1\":\"nested prop 1\"}", + "timestamp": "2020-01-24T06:29:02.403Z", + "user_id": "9bb5d4c2-a7aa-4a36-9efb-dd2b1aec5d33" + }, + "metadata": { + "columns": { + "anonymous_id": "string", + "channel": "string", + "context_app_build": "string", + "context_app_name": "string", + "context_app_namespace": "string", + "context_app_version": "string", + "context_ctest_map_cnested_map": "json", + "context_ip": "string", + "context_library_name": "string", + "context_library_version": "string", + "context_locale": "string", + "context_passed_ip": "string", + "context_request_ip": "string", + "context_screen_density": "int", + "context_user_agent": "string", + "currency": "string", + "id": "string", + "original_timestamp": "datetime", + "received_at": "datetime", + "revenue": "int", + "sent_at": "datetime", + "test_map_nested_map": "json", + "timestamp": "datetime", + "user_id": "string", + "uuid_ts": "datetime" + }, + "receivedAt": "2020-01-24T11:59:02.403+05:30", + "table": "pages" + } + } + ], + snowflake: [ + { + "data": { + "ANONYMOUS_ID": "e6ab2c5e-2cda-44a9-a962-e2f67df78bca", + "CHANNEL": "web", + "CONTEXT_APP_BUILD": "1.0.0", + "CONTEXT_APP_NAME": "RudderLabs JavaScript SDK", + "CONTEXT_APP_NAMESPACE": "com.rudderlabs.javascript", + "CONTEXT_APP_VERSION": "1.0.5", + "CONTEXT_CTEST_MAP_CNESTED_MAP": "{\"n1\":\"context nested prop 1\"}", + "CONTEXT_IP": "0.0.0.0", + "CONTEXT_LIBRARY_NAME": "RudderLabs JavaScript SDK", + "CONTEXT_LIBRARY_VERSION": "1.0.5", + "CONTEXT_LOCALE": "en-GB", + "CONTEXT_PASSED_IP": "0.0.0.0", + "CONTEXT_REQUEST_IP": "[::1]:53708", + "CONTEXT_SCREEN_DENSITY": 2, + "CONTEXT_USER_AGENT": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36", + "CURRENCY": "USD", + "ID": "a6a0ad5a-bd26-4f19-8f75-38484e580fc7", + "ORIGINAL_TIMESTAMP": "2020-01-24T06:29:02.364Z", + "RECEIVED_AT": "2020-01-24T06:29:02.403Z", + "REVENUE": 50, + "SENT_AT": "2020-01-24T06:29:02.364Z", + "TEST_MAP_NESTED_MAP": "{\"n1\":\"nested prop 1\"}", + "TIMESTAMP": "2020-01-24T06:29:02.403Z", + "USER_ID": "9bb5d4c2-a7aa-4a36-9efb-dd2b1aec5d33" + }, + "metadata": { + "columns": { + "ANONYMOUS_ID": "string", + "CHANNEL": "string", + "CONTEXT_APP_BUILD": "string", + "CONTEXT_APP_NAME": "string", + "CONTEXT_APP_NAMESPACE": "string", + "CONTEXT_APP_VERSION": "string", + "CONTEXT_CTEST_MAP_CNESTED_MAP": "json", + "CONTEXT_IP": "string", + "CONTEXT_LIBRARY_NAME": "string", + "CONTEXT_LIBRARY_VERSION": "string", + "CONTEXT_LOCALE": "string", + "CONTEXT_PASSED_IP": "string", + "CONTEXT_REQUEST_IP": "string", + "CONTEXT_SCREEN_DENSITY": "int", + "CONTEXT_USER_AGENT": "string", + "CURRENCY": "string", + "ID": "string", + "ORIGINAL_TIMESTAMP": "datetime", + "RECEIVED_AT": "datetime", + "REVENUE": "int", + "SENT_AT": "datetime", + "TEST_MAP_NESTED_MAP": "json", + "TIMESTAMP": "datetime", + "USER_ID": "string", + "UUID_TS": "datetime" + }, + "receivedAt": "2020-01-24T11:59:02.403+05:30", + "table": "PAGES" + } + } + ], + } +} diff --git a/test/__tests__/data/warehouse/integrations/jsonpaths/new/screens.js b/test/__tests__/data/warehouse/integrations/jsonpaths/new/screens.js new file mode 100644 index 0000000000..b11b311ebb --- /dev/null +++ b/test/__tests__/data/warehouse/integrations/jsonpaths/new/screens.js @@ -0,0 +1,393 @@ +module.exports = { + input: { + destination: { + Config: {} + }, + message: { + anonymousId: "e6ab2c5e-2cda-44a9-a962-e2f67df78bca", + channel: "web", + context: { + app: { + build: "1.0.0", + name: "RudderLabs JavaScript SDK", + namespace: "com.rudderlabs.javascript", + version: "1.0.5" + }, + ip: "0.0.0.0", + library: { + name: "RudderLabs JavaScript SDK", + version: "1.0.5" + }, + ctestMap: { + cnestedMap: { + n1: "context nested prop 1" + } + }, + locale: "en-GB", + 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.117 Safari/537.36" + }, + integrations: { + All: true, + RS: { + options: { + jsonPaths: ["screen.properties.testMap.nestedMap", "screen.context.ctestMap.cnestedMap"] + } + }, + BQ: { + options: { + jsonPaths: ["screen.properties.testMap.nestedMap", "screen.context.ctestMap.cnestedMap"] + } + }, + POSTGRES: { + options: { + jsonPaths: ["screen.properties.testMap.nestedMap", "screen.context.ctestMap.cnestedMap"] + } + }, + SNOWFLAKE: { + options: { + jsonPaths: ["screen.properties.testMap.nestedMap", "screen.context.ctestMap.cnestedMap"] + } + }, + S3_DATALAKE: { + options: { + skipReservedKeywordsEscaping: true + } + }, + }, + messageId: "a6a0ad5a-bd26-4f19-8f75-38484e580fc7", + originalTimestamp: "2020-01-24T06:29:02.364Z", + properties: { + currency: "USD", + revenue: 50, + testMap: { + nestedMap: { + n1: "nested prop 1" + } + }, + }, + receivedAt: "2020-01-24T11:59:02.403+05:30", + request_ip: "[::1]:53708", + sentAt: "2020-01-24T06:29:02.364Z", + timestamp: "2020-01-24T11:59:02.403+05:30", + type: "screen", + userId: "9bb5d4c2-a7aa-4a36-9efb-dd2b1aec5d33" + }, + request: { + query: { + whSchemaVersion: "v1" + } + } + }, + output: { + default: [ + { + "data": { + "anonymous_id": "e6ab2c5e-2cda-44a9-a962-e2f67df78bca", + "channel": "web", + "context_app_build": "1.0.0", + "context_app_name": "RudderLabs JavaScript SDK", + "context_app_namespace": "com.rudderlabs.javascript", + "context_app_version": "1.0.5", + "context_ctest_map_cnested_map_n_1": "context nested prop 1", + "context_ip": "0.0.0.0", + "context_library_name": "RudderLabs JavaScript SDK", + "context_library_version": "1.0.5", + "context_locale": "en-GB", + "context_passed_ip": "0.0.0.0", + "context_request_ip": "[::1]:53708", + "context_screen_density": 2, + "context_user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36", + "currency": "USD", + "id": "a6a0ad5a-bd26-4f19-8f75-38484e580fc7", + "original_timestamp": "2020-01-24T06:29:02.364Z", + "received_at": "2020-01-24T06:29:02.403Z", + "revenue": 50, + "sent_at": "2020-01-24T06:29:02.364Z", + "test_map_nested_map_n_1": "nested prop 1", + "timestamp": "2020-01-24T06:29:02.403Z", + "user_id": "9bb5d4c2-a7aa-4a36-9efb-dd2b1aec5d33" + }, + "metadata": { + "columns": { + "anonymous_id": "string", + "channel": "string", + "context_app_build": "string", + "context_app_name": "string", + "context_app_namespace": "string", + "context_app_version": "string", + "context_ctest_map_cnested_map_n_1": "string", + "context_ip": "string", + "context_library_name": "string", + "context_library_version": "string", + "context_locale": "string", + "context_passed_ip": "string", + "context_request_ip": "string", + "context_screen_density": "int", + "context_user_agent": "string", + "currency": "string", + "id": "string", + "original_timestamp": "datetime", + "received_at": "datetime", + "revenue": "int", + "sent_at": "datetime", + "test_map_nested_map_n_1": "string", + "timestamp": "datetime", + "user_id": "string", + "uuid_ts": "datetime" + }, + "receivedAt": "2020-01-24T11:59:02.403+05:30", + "table": "screens" + } + } + ], + rs: [ + { + "data": { + "anonymous_id": "e6ab2c5e-2cda-44a9-a962-e2f67df78bca", + "channel": "web", + "context_app_build": "1.0.0", + "context_app_name": "RudderLabs JavaScript SDK", + "context_app_namespace": "com.rudderlabs.javascript", + "context_app_version": "1.0.5", + "context_ctest_map_cnested_map": "{\"n1\":\"context nested prop 1\"}", + "context_ip": "0.0.0.0", + "context_library_name": "RudderLabs JavaScript SDK", + "context_library_version": "1.0.5", + "context_locale": "en-GB", + "context_passed_ip": "0.0.0.0", + "context_request_ip": "[::1]:53708", + "context_screen_density": 2, + "context_user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36", + "currency": "USD", + "id": "a6a0ad5a-bd26-4f19-8f75-38484e580fc7", + "original_timestamp": "2020-01-24T06:29:02.364Z", + "received_at": "2020-01-24T06:29:02.403Z", + "revenue": 50, + "sent_at": "2020-01-24T06:29:02.364Z", + "test_map_nested_map": "{\"n1\":\"nested prop 1\"}", + "timestamp": "2020-01-24T06:29:02.403Z", + "user_id": "9bb5d4c2-a7aa-4a36-9efb-dd2b1aec5d33" + }, + "metadata": { + "columns": { + "anonymous_id": "string", + "channel": "string", + "context_app_build": "string", + "context_app_name": "string", + "context_app_namespace": "string", + "context_app_version": "string", + "context_ctest_map_cnested_map": "json", + "context_ip": "string", + "context_library_name": "string", + "context_library_version": "string", + "context_locale": "string", + "context_passed_ip": "string", + "context_request_ip": "string", + "context_screen_density": "int", + "context_user_agent": "string", + "currency": "string", + "id": "string", + "original_timestamp": "datetime", + "received_at": "datetime", + "revenue": "int", + "sent_at": "datetime", + "test_map_nested_map": "json", + "timestamp": "datetime", + "user_id": "string", + "uuid_ts": "datetime" + }, + "receivedAt": "2020-01-24T11:59:02.403+05:30", + "table": "screens" + } + } + ], + bq: [ + { + "data": { + "anonymous_id": "e6ab2c5e-2cda-44a9-a962-e2f67df78bca", + "channel": "web", + "context_app_build": "1.0.0", + "context_app_name": "RudderLabs JavaScript SDK", + "context_app_namespace": "com.rudderlabs.javascript", + "context_app_version": "1.0.5", + "context_ctest_map_cnested_map": "{\"n1\":\"context nested prop 1\"}", + "context_ip": "0.0.0.0", + "context_library_name": "RudderLabs JavaScript SDK", + "context_library_version": "1.0.5", + "context_locale": "en-GB", + "context_passed_ip": "0.0.0.0", + "context_request_ip": "[::1]:53708", + "context_screen_density": 2, + "context_user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36", + "currency": "USD", + "id": "a6a0ad5a-bd26-4f19-8f75-38484e580fc7", + "original_timestamp": "2020-01-24T06:29:02.364Z", + "received_at": "2020-01-24T06:29:02.403Z", + "revenue": 50, + "sent_at": "2020-01-24T06:29:02.364Z", + "test_map_nested_map": "{\"n1\":\"nested prop 1\"}", + "timestamp": "2020-01-24T06:29:02.403Z", + "user_id": "9bb5d4c2-a7aa-4a36-9efb-dd2b1aec5d33" + }, + "metadata": { + "columns": { + "anonymous_id": "string", + "channel": "string", + "context_app_build": "string", + "context_app_name": "string", + "context_app_namespace": "string", + "context_app_version": "string", + "context_ctest_map_cnested_map": "string", + "context_ip": "string", + "context_library_name": "string", + "context_library_version": "string", + "context_locale": "string", + "context_passed_ip": "string", + "context_request_ip": "string", + "context_screen_density": "int", + "context_user_agent": "string", + "currency": "string", + "id": "string", + "loaded_at": "datetime", + "original_timestamp": "datetime", + "received_at": "datetime", + "revenue": "int", + "sent_at": "datetime", + "test_map_nested_map": "string", + "timestamp": "datetime", + "user_id": "string", + "uuid_ts": "datetime" + }, + "receivedAt": "2020-01-24T11:59:02.403+05:30", + "table": "screens" + } + } + ], + postgres: [ + { + "data": { + "anonymous_id": "e6ab2c5e-2cda-44a9-a962-e2f67df78bca", + "channel": "web", + "context_app_build": "1.0.0", + "context_app_name": "RudderLabs JavaScript SDK", + "context_app_namespace": "com.rudderlabs.javascript", + "context_app_version": "1.0.5", + "context_ctest_map_cnested_map": "{\"n1\":\"context nested prop 1\"}", + "context_ip": "0.0.0.0", + "context_library_name": "RudderLabs JavaScript SDK", + "context_library_version": "1.0.5", + "context_locale": "en-GB", + "context_passed_ip": "0.0.0.0", + "context_request_ip": "[::1]:53708", + "context_screen_density": 2, + "context_user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36", + "currency": "USD", + "id": "a6a0ad5a-bd26-4f19-8f75-38484e580fc7", + "original_timestamp": "2020-01-24T06:29:02.364Z", + "received_at": "2020-01-24T06:29:02.403Z", + "revenue": 50, + "sent_at": "2020-01-24T06:29:02.364Z", + "test_map_nested_map": "{\"n1\":\"nested prop 1\"}", + "timestamp": "2020-01-24T06:29:02.403Z", + "user_id": "9bb5d4c2-a7aa-4a36-9efb-dd2b1aec5d33" + }, + "metadata": { + "columns": { + "anonymous_id": "string", + "channel": "string", + "context_app_build": "string", + "context_app_name": "string", + "context_app_namespace": "string", + "context_app_version": "string", + "context_ctest_map_cnested_map": "json", + "context_ip": "string", + "context_library_name": "string", + "context_library_version": "string", + "context_locale": "string", + "context_passed_ip": "string", + "context_request_ip": "string", + "context_screen_density": "int", + "context_user_agent": "string", + "currency": "string", + "id": "string", + "original_timestamp": "datetime", + "received_at": "datetime", + "revenue": "int", + "sent_at": "datetime", + "test_map_nested_map": "json", + "timestamp": "datetime", + "user_id": "string", + "uuid_ts": "datetime" + }, + "receivedAt": "2020-01-24T11:59:02.403+05:30", + "table": "screens" + } + } + ], + snowflake: [ + { + "data": { + "ANONYMOUS_ID": "e6ab2c5e-2cda-44a9-a962-e2f67df78bca", + "CHANNEL": "web", + "CONTEXT_APP_BUILD": "1.0.0", + "CONTEXT_APP_NAME": "RudderLabs JavaScript SDK", + "CONTEXT_APP_NAMESPACE": "com.rudderlabs.javascript", + "CONTEXT_APP_VERSION": "1.0.5", + "CONTEXT_CTEST_MAP_CNESTED_MAP": "{\"n1\":\"context nested prop 1\"}", + "CONTEXT_IP": "0.0.0.0", + "CONTEXT_LIBRARY_NAME": "RudderLabs JavaScript SDK", + "CONTEXT_LIBRARY_VERSION": "1.0.5", + "CONTEXT_LOCALE": "en-GB", + "CONTEXT_PASSED_IP": "0.0.0.0", + "CONTEXT_REQUEST_IP": "[::1]:53708", + "CONTEXT_SCREEN_DENSITY": 2, + "CONTEXT_USER_AGENT": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36", + "CURRENCY": "USD", + "ID": "a6a0ad5a-bd26-4f19-8f75-38484e580fc7", + "ORIGINAL_TIMESTAMP": "2020-01-24T06:29:02.364Z", + "RECEIVED_AT": "2020-01-24T06:29:02.403Z", + "REVENUE": 50, + "SENT_AT": "2020-01-24T06:29:02.364Z", + "TEST_MAP_NESTED_MAP": "{\"n1\":\"nested prop 1\"}", + "TIMESTAMP": "2020-01-24T06:29:02.403Z", + "USER_ID": "9bb5d4c2-a7aa-4a36-9efb-dd2b1aec5d33" + }, + "metadata": { + "columns": { + "ANONYMOUS_ID": "string", + "CHANNEL": "string", + "CONTEXT_APP_BUILD": "string", + "CONTEXT_APP_NAME": "string", + "CONTEXT_APP_NAMESPACE": "string", + "CONTEXT_APP_VERSION": "string", + "CONTEXT_CTEST_MAP_CNESTED_MAP": "json", + "CONTEXT_IP": "string", + "CONTEXT_LIBRARY_NAME": "string", + "CONTEXT_LIBRARY_VERSION": "string", + "CONTEXT_LOCALE": "string", + "CONTEXT_PASSED_IP": "string", + "CONTEXT_REQUEST_IP": "string", + "CONTEXT_SCREEN_DENSITY": "int", + "CONTEXT_USER_AGENT": "string", + "CURRENCY": "string", + "ID": "string", + "ORIGINAL_TIMESTAMP": "datetime", + "RECEIVED_AT": "datetime", + "REVENUE": "int", + "SENT_AT": "datetime", + "TEST_MAP_NESTED_MAP": "json", + "TIMESTAMP": "datetime", + "USER_ID": "string", + "UUID_TS": "datetime" + }, + "receivedAt": "2020-01-24T11:59:02.403+05:30", + "table": "SCREENS" + } + } + ], + } +} diff --git a/test/__tests__/data/warehouse/integrations/jsonpaths/new/tracks.js b/test/__tests__/data/warehouse/integrations/jsonpaths/new/tracks.js new file mode 100644 index 0000000000..7ed95685ff --- /dev/null +++ b/test/__tests__/data/warehouse/integrations/jsonpaths/new/tracks.js @@ -0,0 +1,830 @@ +module.exports = { + input: { + destination: { + Config: {} + }, + message: { + anonymousId: "e6ab2c5e-2cda-44a9-a962-e2f67df78bca", + channel: "web", + context: { + app: { + build: "1.0.0", + name: "RudderLabs JavaScript SDK", + namespace: "com.rudderlabs.javascript", + version: "1.0.5" + }, + ip: "0.0.0.0", + library: { + name: "RudderLabs JavaScript SDK", + version: "1.0.5" + }, + locale: "en-GB", + screen: { + density: 2 + }, + traits: { + city: "Disney", + country: "USA", + email: "mickey@disney.com", + firstname: "Mickey" + }, + CMap: { + nestedMap: { + n1: "context nested prop 1" + } + }, + userAgent: + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36" + }, + event: "Product Added", + integrations: { + All: true, + RS: { + options: { + jsonPaths: [ + "track.userProperties.UPMap.nestedMap", + "track.properties.PMap.nestedMap", + "track.context.CMap.nestedMap", + ] + } + }, + BQ: { + options: { + jsonPaths: [ + "track.userProperties.UPMap.nestedMap", + "track.properties.PMap.nestedMap", + "track.context.CMap.nestedMap", + ] + } + }, + POSTGRES: { + options: { + jsonPaths: [ + "track.userProperties.UPMap.nestedMap", + "track.properties.PMap.nestedMap", + "track.context.CMap.nestedMap", + ] + } + }, + SNOWFLAKE: { + options: { + jsonPaths: [ + "track.userProperties.UPMap.nestedMap", + "track.properties.PMap.nestedMap", + "track.context.CMap.nestedMap", + ] + } + }, + S3_DATALAKE: { + options: { + skipReservedKeywordsEscaping: true + } + }, + }, + messageId: "a6a0ad5a-bd26-4f19-8f75-38484e580fc7", + originalTimestamp: "2020-01-24T06:29:02.364Z", + userProperties: { + email: "test@gmail.com", + UPMap: { + nestedMap: { + n1: "nested prop 1" + } + }, + }, + properties: { + currency: "USD", + revenue: 50, + PMap: { + nestedMap: { + n1: "nested prop 1" + } + }, + }, + receivedAt: "2020-01-24T11:59:02.403+05:30", + request_ip: "[::1]:53708", + sentAt: "2020-01-24T06:29:02.364Z", + timestamp: "2020-01-24T11:59:02.403+05:30", + type: "track", + userId: "9bb5d4c2-a7aa-4a36-9efb-dd2b1aec5d33" + }, + request: { + query: { + whSchemaVersion: "v1" + } + } + }, + output: { + default: [ + { + "data": { + "anonymous_id": "e6ab2c5e-2cda-44a9-a962-e2f67df78bca", + "channel": "web", + "context_app_build": "1.0.0", + "context_app_name": "RudderLabs JavaScript SDK", + "context_app_namespace": "com.rudderlabs.javascript", + "context_app_version": "1.0.5", + "context_c_map_nested_map_n_1": "context nested prop 1", + "context_ip": "0.0.0.0", + "context_library_name": "RudderLabs JavaScript SDK", + "context_library_version": "1.0.5", + "context_locale": "en-GB", + "context_passed_ip": "0.0.0.0", + "context_request_ip": "[::1]:53708", + "context_screen_density": 2, + "context_traits_city": "Disney", + "context_traits_country": "USA", + "context_traits_email": "mickey@disney.com", + "context_traits_firstname": "Mickey", + "context_user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36", + "event": "product_added", + "event_text": "Product Added", + "id": "a6a0ad5a-bd26-4f19-8f75-38484e580fc7", + "original_timestamp": "2020-01-24T06:29:02.364Z", + "received_at": "2020-01-24T06:29:02.403Z", + "sent_at": "2020-01-24T06:29:02.364Z", + "timestamp": "2020-01-24T06:29:02.403Z", + "user_id": "9bb5d4c2-a7aa-4a36-9efb-dd2b1aec5d33" + }, + "metadata": { + "columns": { + "anonymous_id": "string", + "channel": "string", + "context_app_build": "string", + "context_app_name": "string", + "context_app_namespace": "string", + "context_app_version": "string", + "context_c_map_nested_map_n_1": "string", + "context_ip": "string", + "context_library_name": "string", + "context_library_version": "string", + "context_locale": "string", + "context_passed_ip": "string", + "context_request_ip": "string", + "context_screen_density": "int", + "context_traits_city": "string", + "context_traits_country": "string", + "context_traits_email": "string", + "context_traits_firstname": "string", + "context_user_agent": "string", + "event": "string", + "event_text": "string", + "id": "string", + "original_timestamp": "datetime", + "received_at": "datetime", + "sent_at": "datetime", + "timestamp": "datetime", + "user_id": "string", + "uuid_ts": "datetime" + }, + "receivedAt": "2020-01-24T11:59:02.403+05:30", + "table": "tracks" + } + }, + { + "data": { + "anonymous_id": "e6ab2c5e-2cda-44a9-a962-e2f67df78bca", + "channel": "web", + "context_app_build": "1.0.0", + "context_app_name": "RudderLabs JavaScript SDK", + "context_app_namespace": "com.rudderlabs.javascript", + "context_app_version": "1.0.5", + "context_c_map_nested_map_n_1": "context nested prop 1", + "context_ip": "0.0.0.0", + "context_library_name": "RudderLabs JavaScript SDK", + "context_library_version": "1.0.5", + "context_locale": "en-GB", + "context_passed_ip": "0.0.0.0", + "context_request_ip": "[::1]:53708", + "context_screen_density": 2, + "context_traits_city": "Disney", + "context_traits_country": "USA", + "context_traits_email": "mickey@disney.com", + "context_traits_firstname": "Mickey", + "context_user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36", + "currency": "USD", + "email": "test@gmail.com", + "event": "product_added", + "event_text": "Product Added", + "id": "a6a0ad5a-bd26-4f19-8f75-38484e580fc7", + "original_timestamp": "2020-01-24T06:29:02.364Z", + "p_map_nested_map_n_1": "nested prop 1", + "received_at": "2020-01-24T06:29:02.403Z", + "revenue": 50, + "sent_at": "2020-01-24T06:29:02.364Z", + "timestamp": "2020-01-24T06:29:02.403Z", + "up_map_nested_map_n_1": "nested prop 1", + "user_id": "9bb5d4c2-a7aa-4a36-9efb-dd2b1aec5d33" + }, + "metadata": { + "columns": { + "anonymous_id": "string", + "channel": "string", + "context_app_build": "string", + "context_app_name": "string", + "context_app_namespace": "string", + "context_app_version": "string", + "context_c_map_nested_map_n_1": "string", + "context_ip": "string", + "context_library_name": "string", + "context_library_version": "string", + "context_locale": "string", + "context_passed_ip": "string", + "context_request_ip": "string", + "context_screen_density": "int", + "context_traits_city": "string", + "context_traits_country": "string", + "context_traits_email": "string", + "context_traits_firstname": "string", + "context_user_agent": "string", + "currency": "string", + "email": "string", + "event": "string", + "event_text": "string", + "id": "string", + "original_timestamp": "datetime", + "p_map_nested_map_n_1": "string", + "received_at": "datetime", + "revenue": "int", + "sent_at": "datetime", + "timestamp": "datetime", + "up_map_nested_map_n_1": "string", + "user_id": "string", + "uuid_ts": "datetime" + }, + "receivedAt": "2020-01-24T11:59:02.403+05:30", + "table": "product_added" + } + } + ], + rs: [ + { + "data": { + "anonymous_id": "e6ab2c5e-2cda-44a9-a962-e2f67df78bca", + "channel": "web", + "context_app_build": "1.0.0", + "context_app_name": "RudderLabs JavaScript SDK", + "context_app_namespace": "com.rudderlabs.javascript", + "context_app_version": "1.0.5", + "context_c_map_nested_map": "{\"n1\":\"context nested prop 1\"}", + "context_ip": "0.0.0.0", + "context_library_name": "RudderLabs JavaScript SDK", + "context_library_version": "1.0.5", + "context_locale": "en-GB", + "context_passed_ip": "0.0.0.0", + "context_request_ip": "[::1]:53708", + "context_screen_density": 2, + "context_traits_city": "Disney", + "context_traits_country": "USA", + "context_traits_email": "mickey@disney.com", + "context_traits_firstname": "Mickey", + "context_user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36", + "event": "product_added", + "event_text": "Product Added", + "id": "a6a0ad5a-bd26-4f19-8f75-38484e580fc7", + "original_timestamp": "2020-01-24T06:29:02.364Z", + "received_at": "2020-01-24T06:29:02.403Z", + "sent_at": "2020-01-24T06:29:02.364Z", + "timestamp": "2020-01-24T06:29:02.403Z", + "user_id": "9bb5d4c2-a7aa-4a36-9efb-dd2b1aec5d33" + }, + "metadata": { + "columns": { + "anonymous_id": "string", + "channel": "string", + "context_app_build": "string", + "context_app_name": "string", + "context_app_namespace": "string", + "context_app_version": "string", + "context_c_map_nested_map": "json", + "context_ip": "string", + "context_library_name": "string", + "context_library_version": "string", + "context_locale": "string", + "context_passed_ip": "string", + "context_request_ip": "string", + "context_screen_density": "int", + "context_traits_city": "string", + "context_traits_country": "string", + "context_traits_email": "string", + "context_traits_firstname": "string", + "context_user_agent": "string", + "event": "string", + "event_text": "string", + "id": "string", + "original_timestamp": "datetime", + "received_at": "datetime", + "sent_at": "datetime", + "timestamp": "datetime", + "user_id": "string", + "uuid_ts": "datetime" + }, + "receivedAt": "2020-01-24T11:59:02.403+05:30", + "table": "tracks" + } + }, + { + "data": { + "anonymous_id": "e6ab2c5e-2cda-44a9-a962-e2f67df78bca", + "channel": "web", + "context_app_build": "1.0.0", + "context_app_name": "RudderLabs JavaScript SDK", + "context_app_namespace": "com.rudderlabs.javascript", + "context_app_version": "1.0.5", + "context_c_map_nested_map": "{\"n1\":\"context nested prop 1\"}", + "context_ip": "0.0.0.0", + "context_library_name": "RudderLabs JavaScript SDK", + "context_library_version": "1.0.5", + "context_locale": "en-GB", + "context_passed_ip": "0.0.0.0", + "context_request_ip": "[::1]:53708", + "context_screen_density": 2, + "context_traits_city": "Disney", + "context_traits_country": "USA", + "context_traits_email": "mickey@disney.com", + "context_traits_firstname": "Mickey", + "context_user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36", + "currency": "USD", + "email": "test@gmail.com", + "event": "product_added", + "event_text": "Product Added", + "id": "a6a0ad5a-bd26-4f19-8f75-38484e580fc7", + "original_timestamp": "2020-01-24T06:29:02.364Z", + "p_map_nested_map": "{\"n1\":\"nested prop 1\"}", + "received_at": "2020-01-24T06:29:02.403Z", + "revenue": 50, + "sent_at": "2020-01-24T06:29:02.364Z", + "timestamp": "2020-01-24T06:29:02.403Z", + "up_map_nested_map": "{\"n1\":\"nested prop 1\"}", + "user_id": "9bb5d4c2-a7aa-4a36-9efb-dd2b1aec5d33" + }, + "metadata": { + "columns": { + "anonymous_id": "string", + "channel": "string", + "context_app_build": "string", + "context_app_name": "string", + "context_app_namespace": "string", + "context_app_version": "string", + "context_c_map_nested_map": "json", + "context_ip": "string", + "context_library_name": "string", + "context_library_version": "string", + "context_locale": "string", + "context_passed_ip": "string", + "context_request_ip": "string", + "context_screen_density": "int", + "context_traits_city": "string", + "context_traits_country": "string", + "context_traits_email": "string", + "context_traits_firstname": "string", + "context_user_agent": "string", + "currency": "string", + "email": "string", + "event": "string", + "event_text": "string", + "id": "string", + "original_timestamp": "datetime", + "p_map_nested_map": "json", + "received_at": "datetime", + "revenue": "int", + "sent_at": "datetime", + "timestamp": "datetime", + "up_map_nested_map": "json", + "user_id": "string", + "uuid_ts": "datetime" + }, + "receivedAt": "2020-01-24T11:59:02.403+05:30", + "table": "product_added" + } + } + ], + bq: [ + { + "data": { + "anonymous_id": "e6ab2c5e-2cda-44a9-a962-e2f67df78bca", + "channel": "web", + "context_app_build": "1.0.0", + "context_app_name": "RudderLabs JavaScript SDK", + "context_app_namespace": "com.rudderlabs.javascript", + "context_app_version": "1.0.5", + "context_c_map_nested_map": "{\"n1\":\"context nested prop 1\"}", + "context_ip": "0.0.0.0", + "context_library_name": "RudderLabs JavaScript SDK", + "context_library_version": "1.0.5", + "context_locale": "en-GB", + "context_passed_ip": "0.0.0.0", + "context_request_ip": "[::1]:53708", + "context_screen_density": 2, + "context_traits_city": "Disney", + "context_traits_country": "USA", + "context_traits_email": "mickey@disney.com", + "context_traits_firstname": "Mickey", + "context_user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36", + "event": "product_added", + "event_text": "Product Added", + "id": "a6a0ad5a-bd26-4f19-8f75-38484e580fc7", + "original_timestamp": "2020-01-24T06:29:02.364Z", + "received_at": "2020-01-24T06:29:02.403Z", + "sent_at": "2020-01-24T06:29:02.364Z", + "timestamp": "2020-01-24T06:29:02.403Z", + "user_id": "9bb5d4c2-a7aa-4a36-9efb-dd2b1aec5d33" + }, + "metadata": { + "columns": { + "anonymous_id": "string", + "channel": "string", + "context_app_build": "string", + "context_app_name": "string", + "context_app_namespace": "string", + "context_app_version": "string", + "context_c_map_nested_map": "string", + "context_ip": "string", + "context_library_name": "string", + "context_library_version": "string", + "context_locale": "string", + "context_passed_ip": "string", + "context_request_ip": "string", + "context_screen_density": "int", + "context_traits_city": "string", + "context_traits_country": "string", + "context_traits_email": "string", + "context_traits_firstname": "string", + "context_user_agent": "string", + "event": "string", + "event_text": "string", + "id": "string", + "loaded_at": "datetime", + "original_timestamp": "datetime", + "received_at": "datetime", + "sent_at": "datetime", + "timestamp": "datetime", + "user_id": "string", + "uuid_ts": "datetime" + }, + "receivedAt": "2020-01-24T11:59:02.403+05:30", + "table": "tracks" + } + }, + { + "data": { + "anonymous_id": "e6ab2c5e-2cda-44a9-a962-e2f67df78bca", + "channel": "web", + "context_app_build": "1.0.0", + "context_app_name": "RudderLabs JavaScript SDK", + "context_app_namespace": "com.rudderlabs.javascript", + "context_app_version": "1.0.5", + "context_c_map_nested_map": "{\"n1\":\"context nested prop 1\"}", + "context_ip": "0.0.0.0", + "context_library_name": "RudderLabs JavaScript SDK", + "context_library_version": "1.0.5", + "context_locale": "en-GB", + "context_passed_ip": "0.0.0.0", + "context_request_ip": "[::1]:53708", + "context_screen_density": 2, + "context_traits_city": "Disney", + "context_traits_country": "USA", + "context_traits_email": "mickey@disney.com", + "context_traits_firstname": "Mickey", + "context_user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36", + "currency": "USD", + "email": "test@gmail.com", + "event": "product_added", + "event_text": "Product Added", + "id": "a6a0ad5a-bd26-4f19-8f75-38484e580fc7", + "original_timestamp": "2020-01-24T06:29:02.364Z", + "p_map_nested_map": "{\"n1\":\"nested prop 1\"}", + "received_at": "2020-01-24T06:29:02.403Z", + "revenue": 50, + "sent_at": "2020-01-24T06:29:02.364Z", + "timestamp": "2020-01-24T06:29:02.403Z", + "up_map_nested_map": "{\"n1\":\"nested prop 1\"}", + "user_id": "9bb5d4c2-a7aa-4a36-9efb-dd2b1aec5d33" + }, + "metadata": { + "columns": { + "anonymous_id": "string", + "channel": "string", + "context_app_build": "string", + "context_app_name": "string", + "context_app_namespace": "string", + "context_app_version": "string", + "context_c_map_nested_map": "string", + "context_ip": "string", + "context_library_name": "string", + "context_library_version": "string", + "context_locale": "string", + "context_passed_ip": "string", + "context_request_ip": "string", + "context_screen_density": "int", + "context_traits_city": "string", + "context_traits_country": "string", + "context_traits_email": "string", + "context_traits_firstname": "string", + "context_user_agent": "string", + "currency": "string", + "email": "string", + "event": "string", + "event_text": "string", + "id": "string", + "loaded_at": "datetime", + "original_timestamp": "datetime", + "p_map_nested_map": "string", + "received_at": "datetime", + "revenue": "int", + "sent_at": "datetime", + "timestamp": "datetime", + "up_map_nested_map": "string", + "user_id": "string", + "uuid_ts": "datetime" + }, + "receivedAt": "2020-01-24T11:59:02.403+05:30", + "table": "product_added" + } + } + ], + postgres: [ + { + "data": { + "anonymous_id": "e6ab2c5e-2cda-44a9-a962-e2f67df78bca", + "channel": "web", + "context_app_build": "1.0.0", + "context_app_name": "RudderLabs JavaScript SDK", + "context_app_namespace": "com.rudderlabs.javascript", + "context_app_version": "1.0.5", + "context_c_map_nested_map": "{\"n1\":\"context nested prop 1\"}", + "context_ip": "0.0.0.0", + "context_library_name": "RudderLabs JavaScript SDK", + "context_library_version": "1.0.5", + "context_locale": "en-GB", + "context_passed_ip": "0.0.0.0", + "context_request_ip": "[::1]:53708", + "context_screen_density": 2, + "context_traits_city": "Disney", + "context_traits_country": "USA", + "context_traits_email": "mickey@disney.com", + "context_traits_firstname": "Mickey", + "context_user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36", + "event": "product_added", + "event_text": "Product Added", + "id": "a6a0ad5a-bd26-4f19-8f75-38484e580fc7", + "original_timestamp": "2020-01-24T06:29:02.364Z", + "received_at": "2020-01-24T06:29:02.403Z", + "sent_at": "2020-01-24T06:29:02.364Z", + "timestamp": "2020-01-24T06:29:02.403Z", + "user_id": "9bb5d4c2-a7aa-4a36-9efb-dd2b1aec5d33" + }, + "metadata": { + "columns": { + "anonymous_id": "string", + "channel": "string", + "context_app_build": "string", + "context_app_name": "string", + "context_app_namespace": "string", + "context_app_version": "string", + "context_c_map_nested_map": "json", + "context_ip": "string", + "context_library_name": "string", + "context_library_version": "string", + "context_locale": "string", + "context_passed_ip": "string", + "context_request_ip": "string", + "context_screen_density": "int", + "context_traits_city": "string", + "context_traits_country": "string", + "context_traits_email": "string", + "context_traits_firstname": "string", + "context_user_agent": "string", + "event": "string", + "event_text": "string", + "id": "string", + "original_timestamp": "datetime", + "received_at": "datetime", + "sent_at": "datetime", + "timestamp": "datetime", + "user_id": "string", + "uuid_ts": "datetime" + }, + "receivedAt": "2020-01-24T11:59:02.403+05:30", + "table": "tracks" + } + }, + { + "data": { + "anonymous_id": "e6ab2c5e-2cda-44a9-a962-e2f67df78bca", + "channel": "web", + "context_app_build": "1.0.0", + "context_app_name": "RudderLabs JavaScript SDK", + "context_app_namespace": "com.rudderlabs.javascript", + "context_app_version": "1.0.5", + "context_c_map_nested_map": "{\"n1\":\"context nested prop 1\"}", + "context_ip": "0.0.0.0", + "context_library_name": "RudderLabs JavaScript SDK", + "context_library_version": "1.0.5", + "context_locale": "en-GB", + "context_passed_ip": "0.0.0.0", + "context_request_ip": "[::1]:53708", + "context_screen_density": 2, + "context_traits_city": "Disney", + "context_traits_country": "USA", + "context_traits_email": "mickey@disney.com", + "context_traits_firstname": "Mickey", + "context_user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36", + "currency": "USD", + "email": "test@gmail.com", + "event": "product_added", + "event_text": "Product Added", + "id": "a6a0ad5a-bd26-4f19-8f75-38484e580fc7", + "original_timestamp": "2020-01-24T06:29:02.364Z", + "p_map_nested_map": "{\"n1\":\"nested prop 1\"}", + "received_at": "2020-01-24T06:29:02.403Z", + "revenue": 50, + "sent_at": "2020-01-24T06:29:02.364Z", + "timestamp": "2020-01-24T06:29:02.403Z", + "up_map_nested_map": "{\"n1\":\"nested prop 1\"}", + "user_id": "9bb5d4c2-a7aa-4a36-9efb-dd2b1aec5d33" + }, + "metadata": { + "columns": { + "anonymous_id": "string", + "channel": "string", + "context_app_build": "string", + "context_app_name": "string", + "context_app_namespace": "string", + "context_app_version": "string", + "context_c_map_nested_map": "json", + "context_ip": "string", + "context_library_name": "string", + "context_library_version": "string", + "context_locale": "string", + "context_passed_ip": "string", + "context_request_ip": "string", + "context_screen_density": "int", + "context_traits_city": "string", + "context_traits_country": "string", + "context_traits_email": "string", + "context_traits_firstname": "string", + "context_user_agent": "string", + "currency": "string", + "email": "string", + "event": "string", + "event_text": "string", + "id": "string", + "original_timestamp": "datetime", + "p_map_nested_map": "json", + "received_at": "datetime", + "revenue": "int", + "sent_at": "datetime", + "timestamp": "datetime", + "up_map_nested_map": "json", + "user_id": "string", + "uuid_ts": "datetime" + }, + "receivedAt": "2020-01-24T11:59:02.403+05:30", + "table": "product_added" + } + } + ], + snowflake: [ + { + "data": { + "ANONYMOUS_ID": "e6ab2c5e-2cda-44a9-a962-e2f67df78bca", + "CHANNEL": "web", + "CONTEXT_APP_BUILD": "1.0.0", + "CONTEXT_APP_NAME": "RudderLabs JavaScript SDK", + "CONTEXT_APP_NAMESPACE": "com.rudderlabs.javascript", + "CONTEXT_APP_VERSION": "1.0.5", + "CONTEXT_C_MAP_NESTED_MAP": "{\"n1\":\"context nested prop 1\"}", + "CONTEXT_IP": "0.0.0.0", + "CONTEXT_LIBRARY_NAME": "RudderLabs JavaScript SDK", + "CONTEXT_LIBRARY_VERSION": "1.0.5", + "CONTEXT_LOCALE": "en-GB", + "CONTEXT_PASSED_IP": "0.0.0.0", + "CONTEXT_REQUEST_IP": "[::1]:53708", + "CONTEXT_SCREEN_DENSITY": 2, + "CONTEXT_TRAITS_CITY": "Disney", + "CONTEXT_TRAITS_COUNTRY": "USA", + "CONTEXT_TRAITS_EMAIL": "mickey@disney.com", + "CONTEXT_TRAITS_FIRSTNAME": "Mickey", + "CONTEXT_USER_AGENT": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36", + "EVENT": "product_added", + "EVENT_TEXT": "Product Added", + "ID": "a6a0ad5a-bd26-4f19-8f75-38484e580fc7", + "ORIGINAL_TIMESTAMP": "2020-01-24T06:29:02.364Z", + "RECEIVED_AT": "2020-01-24T06:29:02.403Z", + "SENT_AT": "2020-01-24T06:29:02.364Z", + "TIMESTAMP": "2020-01-24T06:29:02.403Z", + "USER_ID": "9bb5d4c2-a7aa-4a36-9efb-dd2b1aec5d33" + }, + "metadata": { + "columns": { + "ANONYMOUS_ID": "string", + "CHANNEL": "string", + "CONTEXT_APP_BUILD": "string", + "CONTEXT_APP_NAME": "string", + "CONTEXT_APP_NAMESPACE": "string", + "CONTEXT_APP_VERSION": "string", + "CONTEXT_C_MAP_NESTED_MAP": "json", + "CONTEXT_IP": "string", + "CONTEXT_LIBRARY_NAME": "string", + "CONTEXT_LIBRARY_VERSION": "string", + "CONTEXT_LOCALE": "string", + "CONTEXT_PASSED_IP": "string", + "CONTEXT_REQUEST_IP": "string", + "CONTEXT_SCREEN_DENSITY": "int", + "CONTEXT_TRAITS_CITY": "string", + "CONTEXT_TRAITS_COUNTRY": "string", + "CONTEXT_TRAITS_EMAIL": "string", + "CONTEXT_TRAITS_FIRSTNAME": "string", + "CONTEXT_USER_AGENT": "string", + "EVENT": "string", + "EVENT_TEXT": "string", + "ID": "string", + "ORIGINAL_TIMESTAMP": "datetime", + "RECEIVED_AT": "datetime", + "SENT_AT": "datetime", + "TIMESTAMP": "datetime", + "USER_ID": "string", + "UUID_TS": "datetime" + }, + "receivedAt": "2020-01-24T11:59:02.403+05:30", + "table": "TRACKS" + } + }, + { + "data": { + "ANONYMOUS_ID": "e6ab2c5e-2cda-44a9-a962-e2f67df78bca", + "CHANNEL": "web", + "CONTEXT_APP_BUILD": "1.0.0", + "CONTEXT_APP_NAME": "RudderLabs JavaScript SDK", + "CONTEXT_APP_NAMESPACE": "com.rudderlabs.javascript", + "CONTEXT_APP_VERSION": "1.0.5", + "CONTEXT_C_MAP_NESTED_MAP": "{\"n1\":\"context nested prop 1\"}", + "CONTEXT_IP": "0.0.0.0", + "CONTEXT_LIBRARY_NAME": "RudderLabs JavaScript SDK", + "CONTEXT_LIBRARY_VERSION": "1.0.5", + "CONTEXT_LOCALE": "en-GB", + "CONTEXT_PASSED_IP": "0.0.0.0", + "CONTEXT_REQUEST_IP": "[::1]:53708", + "CONTEXT_SCREEN_DENSITY": 2, + "CONTEXT_TRAITS_CITY": "Disney", + "CONTEXT_TRAITS_COUNTRY": "USA", + "CONTEXT_TRAITS_EMAIL": "mickey@disney.com", + "CONTEXT_TRAITS_FIRSTNAME": "Mickey", + "CONTEXT_USER_AGENT": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36", + "CURRENCY": "USD", + "EMAIL": "test@gmail.com", + "EVENT": "product_added", + "EVENT_TEXT": "Product Added", + "ID": "a6a0ad5a-bd26-4f19-8f75-38484e580fc7", + "ORIGINAL_TIMESTAMP": "2020-01-24T06:29:02.364Z", + "P_MAP_NESTED_MAP": "{\"n1\":\"nested prop 1\"}", + "RECEIVED_AT": "2020-01-24T06:29:02.403Z", + "REVENUE": 50, + "SENT_AT": "2020-01-24T06:29:02.364Z", + "TIMESTAMP": "2020-01-24T06:29:02.403Z", + "UP_MAP_NESTED_MAP": "{\"n1\":\"nested prop 1\"}", + "USER_ID": "9bb5d4c2-a7aa-4a36-9efb-dd2b1aec5d33" + }, + "metadata": { + "columns": { + "ANONYMOUS_ID": "string", + "CHANNEL": "string", + "CONTEXT_APP_BUILD": "string", + "CONTEXT_APP_NAME": "string", + "CONTEXT_APP_NAMESPACE": "string", + "CONTEXT_APP_VERSION": "string", + "CONTEXT_C_MAP_NESTED_MAP": "json", + "CONTEXT_IP": "string", + "CONTEXT_LIBRARY_NAME": "string", + "CONTEXT_LIBRARY_VERSION": "string", + "CONTEXT_LOCALE": "string", + "CONTEXT_PASSED_IP": "string", + "CONTEXT_REQUEST_IP": "string", + "CONTEXT_SCREEN_DENSITY": "int", + "CONTEXT_TRAITS_CITY": "string", + "CONTEXT_TRAITS_COUNTRY": "string", + "CONTEXT_TRAITS_EMAIL": "string", + "CONTEXT_TRAITS_FIRSTNAME": "string", + "CONTEXT_USER_AGENT": "string", + "CURRENCY": "string", + "EMAIL": "string", + "EVENT": "string", + "EVENT_TEXT": "string", + "ID": "string", + "ORIGINAL_TIMESTAMP": "datetime", + "P_MAP_NESTED_MAP": "json", + "RECEIVED_AT": "datetime", + "REVENUE": "int", + "SENT_AT": "datetime", + "TIMESTAMP": "datetime", + "UP_MAP_NESTED_MAP": "json", + "USER_ID": "string", + "UUID_TS": "datetime" + }, + "receivedAt": "2020-01-24T11:59:02.403+05:30", + "table": "PRODUCT_ADDED" + } + } + ] + } +} diff --git a/test/__tests__/flatten_events.test.js b/test/__tests__/flatten_events.test.js index 2e3f142aca..502140bccd 100644 --- a/test/__tests__/flatten_events.test.js +++ b/test/__tests__/flatten_events.test.js @@ -9,7 +9,7 @@ Key aspects covered: 2. Coud source event - same as above for nested property under level 3 - Above level 3 are stringified and considered as string type - 3. Introducing jsonKeys for BQ, PG, RS, SF + 3. Introducing jsonLegacyPathKeys for BQ, PG, RS, SF - data types: int, float, string, json - number, string, array, objects fit under json data type, value is json stringified - in BQ, json type is just a string data type @@ -83,8 +83,8 @@ describe("Flatten event properties", () => { expect(columnTypes).toEqual(expected.columnTypes); }); - it("Should stringify properties of sample event if jsonKeys are present", () => { - options.jsonKeys = { + it("Should stringify properties of sample event if jsonLegacyPathKeys are present", () => { + options.jsonLegacyPathKeys = { arrayProp: 0, objectProp_firstLevelMap_secondLevelMap: 2 }; @@ -98,14 +98,14 @@ describe("Flatten event properties", () => { columnTypes, options ); - delete options.jsonKeys; + delete options.jsonLegacyPathKeys; const expected = fOutput("json_key_event", integrations[index]); expect(output).toEqual(expected.output); expect(columnTypes).toEqual(expected.columnTypes); }); - it("Should stringify properties of sample event and jsonKeys has more priority than cloud source at level 3", () => { - options.jsonKeys = { + it("Should stringify properties of sample event and jsonLegacyPathKeys has more priority than cloud source at level 3", () => { + options.jsonLegacyPathKeys = { objectProp_firstLevelMap_secondLevelMap_thirdLevelMap: 3 }; options.sourceCategory = "cloud"; @@ -119,15 +119,15 @@ describe("Flatten event properties", () => { columnTypes, options ); - delete options.jsonKeys; + delete options.jsonLegacyPathKeys; delete options.sourceCategory; const expected = fOutput("json_key_cloud_event", integrations[index]); expect(output).toEqual(expected.output); expect(columnTypes).toEqual(expected.columnTypes); }); - it("Should stringify properties of nested event and jsonKeys is not applied for cloud source at level > 3", () => { - options.jsonKeys = { + it("Should stringify properties of nested event and jsonLegacyPathKeys is not applied for cloud source at level > 3", () => { + options.jsonLegacyPathKeys = { objectProp_firstLevelMap_secondLevelMap_thirdLevelMap_fourthLevelMap: 4, arrayProp: 0 }; @@ -142,15 +142,15 @@ describe("Flatten event properties", () => { columnTypes, options ); - delete options.jsonKeys; + delete options.jsonLegacyPathKeys; delete options.sourceCategory; const expected = fOutput("cloud_json_key_event", integrations[index]); expect(output).toEqual(expected.output); expect(columnTypes).toEqual(expected.columnTypes); }); - it("Should flatten all properties of sample event and jsonkeys is not applicable other than track events", () => { - options.jsonKeys = { arrayProp: 0 }; + it("Should flatten all properties of sample event and jsonLegacyPathKeys is not applicable other than track events", () => { + options.jsonLegacyPathKeys = { arrayProp: 0 }; const output = {}; const columnTypes = {}; setDataFromInputAndComputeColumnTypes( @@ -161,19 +161,19 @@ describe("Flatten event properties", () => { columnTypes, options ); - delete options.jsonKeys; + delete options.jsonLegacyPathKeys; // Will be same as flattening all properties const expected = fOutput("sample_event", integrations[index]); expect(output).toEqual(expected.output); expect(columnTypes).toEqual(expected.columnTypes); }); - it("Should flatten all properties of sample event and declared jsonKeys get stringified primitive values", () => { + it("Should flatten all properties of sample event and declared jsonLegacyPathKeys get stringified primitive values", () => { i.dateProp = "2022-01-01T00:00:00.000Z"; i.objectProp.firstLevelDateProp = "2022-01-01T01:01:01.111Z"; i.objectProp.firstLevelMap.secondLevelDateProp = "2022-01-01T02:02:02.222Z"; - options.jsonKeys = { + options.jsonLegacyPathKeys = { nullProp: 0, blankProp: 0, floatProp: 0, @@ -195,7 +195,7 @@ describe("Flatten event properties", () => { columnTypes, options ); - delete options.jsonKeys; + delete options.jsonLegacyPathKeys; delete i.dateProp; delete i.objectProp.firstLevelDateProp; delete i.objectProp.firstLevelMap.secondLevelDateProp; @@ -204,12 +204,12 @@ describe("Flatten event properties", () => { expect(columnTypes).toEqual(expected.columnTypes); }); - it("Should ignore rudder reserved columns even though they are set as jsonKeys", () => { + it("Should ignore rudder reserved columns even though they are set as jsonLegacyPathKeys", () => { // setting two reserved columns as map i.anonymous_id = "ignored column"; i.timestamp = "ignored column"; // setting reserved colum paths as json keys - options.jsonKeys = { anonymous_id: 0, timestamp: 0 }; + options.jsonLegacyPathKeys = { anonymous_id: 0, timestamp: 0 }; const output = {}; const columnTypes = {}; setDataFromInputAndComputeColumnTypes( @@ -220,19 +220,19 @@ describe("Flatten event properties", () => { columnTypes, options ); - delete options.jsonKeys; + delete options.jsonLegacyPathKeys; // Will be same as flattening all properties with reserved columns being ignored const expected = fOutput("sample_event", integrations[index]); expect(output).toEqual(expected.output); expect(columnTypes).toEqual(expected.columnTypes); }); - it("Should apply escaping on WH reserved columns even though they are set as jsonKeys", () => { + it("Should apply escaping on WH reserved columns even though they are set as jsonLegacyPathKeys", () => { // setting two reserved columns as map i.between = "escaped column"; i.as = "escaped column"; // setting reserved colum paths as json keys - options.jsonKeys = { between: 0, as: 0 }; + options.jsonLegacyPathKeys = { between: 0, as: 0 }; const output = {}; const columnTypes = {}; setDataFromInputAndComputeColumnTypes( @@ -243,7 +243,7 @@ describe("Flatten event properties", () => { columnTypes, options ); - delete options.jsonKeys; + delete options.jsonLegacyPathKeys; // Escaping is applied as usual for json keys too const expected = fOutput("escape_event", integrations[index]); expect(output).toEqual(expected.output); diff --git a/test/__tests__/fullstory-cdk.test.ts b/test/__tests__/fullstory-cdk.test.ts new file mode 100644 index 0000000000..f7e0491aac --- /dev/null +++ b/test/__tests__/fullstory-cdk.test.ts @@ -0,0 +1,32 @@ +import fs from 'fs'; +import path from 'path'; +import { processCdkV2Workflow } from '../../src/cdk/v2/handler'; +import tags from '../../src/v0/util/tags'; + +const integration = 'fullstory'; +const destName = 'Fullstory'; + +// Processor Test files +const testDataFile = fs.readFileSync(path.resolve(__dirname, `./data/${integration}.json`), { + encoding: 'utf8', +}); +const testData = JSON.parse(testDataFile); + +describe(`${destName} Tests`, () => { + describe('Processor Tests', () => { + testData.forEach((dataPoint, index) => { + it(`${destName} - payload: ${index}`, async () => { + try { + const output = await processCdkV2Workflow( + integration, + dataPoint.input, + tags.FEATURES.PROCESSOR, + ); + expect(output).toEqual(dataPoint.output); + } catch (error: any) { + expect(error.message).toEqual(dataPoint.output.error); + } + }); + }); + }); +}); diff --git a/test/__tests__/google_adwords_offline_conversions.test.js b/test/__tests__/google_adwords_offline_conversions.test.js index d1edec7b58..b08b6de968 100644 --- a/test/__tests__/google_adwords_offline_conversions.test.js +++ b/test/__tests__/google_adwords_offline_conversions.test.js @@ -45,7 +45,7 @@ axios.mockImplementation(async config => { // httpSend() -> inside ProxyRequest for google_adwords_offline if ( config.url.includes( - "https://googleads.googleapis.com/v13/customers/1234567891:uploadClickConversions" + "https://googleads.googleapis.com/v14/customers/1234567891:uploadClickConversions" ) ) { return { @@ -74,7 +74,7 @@ axios.post = jest.fn(async (url, data, reqConfig) => { // This mocking is for calls that make use of httpPOST() if ( url.includes( - "https://googleads.googleapis.com/v13/customers/1234567891/googleAds:searchStream" + "https://googleads.googleapis.com/v14/customers/1234567891/googleAds:searchStream" ) ) { // this is for true case @@ -126,7 +126,7 @@ axios.post = jest.fn(async (url, data, reqConfig) => { } } else if ( url.includes( - "https://googleads.googleapis.com/v13/customers/1234567890/googleAds:searchStream" + "https://googleads.googleapis.com/v14/customers/1234567890/googleAds:searchStream" ) ) { // this case is for refresh token expire @@ -145,12 +145,12 @@ axios.post = jest.fn(async (url, data, reqConfig) => { }; } else if ( url.includes( - "https://googleads.googleapis.com/v13/customers/1112223333/googleAds:searchStream" + "https://googleads.googleapis.com/v14/customers/1112223333/googleAds:searchStream" ) || url.includes( - "https://googleads.googleapis.com/v13/customers/111-222-3333/googleAds:searchStream" + "https://googleads.googleapis.com/v14/customers/111-222-3333/googleAds:searchStream" ) || url.includes( - "https://googleads.googleapis.com/v13/customers/customer-id/googleAds:searchStream" + "https://googleads.googleapis.com/v14/customers/customer-id/googleAds:searchStream" ) ) { // this is for store case diff --git a/test/__tests__/launchdarkly_audience-cdk.test.ts b/test/__tests__/launchdarkly_audience-cdk.test.ts new file mode 100644 index 0000000000..419b59fbd1 --- /dev/null +++ b/test/__tests__/launchdarkly_audience-cdk.test.ts @@ -0,0 +1,42 @@ +import fs from 'fs'; +import path from 'path'; +import { processCdkV2Workflow } from '../../src/cdk/v2/handler'; +import tags from '../../src/v0/util/tags'; + +const integration = 'launchdarkly_audience'; +const destName = 'LaunchDarkly Audience'; + +// Processor Test files +const testDataFile = fs.readFileSync(path.resolve(__dirname, `./data/${integration}.json`), { + encoding: 'utf8', +}); +const testData = JSON.parse(testDataFile); + +jest.mock(`../../src/cdk/v2/destinations/launchdarkly_audience/config`, () => { + const originalConfig = jest.requireActual( + `../../src/cdk/v2/destinations/launchdarkly_audience/config`, + ); + return { + ...originalConfig, + MAX_IDENTIFIERS: 2, + }; +}); + +describe(`${destName} Tests`, () => { + describe('Processor Tests', () => { + testData.forEach((dataPoint, index) => { + it(`${destName} - payload: ${index}`, async () => { + try { + const output = await processCdkV2Workflow( + integration, + dataPoint.input, + tags.FEATURES.PROCESSOR, + ); + expect(output).toEqual(dataPoint.output); + } catch (error: any) { + expect(error.message).toEqual(dataPoint.output.error); + } + }); + }); + }); +}); diff --git a/test/__tests__/slack.test.js b/test/__tests__/slack.test.js index c2b5b91ede..eec0f4054f 100644 --- a/test/__tests__/slack.test.js +++ b/test/__tests__/slack.test.js @@ -29,7 +29,7 @@ const inputRouterData = JSON.parse(inputRouterDataFile); const expectedRouterData = JSON.parse(outputRouterDataFile); inputData.forEach((input, index) => { - test(`${name} Tests - payload: %{index}`, () => { + test(`${name} Tests - payload: ${index}`, () => { try { const output = transformer.process(input); expect(output).toEqual([expectedData[index]]); diff --git a/test/__tests__/user_transformation_fetch.test.js b/test/__tests__/user_transformation_fetch.test.js index d5849639d7..e37b42ea1e 100644 --- a/test/__tests__/user_transformation_fetch.test.js +++ b/test/__tests__/user_transformation_fetch.test.js @@ -4,8 +4,7 @@ jest.mock("dns", () => { promises: { Resolver: function() { return { - resolve: mockResolver, - setServers: () => {}, + resolve4: mockResolver, }; } } @@ -121,7 +120,7 @@ describe("User transformation fetch tests", () => { } ` }; - const errMsg = "localhost requests are not allowed"; + const errMsg = "invalid url, localhost requests are not allowed"; const output = await userTransformHandler(inputData, versionId, [], trRevCode, true); @@ -278,7 +277,7 @@ describe("User transformation fetch tests", () => { } ` }; - const errMsg = "localhost requests are not allowed"; + const errMsg = "invalid url, localhost requests are not allowed"; const output = await userTransformHandler(inputData, versionId, [], trRevCode, true); diff --git a/test/__tests__/warehouse.test.js b/test/__tests__/warehouse.test.js index 6d8b490208..045bab35a6 100644 --- a/test/__tests__/warehouse.test.js +++ b/test/__tests__/warehouse.test.js @@ -30,7 +30,10 @@ const integrations = [ "snowflake", "mssql", "azure_synapse", - "s3_datalake" + "deltalake", + "azure_datalake", + "s3_datalake", + "gcs_datalake", ]; const transformers = integrations.map(integration => require(`../../src/${version}/destinations/${integration}/transform`) @@ -229,7 +232,7 @@ describe("column & table names", () => { ); return; } - if (integrations[index] === "s3_datalake") { + if (integrations[index] === "s3_datalake" || integrations[index] === "gcs_datalake" || integrations[index] === "azure_datalake") { expect(received[1].metadata).toHaveProperty( "table", "a_1_a_2_a_3_a_4_a_5_b_1_b_2_b_3_b_4_b_5_c_1_c_2_c_3_c_4_c_5_d_1_d_2_d_3_d_4_d_5_e_1_e_2_e_3_e_4_e_5_f_1_f_2_f_3_f_4_f_5_g_1_g_2_g_3_g_4_g_5" @@ -943,7 +946,7 @@ describe("Handle no of columns in an event", () => { it("should throw an error if no of columns are more than 200", () => { const i = input("track"); transformers - .filter((transformer, index) => integrations[index] !== "s3_datalake") + .filter((transformer, index) => integrations[index] !== "s3_datalake" && integrations[index] !== "gcs_datalake" && integrations[index] !== "azure_datalake") .forEach((transformer, index) => { i.message.properties = largeNoOfColumnsevent; expect(() => transformer.process(i)).toThrow( @@ -1009,7 +1012,7 @@ describe("Integration options", () => { it("should generate two events for every track call", () => { const i = opInput("track"); transformers.forEach((transformer, index) => { - const { jsonPaths } = i.destination.Config; + const {jsonPaths} = i.destination.Config; if (integrations[index] === "postgres") { delete i.destination.Config.jsonPaths; } @@ -1019,6 +1022,7 @@ describe("Integration options", () => { }); }); }); + describe("users", () => { it("should skip users when skipUsersTable is set", () => { const i = opInput("users"); @@ -1028,6 +1032,65 @@ describe("Integration options", () => { }); }); }); + + describe("json paths", () => { + const output = (config, provider) => { + switch (provider) { + case "rs": + return _.cloneDeep(config.output.rs); + case "bq": + return _.cloneDeep(config.output.bq); + case "postgres": + return _.cloneDeep(config.output.postgres); + case "snowflake": + return _.cloneDeep(config.output.snowflake); + default: + return _.cloneDeep(config.output.default); + } + } + + const testCases = [ + { + eventType: "aliases", + }, + { + eventType: "groups", + }, + { + eventType: "identifies", + }, + { + eventType: "pages", + }, + { + eventType: "screens", + }, + { + eventType: "tracks", + }, + { + eventType: "extract", + }, + ]; + + for (const testCase of testCases) { + transformers.forEach((transformer, index) => { + it(`new ${testCase.eventType} for ${integrations[index]}`, () => { + const config = require("./data/warehouse/integrations/jsonpaths/new/" + testCase.eventType); + const input = _.cloneDeep(config.input); + const received = transformer.process(input); + expect(received).toEqual(output(config, integrations[index])); + }) + + it(`legacy ${testCase.eventType} for ${integrations[index]}`, () => { + const config = require("./data/warehouse/integrations/jsonpaths/legacy/" + testCase.eventType); + const input = _.cloneDeep(config.input); + const received = transformer.process(input); + expect(received).toEqual(output(config, integrations[index])); + }) + }); + } + }); }); describe("validTimestamp", () => { diff --git a/test/integrations/destinations/kochava/processor/data.ts b/test/integrations/destinations/kochava/processor/data.ts new file mode 100644 index 0000000000..d17e9795ff --- /dev/null +++ b/test/integrations/destinations/kochava/processor/data.ts @@ -0,0 +1,1404 @@ +export const data = [ + { + name: 'kochava', + description: 'Test 0', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + destination: { + Config: { apiKey: '' }, + DestinationDefinition: { + Config: { cdkEnabled: true }, + DisplayName: 'Kochava', + ID: '1WTpBSTiL3iAUHUdW7rHT4sawgU', + Name: 'KOCHAVA', + }, + Enabled: true, + ID: '1WTpIHpH7NTBgjeiUPW1kCUgZGI', + Name: 'kochava 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: '1.1.1.1', + library: { name: 'RudderLabs JavaScript SDK', version: '1.0.0' }, + locale: 'en-US', + os: { name: 'macOS', version: '15.9' }, + 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', + properties: { name: 'sampath' }, + receivedAt: '2020-01-17T10:23:52.688+05:30', + request_ip: '0.0.0.0', + sentAt: '2020-01-17T04:53:52.667Z', + timestamp: '2020-01-17T10:23:51.206+05:30', + type: 'track', + userId: 'sampath', + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://control.kochava.com/track/json', + headers: {}, + params: {}, + body: { + JSON: { + action: 'event', + kochava_app_id: '', + kochava_device_id: 'sampath', + data: { + app_tracking_transparency: { att: false }, + currency: 'USD', + device_ids: { idfa: '', idfv: '', adid: '', android_id: '' }, + device_ver: '', + usertime: 1579236831206, + origination_ip: '1.1.1.1', + device_ua: + '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', + app_name: 'RudderLabs JavaScript SDK', + app_version: '1.0.0', + app_short_string: '1.0.0', + os_version: '15.9', + screen_dpi: 2, + locale: 'en-US', + event_name: 'Add to Cart', + event_data: { name: 'sampath' }, + }, + }, + XML: {}, + JSON_ARRAY: {}, + FORM: {}, + }, + files: {}, + userId: 'sampath', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'kochava', + description: 'Test 1', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + channel: 'web', + context: { + app: { + build: '1.0.0', + name: 'RudderLabs JavaScript SDK', + namespace: 'com.rudderlabs.javascript', + 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: '1.1.1.1', + os: { name: '', version: '' }, + screen: { density: 2 }, + }, + type: 'identify', + messageId: '84e26acc-56a5-4835-8233-591137fca468', + originalTimestamp: '2019-10-14T09:03:17.562Z', + anonymousId: '00000000000000000000000000', + userId: '123456', + integrations: { All: true }, + sentAt: '2019-10-14T09:03:22.563Z', + }, + metadata: { + destinationId: '1WTpIHpH7NTBgjeiUPW1kCUgZGI', + }, + destination: { + Config: { apiKey: '' }, + DestinationDefinition: { + Config: { cdkEnabled: true }, + DisplayName: 'Kochava', + ID: '1WTpBSTiL3iAUHUdW7rHT4sawgU', + Name: 'KOCHAVA', + }, + Enabled: true, + ID: '1WTpIHpH7NTBgjeiUPW1kCUgZGI', + Name: 'kochava test', + Transformations: [], + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + error: 'Bad event. Original error: message type "identify" not supported for "kochava"', + metadata: { + destinationId: '1WTpIHpH7NTBgjeiUPW1kCUgZGI', + }, + statTags: { + destType: 'KOCHAVA', + errorCategory: 'dataValidation', + destinationId: '1WTpIHpH7NTBgjeiUPW1kCUgZGI', + errorType: 'instrumentation', + feature: 'processor', + implementation: 'cdkV1', + module: 'destination', + }, + statusCode: 400, + }, + ], + }, + }, + }, + { + name: 'kochava', + description: 'Test 2', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + channel: 'web', + context: { + app: { + build: '1.0.0', + name: 'RudderLabs JavaScript SDK', + namespace: 'com.rudderlabs.javascript', + 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: '1.1.1.1', + os: { name: '', version: '' }, + screen: { density: 2 }, + }, + type: 'screen', + name: 'Home Screen', + messageId: '84e26acc-56a5-4835-8233-591137fca468', + originalTimestamp: '2019-10-14T09:03:17.562Z', + anonymousId: '00000000000000000000000000', + userId: '123456', + integrations: { All: true }, + sentAt: '2019-10-14T09:03:22.563Z', + }, + destination: { + Config: { apiKey: '' }, + DestinationDefinition: { + Config: { cdkEnabled: true }, + DisplayName: 'Kochava', + ID: '1WTpBSTiL3iAUHUdW7rHT4sawgU', + Name: 'KOCHAVA', + }, + Enabled: true, + ID: '1WTpIHpH7NTBgjeiUPW1kCUgZGI', + Name: 'kochava test', + Transformations: [], + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://control.kochava.com/track/json', + headers: {}, + params: {}, + body: { + JSON: { + action: 'event', + kochava_app_id: '', + kochava_device_id: '00000000000000000000000000', + data: { + app_tracking_transparency: { att: false }, + currency: 'USD', + device_ids: { idfa: '', idfv: '', adid: '', android_id: '' }, + device_ver: '', + os_version: '', + usertime: 1571043797562, + device_ua: + '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', + app_name: 'RudderLabs JavaScript SDK', + app_version: '1.0.0', + app_short_string: '1.0.0', + screen_dpi: 2, + locale: 'en-US', + event_name: 'screen view', + event_data: {}, + origination_ip: '1.1.1.1', + }, + }, + XML: {}, + JSON_ARRAY: {}, + FORM: {}, + }, + files: {}, + userId: '00000000000000000000000000', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'kochava', + description: 'Test 3', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + channel: 'web', + context: { + app: { + build: '1.0.0', + name: 'RudderLabs JavaScript SDK', + namespace: 'com.rudderlabs.javascript', + 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: '1.1.1.1', + os: { name: '', version: '' }, + screen: { density: 2 }, + }, + type: 'screen', + properties: { name: 'Home Screen' }, + messageId: '84e26acc-56a5-4835-8233-591137fca468', + originalTimestamp: '2019-10-14T09:03:17.562Z', + anonymousId: '00000000000000000000000000', + userId: '123456', + integrations: { All: true }, + sentAt: '2019-10-14T09:03:22.563Z', + }, + destination: { + Config: { apiKey: '' }, + DestinationDefinition: { + Config: { cdkEnabled: true }, + DisplayName: 'Kochava', + ID: '1WTpBSTiL3iAUHUdW7rHT4sawgU', + Name: 'KOCHAVA', + }, + Enabled: true, + ID: '1WTpIHpH7NTBgjeiUPW1kCUgZGI', + Name: 'kochava test', + Transformations: [], + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://control.kochava.com/track/json', + headers: {}, + params: {}, + body: { + JSON: { + action: 'event', + kochava_app_id: '', + kochava_device_id: '00000000000000000000000000', + data: { + app_tracking_transparency: { att: false }, + currency: 'USD', + device_ids: { idfa: '', idfv: '', adid: '', android_id: '' }, + device_ver: '', + os_version: '', + usertime: 1571043797562, + device_ua: + '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', + app_name: 'RudderLabs JavaScript SDK', + app_version: '1.0.0', + app_short_string: '1.0.0', + screen_dpi: 2, + locale: 'en-US', + event_name: 'screen view Home Screen', + event_data: { name: 'Home Screen' }, + origination_ip: '1.1.1.1', + }, + }, + XML: {}, + JSON_ARRAY: {}, + FORM: {}, + }, + files: {}, + userId: '00000000000000000000000000', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'kochava', + description: 'Test 4', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + anonymousId: '5094f5704b9cf2b3', + channel: 'mobile', + 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', + adTrackingEnabled: true, + advertisingId: 'some_adid', + }, + library: { name: 'com.rudderstack.android.sdk.core', version: '1.0.1-beta.1' }, + locale: 'en-US', + network: { carrier: 'Android', bluetooth: false, cellular: true, wifi: true }, + os: { name: 'Android', version: '8.1.0' }, + screen: { density: 420, height: 1794, width: 1080 }, + timezone: 'Asia/Kolkata', + traits: { anonymousId: '5094f5704b9cf2b3' }, + userAgent: + 'Dalvik/2.1.0 (Linux; U; Android 8.1.0; Android SDK built for x86 Build/OSM1.180201.007)', + }, + event: 'MainActivity', + integrations: { All: true }, + messageId: 'id1', + properties: { name: 'MainActivity', automatic: true }, + originalTimestamp: '2020-03-12T09:05:03.421Z', + type: 'screen', + sentAt: '2020-03-12T09:05:13.042Z', + }, + destination: { + Config: { apiKey: '' }, + DestinationDefinition: { + Config: { cdkEnabled: true }, + DisplayName: 'Kochava', + ID: '1WTpBSTiL3iAUHUdW7rHT4sawgU', + Name: 'KOCHAVA', + }, + Enabled: true, + ID: '1WTpIHpH7NTBgjeiUPW1kCUgZGI', + Name: 'kochava test', + Transformations: [], + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://control.kochava.com/track/json', + headers: {}, + params: {}, + body: { + JSON: { + action: 'event', + kochava_app_id: '', + kochava_device_id: '5094f5704b9cf2b3', + data: { + app_tracking_transparency: { att: false }, + usertime: 1584003903421, + app_version: '1', + device_ver: 'Android SDK built for x86-Android-8.1.0', + device_ids: { + idfa: '', + idfv: '', + adid: 'some_adid', + android_id: '5094f5704b9cf2b3', + }, + device_ua: + 'Dalvik/2.1.0 (Linux; U; Android 8.1.0; Android SDK built for x86 Build/OSM1.180201.007)', + event_name: 'screen view MainActivity', + currency: 'USD', + event_data: { name: 'MainActivity', automatic: true }, + app_name: 'LeanPlumIntegrationAndroid', + app_short_string: '1.0', + locale: 'en-US', + os_version: '8.1.0', + screen_dpi: 420, + }, + }, + XML: {}, + JSON_ARRAY: {}, + FORM: {}, + }, + files: {}, + userId: '5094f5704b9cf2b3', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'kochava', + description: 'Test 5', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + anonymousId: '5094f5704b9cf2b3', + channel: 'mobile', + 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', + adTrackingEnabled: true, + advertisingId: 'some_adid', + attTrackingStatus: 3, + }, + library: { name: 'com.rudderstack.android.sdk.core', version: '1.0.1-beta.1' }, + locale: 'en-US', + network: { carrier: 'Android', bluetooth: false, cellular: true, wifi: true }, + os: { name: 'iOS', version: '14.5' }, + screen: { density: 420, height: 1794, width: 1080 }, + timezone: 'Asia/Kolkata', + traits: { anonymousId: '5094f5704b9cf2b3' }, + userAgent: + 'Dalvik/2.1.0 (Linux; U; Android 8.1.0; Android SDK built for x86 Build/OSM1.180201.007)', + }, + event: 'MainActivity', + integrations: { All: true }, + messageId: 'id1', + properties: { name: 'MainActivity', automatic: true }, + originalTimestamp: '2020-03-12T09:05:03.421Z', + type: 'screen', + sentAt: '2020-03-12T09:05:13.042Z', + }, + destination: { + Config: { apiKey: '' }, + DestinationDefinition: { + Config: { cdkEnabled: true }, + DisplayName: 'Kochava', + ID: '1WTpBSTiL3iAUHUdW7rHT4sawgU', + Name: 'KOCHAVA', + }, + Enabled: true, + ID: '1WTpIHpH7NTBgjeiUPW1kCUgZGI', + Name: 'kochava test', + Transformations: [], + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://control.kochava.com/track/json', + headers: {}, + params: {}, + body: { + JSON: { + action: 'event', + kochava_app_id: '', + kochava_device_id: '5094f5704b9cf2b3', + data: { + app_tracking_transparency: { att: true }, + usertime: 1584003903421, + app_version: '1', + device_ver: 'Android SDK built for x86-iOS-14.5', + device_ids: { + idfa: 'some_adid', + idfv: '5094f5704b9cf2b3', + adid: '', + android_id: '', + }, + device_ua: + 'Dalvik/2.1.0 (Linux; U; Android 8.1.0; Android SDK built for x86 Build/OSM1.180201.007)', + event_name: 'screen view MainActivity', + currency: 'USD', + event_data: { name: 'MainActivity', automatic: true }, + app_name: 'LeanPlumIntegrationAndroid', + app_short_string: '1.0', + locale: 'en-US', + os_version: '14.5', + screen_dpi: 420, + }, + }, + XML: {}, + JSON_ARRAY: {}, + FORM: {}, + }, + files: {}, + userId: '5094f5704b9cf2b3', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'kochava', + description: 'Test 6', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + anonymousId: '5094f5704b9cf2b3', + channel: 'mobile', + 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: 'ipados', + adTrackingEnabled: true, + advertisingId: 'some_adid', + attTrackingStatus: 3, + }, + library: { name: 'com.rudderstack.android.sdk.core', version: '1.0.1-beta.1' }, + locale: 'en-US', + network: { carrier: 'Android', bluetooth: false, cellular: true, wifi: true }, + os: { name: 'ipados' }, + screen: { density: 420, height: 1794, width: 1080 }, + timezone: 'Asia/Kolkata', + traits: { anonymousId: '5094f5704b9cf2b3' }, + userAgent: + 'Dalvik/2.1.0 (Linux; U; Android 8.1.0; Android SDK built for x86 Build/OSM1.180201.007)', + }, + event: 'MainActivity', + integrations: { All: true }, + messageId: 'id1', + properties: { name: 'MainActivity', automatic: true }, + originalTimestamp: '2020-03-12T09:05:03.421Z', + type: 'screen', + sentAt: '2020-03-12T09:05:13.042Z', + }, + destination: { + Config: { apiKey: '' }, + DestinationDefinition: { + Config: { cdkEnabled: true }, + DisplayName: 'Kochava', + ID: '1WTpBSTiL3iAUHUdW7rHT4sawgU', + Name: 'KOCHAVA', + }, + Enabled: true, + ID: '1WTpIHpH7NTBgjeiUPW1kCUgZGI', + Name: 'kochava test', + Transformations: [], + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://control.kochava.com/track/json', + headers: {}, + params: {}, + body: { + JSON: { + action: 'event', + kochava_app_id: '', + kochava_device_id: '5094f5704b9cf2b3', + data: { + app_tracking_transparency: { att: true }, + usertime: 1584003903421, + app_version: '1', + device_ver: '', + device_ids: { + idfa: 'some_adid', + idfv: '5094f5704b9cf2b3', + adid: '', + android_id: '', + }, + device_ua: + 'Dalvik/2.1.0 (Linux; U; Android 8.1.0; Android SDK built for x86 Build/OSM1.180201.007)', + event_name: 'screen view MainActivity', + currency: 'USD', + event_data: { name: 'MainActivity', automatic: true }, + app_name: 'LeanPlumIntegrationAndroid', + app_short_string: '1.0', + locale: 'en-US', + screen_dpi: 420, + }, + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + userId: '5094f5704b9cf2b3', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'kochava', + description: 'Test 7', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + anonymousId: '5094f5704b9cf2b3', + channel: 'mobile', + context: { + app: { + build: '1', + name: 'LeanPlumIntegrationAndroid', + namespace: 'com.android.SampleLeanPlum', + version: '1.0', + }, + device: { + manufacturer: 'Google', + model: 'Android SDK built for x86', + name: 'generic_x86', + type: 'android', + adTrackingEnabled: true, + }, + library: { name: 'com.rudderstack.android.sdk.core', version: '1.0.1-beta.1' }, + locale: 'en-US', + network: { carrier: 'Android', bluetooth: false, cellular: true, wifi: true }, + os: { name: 'Android', version: '8.1.0' }, + screen: { density: 420, height: 1794, width: 1080 }, + timezone: 'Asia/Kolkata', + traits: { anonymousId: '5094f5704b9cf2b3' }, + userAgent: + 'Dalvik/2.1.0 (Linux; U; Android 8.1.0; Android SDK built for x86 Build/OSM1.180201.007)', + }, + event: 'MainActivity', + integrations: { All: true }, + messageId: 'id1', + properties: { name: 'MainActivity', automatic: true }, + originalTimestamp: '2020-03-12T09:05:03.421Z', + type: 'screen', + sentAt: '2020-03-12T09:05:13.042Z', + }, + destination: { + Config: { apiKey: '' }, + DestinationDefinition: { + Config: { cdkEnabled: true }, + DisplayName: 'Kochava', + ID: '1WTpBSTiL3iAUHUdW7rHT4sawgU', + Name: 'KOCHAVA', + }, + Enabled: true, + ID: '1WTpIHpH7NTBgjeiUPW1kCUgZGI', + Name: 'kochava test', + Transformations: [], + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://control.kochava.com/track/json', + headers: {}, + params: {}, + body: { + JSON: { + action: 'event', + kochava_app_id: '', + kochava_device_id: '5094f5704b9cf2b3', + data: { + app_tracking_transparency: { att: false }, + usertime: 1584003903421, + app_version: '1', + device_ver: 'Android SDK built for x86-Android-8.1.0', + device_ids: { idfa: '', idfv: '', adid: '', android_id: '5094f5704b9cf2b3' }, + device_ua: + 'Dalvik/2.1.0 (Linux; U; Android 8.1.0; Android SDK built for x86 Build/OSM1.180201.007)', + event_name: 'screen view MainActivity', + currency: 'USD', + event_data: { name: 'MainActivity', automatic: true }, + app_name: 'LeanPlumIntegrationAndroid', + app_short_string: '1.0', + locale: 'en-US', + os_version: '8.1.0', + screen_dpi: 420, + }, + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + userId: '5094f5704b9cf2b3', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'kochava', + description: 'Test 8', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + anonymousId: '5094f5704b9cf2b3', + channel: 'mobile', + context: { + app: { + build: '1', + name: 'LeanPlumIntegrationAndroid', + namespace: 'com.android.SampleLeanPlum', + version: '1.0', + }, + device: { + manufacturer: 'Google', + model: 'Android SDK built for x86', + name: 'generic_x86', + type: 'android', + adTrackingEnabled: true, + }, + library: { name: 'com.rudderstack.android.sdk.core', version: '1.0.1-beta.1' }, + locale: 'en-US', + network: { carrier: 'Android', bluetooth: false, cellular: true, wifi: true }, + screen: { density: 420, height: 1794, width: 1080 }, + timezone: 'Asia/Kolkata', + traits: { anonymousId: '5094f5704b9cf2b3' }, + userAgent: + 'Dalvik/2.1.0 (Linux; U; Android 8.1.0; Android SDK built for x86 Build/OSM1.180201.007)', + }, + event: 'MainActivity', + integrations: { All: true }, + messageId: 'id1', + properties: { name: 'MainActivity', automatic: true }, + originalTimestamp: '2020-03-12T09:05:03.421Z', + type: 'screen', + sentAt: '2020-03-12T09:05:13.042Z', + }, + destination: { + Config: { apiKey: '' }, + DestinationDefinition: { + Config: { cdkEnabled: true }, + DisplayName: 'Kochava', + ID: '1WTpBSTiL3iAUHUdW7rHT4sawgU', + Name: 'KOCHAVA', + }, + Enabled: true, + ID: '1WTpIHpH7NTBgjeiUPW1kCUgZGI', + Name: 'kochava test', + Transformations: [], + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://control.kochava.com/track/json', + headers: {}, + params: {}, + body: { + JSON: { + action: 'event', + kochava_app_id: '', + kochava_device_id: '5094f5704b9cf2b3', + data: { + app_tracking_transparency: { att: false }, + usertime: 1584003903421, + app_version: '1', + device_ver: '', + device_ids: { idfa: '', idfv: '', adid: '', android_id: '' }, + device_ua: + 'Dalvik/2.1.0 (Linux; U; Android 8.1.0; Android SDK built for x86 Build/OSM1.180201.007)', + event_name: 'screen view MainActivity', + currency: 'USD', + event_data: { name: 'MainActivity', automatic: true }, + app_name: 'LeanPlumIntegrationAndroid', + app_short_string: '1.0', + locale: 'en-US', + screen_dpi: 420, + }, + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + userId: '5094f5704b9cf2b3', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'kochava', + description: 'Test 9', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + channel: 'web', + context: { + app: { + build: '1.0.0', + name: 'RudderLabs JavaScript SDK', + namespace: 'com.rudderlabs.javascript', + version: '1.0.0', + }, + library: { name: 'RudderLabs JavaScript SDK', version: '1.0.0' }, + locale: 'en-US', + ip: '1.1.1.1', + os: { name: '', version: '' }, + screen: { density: 2 }, + }, + type: 'screen', + name: 'Home Screen', + messageId: '84e26acc-56a5-4835-8233-591137fca468', + timestamp: '2019-10-14T09:03:17.562Z', + originalTimestamp: '2019-10-14T09:03:17.562Z', + anonymousId: '00000000000000000000000000', + userId: '123456', + integrations: { All: true }, + sentAt: '2019-10-14T09:03:22.563Z', + }, + destination: { + Config: { apiKey: '' }, + DestinationDefinition: { + Config: { cdkEnabled: true }, + DisplayName: 'Kochava', + ID: '1WTpBSTiL3iAUHUdW7rHT4sawgU', + Name: 'KOCHAVA', + }, + Enabled: true, + ID: '1WTpIHpH7NTBgjeiUPW1kCUgZGI', + Name: 'kochava test', + Transformations: [], + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://control.kochava.com/track/json', + headers: {}, + params: {}, + body: { + JSON: { + action: 'event', + kochava_app_id: '', + kochava_device_id: '00000000000000000000000000', + data: { + app_tracking_transparency: { att: false }, + usertime: 1571043797562, + app_version: '1.0.0', + device_ver: '', + device_ids: { idfa: '', idfv: '', adid: '', android_id: '' }, + device_ua: '', + event_name: 'screen view', + origination_ip: '1.1.1.1', + currency: 'USD', + event_data: {}, + app_name: 'RudderLabs JavaScript SDK', + app_short_string: '1.0.0', + locale: 'en-US', + os_version: '', + screen_dpi: 2, + }, + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + userId: '00000000000000000000000000', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'kochava', + description: 'Test 10', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + channel: 'web', + context: { + app: { + build: '1.0.0', + name: 'RudderLabs JavaScript SDK', + namespace: 'com.rudderlabs.javascript', + version: '1.0.0', + }, + library: { name: 'RudderLabs JavaScript SDK', version: '1.0.0' }, + locale: 'en-US', + ip: '1.1.1.1', + os: { name: 'ios', version: '' }, + device: { attTrackingStatus: 3 }, + screen: { density: 2 }, + }, + type: 'screen', + name: 'Home Screen', + messageId: '84e26acc-56a5-4835-8233-591137fca468', + timestamp: '2019-10-14T09:03:17.562Z', + originalTimestamp: '2019-10-14T09:03:17.562Z', + anonymousId: '00000000000000000000000000', + userId: '123456', + integrations: { All: true }, + sentAt: '2019-10-14T09:03:22.563Z', + }, + destination: { + Config: { apiKey: '' }, + DestinationDefinition: { + Config: { cdkEnabled: true }, + DisplayName: 'Kochava', + ID: '1WTpBSTiL3iAUHUdW7rHT4sawgU', + Name: 'KOCHAVA', + }, + Enabled: true, + ID: '1WTpIHpH7NTBgjeiUPW1kCUgZGI', + Name: 'kochava test', + Transformations: [], + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://control.kochava.com/track/json', + headers: {}, + params: {}, + body: { + JSON: { + action: 'event', + kochava_app_id: '', + kochava_device_id: '00000000000000000000000000', + data: { + app_tracking_transparency: { att: true }, + usertime: 1571043797562, + app_version: '1.0.0', + device_ver: '', + device_ids: { + idfa: '', + idfv: '00000000000000000000000000', + adid: '', + android_id: '', + }, + device_ua: '', + event_name: 'screen view', + origination_ip: '1.1.1.1', + currency: 'USD', + event_data: {}, + app_name: 'RudderLabs JavaScript SDK', + app_short_string: '1.0.0', + locale: 'en-US', + os_version: '', + screen_dpi: 2, + }, + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + userId: '00000000000000000000000000', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'kochava', + description: 'Test 11', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + channel: 'web', + context: { + app: { + build: '1.0.0', + name: 'RudderLabs JavaScript SDK', + namespace: 'com.rudderlabs.javascript', + version: '1.0.0', + }, + library: { name: 'RudderLabs JavaScript SDK', version: '1.0.0' }, + locale: 'en-US', + ip: '1.1.1.1', + os: { name: 'tvOS', version: '' }, + screen: { density: 2 }, + }, + type: 'screen', + name: 'Home Screen', + messageId: '84e26acc-56a5-4835-8233-591137fca468', + timestamp: '2019-10-14T09:03:17.562Z', + originalTimestamp: '2019-10-14T09:03:17.562Z', + anonymousId: '00000000000000000000000000', + userId: '123456', + integrations: { All: true }, + sentAt: '2019-10-14T09:03:22.563Z', + }, + destination: { + Config: { apiKey: '' }, + DestinationDefinition: { + Config: { cdkEnabled: true }, + DisplayName: 'Kochava', + ID: '1WTpBSTiL3iAUHUdW7rHT4sawgU', + Name: 'KOCHAVA', + }, + Enabled: true, + ID: '1WTpIHpH7NTBgjeiUPW1kCUgZGI', + Name: 'kochava test', + Transformations: [], + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://control.kochava.com/track/json', + headers: {}, + params: {}, + body: { + JSON: { + action: 'event', + kochava_app_id: '', + kochava_device_id: '00000000000000000000000000', + data: { + app_tracking_transparency: { att: false }, + usertime: 1571043797562, + app_version: '1.0.0', + device_ver: '', + device_ids: { + idfa: '', + idfv: '00000000000000000000000000', + adid: '', + android_id: '', + }, + device_ua: '', + event_name: 'screen view', + origination_ip: '1.1.1.1', + currency: 'USD', + event_data: {}, + app_name: 'RudderLabs JavaScript SDK', + app_short_string: '1.0.0', + locale: 'en-US', + os_version: '', + screen_dpi: 2, + }, + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + userId: '00000000000000000000000000', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'kochava', + description: 'Test 12', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + channel: 'web', + context: { + app: { + build: '1.0.0', + name: 'RudderLabs JavaScript SDK', + namespace: 'com.rudderlabs.javascript', + version: '1.0.0', + }, + library: { name: 'RudderLabs JavaScript SDK', version: '1.0.0' }, + locale: 'en-US', + ip: '1.1.1.1', + os: { name: 'android', version: '' }, + screen: { density: 2 }, + }, + type: 'screen', + name: 'Home Screen', + messageId: '84e26acc-56a5-4835-8233-591137fca468', + timestamp: '2019-10-14T09:03:17.562Z', + originalTimestamp: '2019-10-14T09:03:17.562Z', + anonymousId: '00000000000000000000000000', + userId: '123456', + integrations: { All: true }, + sentAt: '2019-10-14T09:03:22.563Z', + }, + destination: { + Config: { apiKey: '' }, + DestinationDefinition: { + Config: { cdkEnabled: true }, + DisplayName: 'Kochava', + ID: '1WTpBSTiL3iAUHUdW7rHT4sawgU', + Name: 'KOCHAVA', + }, + Enabled: true, + ID: '1WTpIHpH7NTBgjeiUPW1kCUgZGI', + Name: 'kochava test', + Transformations: [], + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://control.kochava.com/track/json', + headers: {}, + params: {}, + body: { + JSON: { + action: 'event', + kochava_app_id: '', + kochava_device_id: '00000000000000000000000000', + data: { + app_tracking_transparency: { att: false }, + usertime: 1571043797562, + app_version: '1.0.0', + device_ver: '', + device_ids: { + idfa: '', + idfv: '', + adid: '', + android_id: '00000000000000000000000000', + }, + device_ua: '', + event_name: 'screen view', + origination_ip: '1.1.1.1', + currency: 'USD', + event_data: {}, + app_name: 'RudderLabs JavaScript SDK', + app_short_string: '1.0.0', + locale: 'en-US', + os_version: '', + screen_dpi: 2, + }, + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + userId: '00000000000000000000000000', + }, + statusCode: 200, + }, + ], + }, + }, + }, +]; diff --git a/test/integrations/destinations/lambda/processor/data.ts b/test/integrations/destinations/lambda/processor/data.ts new file mode 100644 index 0000000000..540de25417 --- /dev/null +++ b/test/integrations/destinations/lambda/processor/data.ts @@ -0,0 +1,498 @@ +export const data = [ + { + name: 'lambda', + description: 'Simple Identify call', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + 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', + }, + metadata: { + userId: 'user113<<>>user113', + jobId: 10, + sourceId: '2CFEootdF2eQh0CGeD0jdVybP5A', + destinationId: '2CojwY2YqpiTqfBPrMAUN8orgHA', + attemptNum: 0, + receivedAt: '2022-08-03T10:44:54.943+05:30', + createdAt: '2022-08-03T05:14:55.384Z', + firstAttemptedAt: '', + transformAt: 'router', + workspaceId: '2ANaDOTAzxboCOF86FkRGMEJ5F7', + secret: null, + jobsT: { + UUID: '53927e88-2d5c-4274-ad72-2e1c14a96301', + JobID: 10, + UserID: 'user113<<>>user113', + CreatedAt: '2022-08-03T05:14:55.384207Z', + ExpireAt: '2022-08-03T05:14:55.384207Z', + CustomVal: 'LAMBDA', + EventCount: 1, + EventPayload: { + 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', + }, + PayloadSize: 550, + LastJobStatus: { + JobID: 0, + JobState: '', + AttemptNum: 0, + ExecTime: '0001-01-01T00:00:00Z', + RetryTime: '0001-01-01T00:00:00Z', + ErrorCode: '', + ErrorResponse: null, + Parameters: null, + WorkspaceId: '', + }, + Parameters: { + record_id: null, + source_id: '2CFEootdF2eQh0CGeD0jdVybP5A', + event_name: '', + event_type: 'identify', + message_id: '29beef33-2771-45fd-adb4-4376aa6d72d9', + received_at: '2022-08-03T10:44:54.943+05:30', + workspaceId: '2ANaDOTAzxboCOF86FkRGMEJ5F7', + transform_at: 'router', + source_job_id: '', + destination_id: '2CojwY2YqpiTqfBPrMAUN8orgHA', + gateway_job_id: 10, + source_task_id: '', + source_batch_id: '', + source_category: '', + source_job_run_id: '', + source_task_run_id: '', + source_definition_id: '2CCxgViQJACgWABA6h83wlXnE1k', + destination_definition_id: '', + }, + WorkspaceId: '2ANaDOTAzxboCOF86FkRGMEJ5F7', + }, + pickedAtTime: '2022-08-03T10:44:56.193361+05:30', + resultSetID: 10, + }, + destination: { + ID: '2CojwY2YqpiTqfBPrMAUN8orgHA', + Name: 'Lambda test', + DestinationDefinition: { + ID: '2CoiaHPaRb79wpSG3wZWfrG3B0n', + Name: 'LAMBDA', + DisplayName: 'AWS Lambda', + Config: { + destConfig: { + defaultConfig: [ + 'region', + 'accessKeyId', + 'accessKey', + 'lambda', + 'invocationType', + 'enableBatchInput', + 'clientContext', + ], + }, + excludeKeys: [], + includeKeys: [], + saveDestinationResponse: true, + secretKeys: ['accessKeyId', 'accessKey'], + supportedMessageTypes: ['identify', 'page', 'screen', 'track', 'alias', 'group'], + supportedSourceTypes: [ + 'amp', + 'android', + 'cordova', + 'cloud', + 'flutter', + 'ios', + 'reactnative', + 'unity', + 'warehouse', + 'web', + ], + transformAt: 'router', + transformAtV1: 'router', + }, + ResponseRules: {}, + }, + Config: { + accessKeyId: '', + clientContext: '', + enableBatchInput: false, + invocationType: 'Event', + lambda: 'testFunction', + region: 'us-west-2', + accessKey: '', + }, + Enabled: true, + Transformations: [], + IsProcessorEnabled: true, + RevisionID: '2CojwWiWjNghiGbfuRcwfs6Bt5q', + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + metadata: { + userId: 'user113<<>>user113', + jobId: 10, + sourceId: '2CFEootdF2eQh0CGeD0jdVybP5A', + destinationId: '2CojwY2YqpiTqfBPrMAUN8orgHA', + attemptNum: 0, + receivedAt: '2022-08-03T10:44:54.943+05:30', + createdAt: '2022-08-03T05:14:55.384Z', + firstAttemptedAt: '', + transformAt: 'router', + workspaceId: '2ANaDOTAzxboCOF86FkRGMEJ5F7', + secret: null, + jobsT: { + UUID: '53927e88-2d5c-4274-ad72-2e1c14a96301', + JobID: 10, + UserID: 'user113<<>>user113', + CreatedAt: '2022-08-03T05:14:55.384207Z', + ExpireAt: '2022-08-03T05:14:55.384207Z', + CustomVal: 'LAMBDA', + EventCount: 1, + EventPayload: { + 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', + }, + PayloadSize: 550, + LastJobStatus: { + JobID: 0, + JobState: '', + AttemptNum: 0, + ExecTime: '0001-01-01T00:00:00Z', + RetryTime: '0001-01-01T00:00:00Z', + ErrorCode: '', + ErrorResponse: null, + Parameters: null, + WorkspaceId: '', + }, + Parameters: { + record_id: null, + source_id: '2CFEootdF2eQh0CGeD0jdVybP5A', + event_name: '', + event_type: 'identify', + message_id: '29beef33-2771-45fd-adb4-4376aa6d72d9', + received_at: '2022-08-03T10:44:54.943+05:30', + workspaceId: '2ANaDOTAzxboCOF86FkRGMEJ5F7', + transform_at: 'router', + source_job_id: '', + destination_id: '2CojwY2YqpiTqfBPrMAUN8orgHA', + gateway_job_id: 10, + source_task_id: '', + source_batch_id: '', + source_category: '', + source_job_run_id: '', + source_task_run_id: '', + source_definition_id: '2CCxgViQJACgWABA6h83wlXnE1k', + destination_definition_id: '', + }, + WorkspaceId: '2ANaDOTAzxboCOF86FkRGMEJ5F7', + }, + pickedAtTime: '2022-08-03T10:44:56.193361+05:30', + 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"}', + destConfig: { clientContext: '', invocationType: 'Event', lambda: 'testFunction' }, + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'lambda', + description: 'Destination config not present', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + 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', + }, + metadata: { + userId: 'user113<<>>user113', + jobId: 10, + sourceId: '2CFEootdF2eQh0CGeD0jdVybP5A', + destinationId: '2CojwY2YqpiTqfBPrMAUN8orgHA', + attemptNum: 0, + receivedAt: '2022-08-03T10:44:54.943+05:30', + createdAt: '2022-08-03T05:14:55.384Z', + firstAttemptedAt: '', + transformAt: 'router', + workspaceId: '2ANaDOTAzxboCOF86FkRGMEJ5F7', + secret: null, + jobsT: { + UUID: '53927e88-2d5c-4274-ad72-2e1c14a96301', + JobID: 10, + UserID: 'user113<<>>user113', + CreatedAt: '2022-08-03T05:14:55.384207Z', + ExpireAt: '2022-08-03T05:14:55.384207Z', + CustomVal: 'LAMBDA', + EventCount: 1, + EventPayload: { + 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', + }, + PayloadSize: 550, + LastJobStatus: { + JobID: 0, + JobState: '', + AttemptNum: 0, + ExecTime: '0001-01-01T00:00:00Z', + RetryTime: '0001-01-01T00:00:00Z', + ErrorCode: '', + ErrorResponse: null, + Parameters: null, + WorkspaceId: '', + }, + Parameters: { + record_id: null, + source_id: '2CFEootdF2eQh0CGeD0jdVybP5A', + event_name: '', + event_type: 'identify', + message_id: '29beef33-2771-45fd-adb4-4376aa6d72d9', + received_at: '2022-08-03T10:44:54.943+05:30', + workspaceId: '2ANaDOTAzxboCOF86FkRGMEJ5F7', + transform_at: 'router', + source_job_id: '', + destination_id: '2CojwY2YqpiTqfBPrMAUN8orgHA', + gateway_job_id: 10, + source_task_id: '', + source_batch_id: '', + source_category: '', + source_job_run_id: '', + source_task_run_id: '', + source_definition_id: '2CCxgViQJACgWABA6h83wlXnE1k', + destination_definition_id: '', + }, + WorkspaceId: '2ANaDOTAzxboCOF86FkRGMEJ5F7', + }, + pickedAtTime: '2022-08-03T10:44:56.193361+05:30', + resultSetID: 10, + }, + destination: { + ID: '2CojwY2YqpiTqfBPrMAUN8orgHA', + Name: 'Lambda test', + DestinationDefinition: { + ID: '2CoiaHPaRb79wpSG3wZWfrG3B0n', + Name: 'LAMBDA', + DisplayName: 'AWS Lambda', + Config: { + destConfig: { + defaultConfig: [ + 'region', + 'accessKeyId', + 'accessKey', + 'lambda', + 'invocationType', + 'enableBatchInput', + 'clientContext', + ], + }, + excludeKeys: [], + includeKeys: [], + saveDestinationResponse: true, + secretKeys: ['accessKeyId', 'accessKey'], + supportedMessageTypes: ['identify', 'page', 'screen', 'track', 'alias', 'group'], + supportedSourceTypes: [ + 'amp', + 'android', + 'cordova', + 'cloud', + 'flutter', + 'ios', + 'reactnative', + 'unity', + 'warehouse', + 'web', + ], + transformAt: 'router', + transformAtV1: 'router', + }, + ResponseRules: {}, + }, + Enabled: true, + Transformations: [], + IsProcessorEnabled: true, + RevisionID: '2CojwWiWjNghiGbfuRcwfs6Bt5q', + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + error: 'destination.Config cannot be undefined', + metadata: { + userId: 'user113<<>>user113', + jobId: 10, + sourceId: '2CFEootdF2eQh0CGeD0jdVybP5A', + destinationId: '2CojwY2YqpiTqfBPrMAUN8orgHA', + attemptNum: 0, + receivedAt: '2022-08-03T10:44:54.943+05:30', + createdAt: '2022-08-03T05:14:55.384Z', + firstAttemptedAt: '', + transformAt: 'router', + workspaceId: '2ANaDOTAzxboCOF86FkRGMEJ5F7', + secret: null, + jobsT: { + UUID: '53927e88-2d5c-4274-ad72-2e1c14a96301', + JobID: 10, + UserID: 'user113<<>>user113', + CreatedAt: '2022-08-03T05:14:55.384207Z', + ExpireAt: '2022-08-03T05:14:55.384207Z', + CustomVal: 'LAMBDA', + EventCount: 1, + EventPayload: { + 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', + }, + PayloadSize: 550, + LastJobStatus: { + JobID: 0, + JobState: '', + AttemptNum: 0, + ExecTime: '0001-01-01T00:00:00Z', + RetryTime: '0001-01-01T00:00:00Z', + ErrorCode: '', + ErrorResponse: null, + Parameters: null, + WorkspaceId: '', + }, + Parameters: { + record_id: null, + source_id: '2CFEootdF2eQh0CGeD0jdVybP5A', + event_name: '', + event_type: 'identify', + message_id: '29beef33-2771-45fd-adb4-4376aa6d72d9', + received_at: '2022-08-03T10:44:54.943+05:30', + workspaceId: '2ANaDOTAzxboCOF86FkRGMEJ5F7', + transform_at: 'router', + source_job_id: '', + destination_id: '2CojwY2YqpiTqfBPrMAUN8orgHA', + gateway_job_id: 10, + source_task_id: '', + source_batch_id: '', + source_category: '', + source_job_run_id: '', + source_task_run_id: '', + source_definition_id: '2CCxgViQJACgWABA6h83wlXnE1k', + destination_definition_id: '', + }, + WorkspaceId: '2ANaDOTAzxboCOF86FkRGMEJ5F7', + }, + pickedAtTime: '2022-08-03T10:44:56.193361+05:30', + resultSetID: 10, + }, + statTags: { + destType: 'LAMBDA', + errorCategory: 'dataValidation', + destinationId: '2CojwY2YqpiTqfBPrMAUN8orgHA', + workspaceId: '2ANaDOTAzxboCOF86FkRGMEJ5F7', + errorType: 'configuration', + feature: 'processor', + implementation: 'native', + module: 'destination', + }, + statusCode: 400, + }, + ], + }, + }, + }, +]; diff --git a/test/integrations/destinations/lambda/router/data.ts b/test/integrations/destinations/lambda/router/data.ts new file mode 100644 index 0000000000..37b13e4d2a --- /dev/null +++ b/test/integrations/destinations/lambda/router/data.ts @@ -0,0 +1,38788 @@ +export const data = [ + { + name: 'lambda', + description: 'Test 0', + feature: 'router', + module: 'destination', + version: 'v0', + input: { + request: { + body: { + input: [ + { + message: { + type: 'identify', + sentAt: '2022-08-18T08:43:15.539+05:30', + userId: 'identified user id', + context: { + ip: '14.5.67.21', + traits: { + data: [ + { + id: 6104546, + url: 'https://api.github.com/repos/mralexgray/-REPONAME', + fork: false, + name: '-REPONAME', + size: 48, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/-REPONAME.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnk2MTA0NTQ2', + private: false, + ssh_url: 'git@github.com:mralexgray/-REPONAME.git', + svn_url: 'https://github.com/mralexgray/-REPONAME', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/-REPONAME', + keys_url: 'https://api.github.com/repos/mralexgray/-REPONAME/keys{/key_id}', + language: null, + tags_url: 'https://api.github.com/repos/mralexgray/-REPONAME/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/-REPONAME.git', + forks_url: 'https://api.github.com/repos/mralexgray/-REPONAME/forks', + full_name: 'mralexgray/-REPONAME', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/-REPONAME/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/pulls{/number}', + pushed_at: '2012-10-06T16:37:39Z', + teams_url: 'https://api.github.com/repos/mralexgray/-REPONAME/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/git/trees{/sha}', + created_at: '2012-10-06T16:37:39Z', + events_url: 'https://api.github.com/repos/mralexgray/-REPONAME/events', + has_issues: true, + issues_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/-REPONAME/merges', + mirror_url: null, + updated_at: '2013-01-12T13:39:30Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/compare/{base}...{head}', + description: null, + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 104510411, + url: 'https://api.github.com/repos/mralexgray/...', + fork: true, + name: '...', + size: 113, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/....git', + license: { + key: 'mit', + url: 'https://api.github.com/licenses/mit', + name: 'MIT License', + node_id: 'MDc6TGljZW5zZTEz', + spdx_id: 'MIT', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkxMDQ1MTA0MTE=', + private: false, + ssh_url: 'git@github.com:mralexgray/....git', + svn_url: 'https://github.com/mralexgray/...', + archived: false, + disabled: false, + has_wiki: false, + homepage: 'https://driesvints.com/blog/getting-started-with-dotfiles', + html_url: 'https://github.com/mralexgray/...', + keys_url: 'https://api.github.com/repos/mralexgray/.../keys{/key_id}', + language: 'Shell', + tags_url: 'https://api.github.com/repos/mralexgray/.../tags', + watchers: 0, + blobs_url: 'https://api.github.com/repos/mralexgray/.../git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/....git', + forks_url: 'https://api.github.com/repos/mralexgray/.../forks', + full_name: 'mralexgray/...', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/.../hooks', + pulls_url: 'https://api.github.com/repos/mralexgray/.../pulls{/number}', + pushed_at: '2017-09-15T08:27:32Z', + teams_url: 'https://api.github.com/repos/mralexgray/.../teams', + trees_url: 'https://api.github.com/repos/mralexgray/.../git/trees{/sha}', + created_at: '2017-09-22T19:19:42Z', + events_url: 'https://api.github.com/repos/mralexgray/.../events', + has_issues: false, + issues_url: 'https://api.github.com/repos/mralexgray/.../issues{/number}', + labels_url: 'https://api.github.com/repos/mralexgray/.../labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/.../merges', + mirror_url: null, + updated_at: '2017-09-22T19:20:22Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/.../{archive_format}{/ref}', + commits_url: 'https://api.github.com/repos/mralexgray/.../commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/.../compare/{base}...{head}', + description: ':computer: Public repo for my personal dotfiles.', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/.../branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/.../comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/.../contents/{+path}', + git_refs_url: 'https://api.github.com/repos/mralexgray/.../git/refs{/sha}', + git_tags_url: 'https://api.github.com/repos/mralexgray/.../git/tags{/sha}', + has_projects: true, + releases_url: 'https://api.github.com/repos/mralexgray/.../releases{/id}', + statuses_url: 'https://api.github.com/repos/mralexgray/.../statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/.../assignees{/user}', + downloads_url: 'https://api.github.com/repos/mralexgray/.../downloads', + has_downloads: true, + languages_url: 'https://api.github.com/repos/mralexgray/.../languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/.../milestones{/number}', + stargazers_url: 'https://api.github.com/repos/mralexgray/.../stargazers', + watchers_count: 0, + deployments_url: 'https://api.github.com/repos/mralexgray/.../deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/.../git/commits{/sha}', + subscribers_url: 'https://api.github.com/repos/mralexgray/.../subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/.../contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/.../issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/.../subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/.../collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/.../issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/.../notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 58656723, + url: 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol', + fork: true, + name: '2200087-Serial-Protocol', + size: 41, + forks: 1, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/2200087-Serial-Protocol.git', + license: { + key: 'gpl-2.0', + url: 'https://api.github.com/licenses/gpl-2.0', + name: 'GNU General Public License v2.0', + node_id: 'MDc6TGljZW5zZTg=', + spdx_id: 'GPL-2.0', + }, + node_id: 'MDEwOlJlcG9zaXRvcnk1ODY1NjcyMw==', + private: false, + ssh_url: 'git@github.com:mralexgray/2200087-Serial-Protocol.git', + svn_url: 'https://github.com/mralexgray/2200087-Serial-Protocol', + archived: false, + disabled: false, + has_wiki: true, + homepage: 'http://daviddworken.com', + html_url: 'https://github.com/mralexgray/2200087-Serial-Protocol', + keys_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/keys{/key_id}', + language: 'Python', + tags_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/2200087-Serial-Protocol.git', + forks_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/forks', + full_name: 'mralexgray/2200087-Serial-Protocol', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/pulls{/number}', + pushed_at: '2016-05-12T16:07:24Z', + teams_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/git/trees{/sha}', + created_at: '2016-05-12T16:05:28Z', + events_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/merges', + mirror_url: null, + updated_at: '2016-05-12T16:05:30Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/compare/{base}...{head}', + description: + "A reverse engineered protocol description and accompanying code for Radioshack's 2200087 multimeter", + forks_count: 1, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 13121042, + url: 'https://api.github.com/repos/mralexgray/ace', + fork: true, + name: 'ace', + size: 21080, + forks: 1, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/ace.git', + license: { + key: 'other', + url: null, + name: 'Other', + node_id: 'MDc6TGljZW5zZTA=', + spdx_id: 'NOASSERTION', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkxMzEyMTA0Mg==', + private: false, + ssh_url: 'git@github.com:mralexgray/ace.git', + svn_url: 'https://github.com/mralexgray/ace', + archived: false, + disabled: false, + has_wiki: true, + homepage: 'http://ace.c9.io', + html_url: 'https://github.com/mralexgray/ace', + keys_url: 'https://api.github.com/repos/mralexgray/ace/keys{/key_id}', + language: 'JavaScript', + tags_url: 'https://api.github.com/repos/mralexgray/ace/tags', + watchers: 0, + blobs_url: 'https://api.github.com/repos/mralexgray/ace/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/ace.git', + forks_url: 'https://api.github.com/repos/mralexgray/ace/forks', + full_name: 'mralexgray/ace', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/ace/hooks', + pulls_url: 'https://api.github.com/repos/mralexgray/ace/pulls{/number}', + pushed_at: '2013-10-26T12:34:48Z', + teams_url: 'https://api.github.com/repos/mralexgray/ace/teams', + trees_url: 'https://api.github.com/repos/mralexgray/ace/git/trees{/sha}', + created_at: '2013-09-26T11:58:10Z', + events_url: 'https://api.github.com/repos/mralexgray/ace/events', + has_issues: false, + issues_url: 'https://api.github.com/repos/mralexgray/ace/issues{/number}', + labels_url: 'https://api.github.com/repos/mralexgray/ace/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/ace/merges', + mirror_url: null, + updated_at: '2013-10-26T12:34:49Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/ace/{archive_format}{/ref}', + commits_url: 'https://api.github.com/repos/mralexgray/ace/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/ace/compare/{base}...{head}', + description: 'Ace (Ajax.org Cloud9 Editor)', + forks_count: 1, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/ace/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/ace/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/ace/contents/{+path}', + git_refs_url: 'https://api.github.com/repos/mralexgray/ace/git/refs{/sha}', + git_tags_url: 'https://api.github.com/repos/mralexgray/ace/git/tags{/sha}', + has_projects: true, + releases_url: 'https://api.github.com/repos/mralexgray/ace/releases{/id}', + statuses_url: 'https://api.github.com/repos/mralexgray/ace/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/ace/assignees{/user}', + downloads_url: 'https://api.github.com/repos/mralexgray/ace/downloads', + has_downloads: true, + languages_url: 'https://api.github.com/repos/mralexgray/ace/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/ace/milestones{/number}', + stargazers_url: 'https://api.github.com/repos/mralexgray/ace/stargazers', + watchers_count: 0, + deployments_url: 'https://api.github.com/repos/mralexgray/ace/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/ace/git/commits{/sha}', + subscribers_url: 'https://api.github.com/repos/mralexgray/ace/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/ace/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/ace/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/ace/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/ace/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/ace/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/ace/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 10791045, + url: 'https://api.github.com/repos/mralexgray/ACEView', + fork: true, + name: 'ACEView', + size: 1733, + forks: 1, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/ACEView.git', + license: { + key: 'other', + url: null, + name: 'Other', + node_id: 'MDc6TGljZW5zZTA=', + spdx_id: 'NOASSERTION', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkxMDc5MTA0NQ==', + private: false, + ssh_url: 'git@github.com:mralexgray/ACEView.git', + svn_url: 'https://github.com/mralexgray/ACEView', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/ACEView', + keys_url: 'https://api.github.com/repos/mralexgray/ACEView/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/ACEView/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/ACEView/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/ACEView.git', + forks_url: 'https://api.github.com/repos/mralexgray/ACEView/forks', + full_name: 'mralexgray/ACEView', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/ACEView/hooks', + pulls_url: 'https://api.github.com/repos/mralexgray/ACEView/pulls{/number}', + pushed_at: '2014-05-09T01:36:23Z', + teams_url: 'https://api.github.com/repos/mralexgray/ACEView/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/ACEView/git/trees{/sha}', + created_at: '2013-06-19T12:15:04Z', + events_url: 'https://api.github.com/repos/mralexgray/ACEView/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/ACEView/issues{/number}', + labels_url: 'https://api.github.com/repos/mralexgray/ACEView/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/ACEView/merges', + mirror_url: null, + updated_at: '2015-11-24T01:14:10Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/ACEView/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/ACEView/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/ACEView/compare/{base}...{head}', + description: 'Use the wonderful ACE editor in your Cocoa applications', + forks_count: 1, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/ACEView/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/ACEView/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/ACEView/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/ACEView/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/ACEView/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/ACEView/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/ACEView/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/ACEView/assignees{/user}', + downloads_url: 'https://api.github.com/repos/mralexgray/ACEView/downloads', + has_downloads: true, + languages_url: 'https://api.github.com/repos/mralexgray/ACEView/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/ACEView/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/ACEView/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/ACEView/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/ACEView/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/ACEView/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/ACEView/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/ACEView/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/ACEView/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/ACEView/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/ACEView/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/ACEView/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 13623648, + url: 'https://api.github.com/repos/mralexgray/ActiveLog', + fork: true, + name: 'ActiveLog', + size: 60, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/ActiveLog.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnkxMzYyMzY0OA==', + private: false, + ssh_url: 'git@github.com:mralexgray/ActiveLog.git', + svn_url: 'https://github.com/mralexgray/ActiveLog', + archived: false, + disabled: false, + has_wiki: true, + homepage: 'http://deepitpro.com/en/articles/ActiveLog/info/', + html_url: 'https://github.com/mralexgray/ActiveLog', + keys_url: 'https://api.github.com/repos/mralexgray/ActiveLog/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/ActiveLog/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/ActiveLog.git', + forks_url: 'https://api.github.com/repos/mralexgray/ActiveLog/forks', + full_name: 'mralexgray/ActiveLog', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/ActiveLog/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/pulls{/number}', + pushed_at: '2011-07-03T06:28:59Z', + teams_url: 'https://api.github.com/repos/mralexgray/ActiveLog/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/git/trees{/sha}', + created_at: '2013-10-16T15:52:37Z', + events_url: 'https://api.github.com/repos/mralexgray/ActiveLog/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/ActiveLog/merges', + mirror_url: null, + updated_at: '2013-10-16T15:52:37Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/compare/{base}...{head}', + description: 'Shut up all logs with active filter.', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 9716210, + url: 'https://api.github.com/repos/mralexgray/adium', + fork: false, + name: 'adium', + size: 277719, + forks: 37, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/adium.git', + license: { + key: 'other', + url: null, + name: 'Other', + node_id: 'MDc6TGljZW5zZTA=', + spdx_id: 'NOASSERTION', + }, + node_id: 'MDEwOlJlcG9zaXRvcnk5NzE2MjEw', + private: false, + ssh_url: 'git@github.com:mralexgray/adium.git', + svn_url: 'https://github.com/mralexgray/adium', + archived: false, + disabled: false, + has_wiki: false, + homepage: null, + html_url: 'https://github.com/mralexgray/adium', + keys_url: 'https://api.github.com/repos/mralexgray/adium/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/adium/tags', + watchers: 0, + blobs_url: 'https://api.github.com/repos/mralexgray/adium/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/adium.git', + forks_url: 'https://api.github.com/repos/mralexgray/adium/forks', + full_name: 'mralexgray/adium', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/adium/hooks', + pulls_url: 'https://api.github.com/repos/mralexgray/adium/pulls{/number}', + pushed_at: '2013-04-26T16:43:53Z', + teams_url: 'https://api.github.com/repos/mralexgray/adium/teams', + trees_url: 'https://api.github.com/repos/mralexgray/adium/git/trees{/sha}', + created_at: '2013-04-27T14:59:33Z', + events_url: 'https://api.github.com/repos/mralexgray/adium/events', + has_issues: false, + issues_url: 'https://api.github.com/repos/mralexgray/adium/issues{/number}', + labels_url: 'https://api.github.com/repos/mralexgray/adium/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/adium/merges', + mirror_url: null, + updated_at: '2019-12-11T06:51:45Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/adium/{archive_format}{/ref}', + commits_url: 'https://api.github.com/repos/mralexgray/adium/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/adium/compare/{base}...{head}', + description: 'Official mirror of hg.adium.im', + forks_count: 37, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/adium/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/adium/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/adium/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/adium/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/adium/git/tags{/sha}', + has_projects: true, + releases_url: 'https://api.github.com/repos/mralexgray/adium/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/adium/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/adium/assignees{/user}', + downloads_url: 'https://api.github.com/repos/mralexgray/adium/downloads', + has_downloads: true, + languages_url: 'https://api.github.com/repos/mralexgray/adium/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/adium/milestones{/number}', + stargazers_url: 'https://api.github.com/repos/mralexgray/adium/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/adium/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/adium/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/adium/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/adium/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/adium/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/adium/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/adium/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/adium/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/adium/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 12752329, + url: 'https://api.github.com/repos/mralexgray/ADLivelyTableView', + fork: true, + name: 'ADLivelyTableView', + size: 73, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/ADLivelyTableView.git', + license: { + key: 'other', + url: null, + name: 'Other', + node_id: 'MDc6TGljZW5zZTA=', + spdx_id: 'NOASSERTION', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkxMjc1MjMyOQ==', + private: false, + ssh_url: 'git@github.com:mralexgray/ADLivelyTableView.git', + svn_url: 'https://github.com/mralexgray/ADLivelyTableView', + archived: false, + disabled: false, + has_wiki: true, + homepage: 'http://applidium.com/en/news/lively_uitableview/', + html_url: 'https://github.com/mralexgray/ADLivelyTableView', + keys_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/ADLivelyTableView/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/ADLivelyTableView.git', + forks_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/forks', + full_name: 'mralexgray/ADLivelyTableView', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/pulls{/number}', + pushed_at: '2012-05-10T10:40:15Z', + teams_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/git/trees{/sha}', + created_at: '2013-09-11T09:18:01Z', + events_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/merges', + mirror_url: null, + updated_at: '2013-09-11T09:18:03Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/compare/{base}...{head}', + description: 'Lively UITableView', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 5697379, + url: 'https://api.github.com/repos/mralexgray/AFIncrementalStore', + fork: true, + name: 'AFIncrementalStore', + size: 139, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/AFIncrementalStore.git', + license: { + key: 'mit', + url: 'https://api.github.com/licenses/mit', + name: 'MIT License', + node_id: 'MDc6TGljZW5zZTEz', + spdx_id: 'MIT', + }, + node_id: 'MDEwOlJlcG9zaXRvcnk1Njk3Mzc5', + private: false, + ssh_url: 'git@github.com:mralexgray/AFIncrementalStore.git', + svn_url: 'https://github.com/mralexgray/AFIncrementalStore', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/AFIncrementalStore', + keys_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/AFIncrementalStore/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/AFIncrementalStore.git', + forks_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/forks', + full_name: 'mralexgray/AFIncrementalStore', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/pulls{/number}', + pushed_at: '2012-09-01T22:46:25Z', + teams_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/git/trees{/sha}', + created_at: '2012-09-06T04:20:33Z', + events_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/merges', + mirror_url: null, + updated_at: '2013-01-12T03:15:29Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/compare/{base}...{head}', + description: 'Core Data Persistence with AFNetworking, Done Right', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 6969621, + url: 'https://api.github.com/repos/mralexgray/AFNetworking', + fork: true, + name: 'AFNetworking', + size: 4341, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/AFNetworking.git', + license: { + key: 'mit', + url: 'https://api.github.com/licenses/mit', + name: 'MIT License', + node_id: 'MDc6TGljZW5zZTEz', + spdx_id: 'MIT', + }, + node_id: 'MDEwOlJlcG9zaXRvcnk2OTY5NjIx', + private: false, + ssh_url: 'git@github.com:mralexgray/AFNetworking.git', + svn_url: 'https://github.com/mralexgray/AFNetworking', + archived: false, + disabled: false, + has_wiki: true, + homepage: 'http://afnetworking.com', + html_url: 'https://github.com/mralexgray/AFNetworking', + keys_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/AFNetworking/tags', + watchers: 2, + blobs_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/AFNetworking.git', + forks_url: 'https://api.github.com/repos/mralexgray/AFNetworking/forks', + full_name: 'mralexgray/AFNetworking', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/AFNetworking/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/pulls{/number}', + pushed_at: '2014-01-24T07:14:32Z', + teams_url: 'https://api.github.com/repos/mralexgray/AFNetworking/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/git/trees{/sha}', + created_at: '2012-12-02T17:00:04Z', + events_url: 'https://api.github.com/repos/mralexgray/AFNetworking/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/AFNetworking/merges', + mirror_url: null, + updated_at: '2014-01-24T07:14:33Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/compare/{base}...{head}', + description: 'A delightful iOS and OS X networking framework', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/stargazers', + watchers_count: 2, + deployments_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/issues/events{/number}', + stargazers_count: 2, + subscription_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 9485541, + url: 'https://api.github.com/repos/mralexgray/AGNSSplitView', + fork: true, + name: 'AGNSSplitView', + size: 68, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/AGNSSplitView.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnk5NDg1NTQx', + private: false, + ssh_url: 'git@github.com:mralexgray/AGNSSplitView.git', + svn_url: 'https://github.com/mralexgray/AGNSSplitView', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/AGNSSplitView', + keys_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/AGNSSplitView/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/AGNSSplitView.git', + forks_url: 'https://api.github.com/repos/mralexgray/AGNSSplitView/forks', + full_name: 'mralexgray/AGNSSplitView', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/AGNSSplitView/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/pulls{/number}', + pushed_at: '2013-02-26T00:32:32Z', + teams_url: 'https://api.github.com/repos/mralexgray/AGNSSplitView/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/git/trees{/sha}', + created_at: '2013-04-17T00:10:13Z', + events_url: 'https://api.github.com/repos/mralexgray/AGNSSplitView/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/AGNSSplitView/merges', + mirror_url: null, + updated_at: '2013-04-17T00:10:13Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/compare/{base}...{head}', + description: 'Simple NSSplitView additions.', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 12767784, + url: 'https://api.github.com/repos/mralexgray/AGScopeBar', + fork: true, + name: 'AGScopeBar', + size: 64, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/AGScopeBar.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnkxMjc2Nzc4NA==', + private: false, + ssh_url: 'git@github.com:mralexgray/AGScopeBar.git', + svn_url: 'https://github.com/mralexgray/AGScopeBar', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/AGScopeBar', + keys_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/AGScopeBar/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/AGScopeBar.git', + forks_url: 'https://api.github.com/repos/mralexgray/AGScopeBar/forks', + full_name: 'mralexgray/AGScopeBar', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/AGScopeBar/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/pulls{/number}', + pushed_at: '2013-05-07T03:35:29Z', + teams_url: 'https://api.github.com/repos/mralexgray/AGScopeBar/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/git/trees{/sha}', + created_at: '2013-09-11T21:06:54Z', + events_url: 'https://api.github.com/repos/mralexgray/AGScopeBar/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/AGScopeBar/merges', + mirror_url: null, + updated_at: '2013-09-11T21:06:54Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/compare/{base}...{head}', + description: 'Custom scope bar implementation for Cocoa', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 31829499, + url: 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin', + fork: true, + name: 'agvtool-xcode-plugin', + size: 102, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/agvtool-xcode-plugin.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnkzMTgyOTQ5OQ==', + private: false, + ssh_url: 'git@github.com:mralexgray/agvtool-xcode-plugin.git', + svn_url: 'https://github.com/mralexgray/agvtool-xcode-plugin', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/agvtool-xcode-plugin', + keys_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/keys{/key_id}', + language: 'Objective-C', + tags_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/agvtool-xcode-plugin.git', + forks_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/forks', + full_name: 'mralexgray/agvtool-xcode-plugin', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/pulls{/number}', + pushed_at: '2015-03-08T00:04:31Z', + teams_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/git/trees{/sha}', + created_at: '2015-03-07T22:15:38Z', + events_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/merges', + mirror_url: null, + updated_at: '2015-03-07T22:15:41Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/compare/{base}...{head}', + description: 'this is a plugin wrapper for agvtool for xcode.', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 9227846, + url: 'https://api.github.com/repos/mralexgray/AHContentBrowser', + fork: true, + name: 'AHContentBrowser', + size: 223, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/AHContentBrowser.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnk5MjI3ODQ2', + private: false, + ssh_url: 'git@github.com:mralexgray/AHContentBrowser.git', + svn_url: 'https://github.com/mralexgray/AHContentBrowser', + archived: false, + disabled: false, + has_wiki: true, + homepage: '', + html_url: 'https://github.com/mralexgray/AHContentBrowser', + keys_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/AHContentBrowser/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/AHContentBrowser.git', + forks_url: 'https://api.github.com/repos/mralexgray/AHContentBrowser/forks', + full_name: 'mralexgray/AHContentBrowser', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/AHContentBrowser/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/pulls{/number}', + pushed_at: '2013-03-13T17:38:23Z', + teams_url: 'https://api.github.com/repos/mralexgray/AHContentBrowser/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/git/trees{/sha}', + created_at: '2013-04-04T20:56:16Z', + events_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/merges', + mirror_url: null, + updated_at: '2015-10-22T05:00:24Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/compare/{base}...{head}', + description: + 'A Mac only webview that loads a fast readable version of the website if available.', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 37430328, + url: 'https://api.github.com/repos/mralexgray/AHLaunchCtl', + fork: true, + name: 'AHLaunchCtl', + size: 592, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/AHLaunchCtl.git', + license: { + key: 'mit', + url: 'https://api.github.com/licenses/mit', + name: 'MIT License', + node_id: 'MDc6TGljZW5zZTEz', + spdx_id: 'MIT', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkzNzQzMDMyOA==', + private: false, + ssh_url: 'git@github.com:mralexgray/AHLaunchCtl.git', + svn_url: 'https://github.com/mralexgray/AHLaunchCtl', + archived: false, + disabled: false, + has_wiki: true, + homepage: '', + html_url: 'https://github.com/mralexgray/AHLaunchCtl', + keys_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/AHLaunchCtl/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/AHLaunchCtl.git', + forks_url: 'https://api.github.com/repos/mralexgray/AHLaunchCtl/forks', + full_name: 'mralexgray/AHLaunchCtl', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/AHLaunchCtl/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/pulls{/number}', + pushed_at: '2015-05-26T18:50:48Z', + teams_url: 'https://api.github.com/repos/mralexgray/AHLaunchCtl/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/git/trees{/sha}', + created_at: '2015-06-14T21:31:03Z', + events_url: 'https://api.github.com/repos/mralexgray/AHLaunchCtl/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/AHLaunchCtl/merges', + mirror_url: null, + updated_at: '2015-06-14T21:31:04Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/compare/{base}...{head}', + description: 'LaunchD Framework for Cocoa Apps', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 9167473, + url: 'https://api.github.com/repos/mralexgray/AHLayout', + fork: true, + name: 'AHLayout', + size: 359, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/AHLayout.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnk5MTY3NDcz', + private: false, + ssh_url: 'git@github.com:mralexgray/AHLayout.git', + svn_url: 'https://github.com/mralexgray/AHLayout', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/AHLayout', + keys_url: 'https://api.github.com/repos/mralexgray/AHLayout/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/AHLayout/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/AHLayout/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/AHLayout.git', + forks_url: 'https://api.github.com/repos/mralexgray/AHLayout/forks', + full_name: 'mralexgray/AHLayout', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/AHLayout/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/AHLayout/pulls{/number}', + pushed_at: '2013-07-08T02:31:14Z', + teams_url: 'https://api.github.com/repos/mralexgray/AHLayout/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/AHLayout/git/trees{/sha}', + created_at: '2013-04-02T10:10:30Z', + events_url: 'https://api.github.com/repos/mralexgray/AHLayout/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/AHLayout/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/AHLayout/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/AHLayout/merges', + mirror_url: null, + updated_at: '2013-07-08T02:31:17Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/AHLayout/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/AHLayout/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/AHLayout/compare/{base}...{head}', + description: 'AHLayout', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/AHLayout/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/AHLayout/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/AHLayout/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/AHLayout/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/AHLayout/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/AHLayout/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/AHLayout/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/AHLayout/assignees{/user}', + downloads_url: 'https://api.github.com/repos/mralexgray/AHLayout/downloads', + has_downloads: true, + languages_url: 'https://api.github.com/repos/mralexgray/AHLayout/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/AHLayout/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/AHLayout/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/AHLayout/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/AHLayout/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/AHLayout/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/AHLayout/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/AHLayout/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/AHLayout/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/AHLayout/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/AHLayout/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/AHLayout/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 18450201, + url: 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework', + fork: true, + name: 'Airmail-Plug-In-Framework', + size: 888, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/Airmail-Plug-In-Framework.git', + license: { + key: 'gpl-2.0', + url: 'https://api.github.com/licenses/gpl-2.0', + name: 'GNU General Public License v2.0', + node_id: 'MDc6TGljZW5zZTg=', + spdx_id: 'GPL-2.0', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkxODQ1MDIwMQ==', + private: false, + ssh_url: 'git@github.com:mralexgray/Airmail-Plug-In-Framework.git', + svn_url: 'https://github.com/mralexgray/Airmail-Plug-In-Framework', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/Airmail-Plug-In-Framework', + keys_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/keys{/key_id}', + language: null, + tags_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/Airmail-Plug-In-Framework.git', + forks_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/forks', + full_name: 'mralexgray/Airmail-Plug-In-Framework', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/pulls{/number}', + pushed_at: '2014-03-27T15:42:19Z', + teams_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/git/trees{/sha}', + created_at: '2014-04-04T19:33:54Z', + events_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/merges', + mirror_url: null, + updated_at: '2014-11-23T19:31:04Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/compare/{base}...{head}', + description: null, + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 5203219, + url: 'https://api.github.com/repos/mralexgray/AJS-iTunes-API', + fork: true, + name: 'AJS-iTunes-API', + size: 103, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/AJS-iTunes-API.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnk1MjAzMjE5', + private: false, + ssh_url: 'git@github.com:mralexgray/AJS-iTunes-API.git', + svn_url: 'https://github.com/mralexgray/AJS-iTunes-API', + archived: false, + disabled: false, + has_wiki: true, + homepage: '', + html_url: 'https://github.com/mralexgray/AJS-iTunes-API', + keys_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/tags', + watchers: 2, + blobs_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/AJS-iTunes-API.git', + forks_url: 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/forks', + full_name: 'mralexgray/AJS-iTunes-API', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/pulls{/number}', + pushed_at: '2011-10-30T22:26:48Z', + teams_url: 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/git/trees{/sha}', + created_at: '2012-07-27T10:20:58Z', + events_url: 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/merges', + mirror_url: null, + updated_at: '2013-01-11T11:00:05Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/compare/{base}...{head}', + description: + 'Cocoa wrapper for the iTunes search API - for iOS and Mac OSX projects', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/stargazers', + watchers_count: 2, + deployments_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/issues/events{/number}', + stargazers_count: 2, + subscription_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 10093801, + url: 'https://api.github.com/repos/mralexgray/Alcatraz', + fork: true, + name: 'Alcatraz', + size: 3668, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/Alcatraz.git', + license: { + key: 'mit', + url: 'https://api.github.com/licenses/mit', + name: 'MIT License', + node_id: 'MDc6TGljZW5zZTEz', + spdx_id: 'MIT', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkxMDA5MzgwMQ==', + private: false, + ssh_url: 'git@github.com:mralexgray/Alcatraz.git', + svn_url: 'https://github.com/mralexgray/Alcatraz', + archived: false, + disabled: false, + has_wiki: false, + homepage: 'mneorr.github.com/Alcatraz', + html_url: 'https://github.com/mralexgray/Alcatraz', + keys_url: 'https://api.github.com/repos/mralexgray/Alcatraz/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/Alcatraz/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/Alcatraz.git', + forks_url: 'https://api.github.com/repos/mralexgray/Alcatraz/forks', + full_name: 'mralexgray/Alcatraz', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/Alcatraz/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/pulls{/number}', + pushed_at: '2014-03-19T12:50:37Z', + teams_url: 'https://api.github.com/repos/mralexgray/Alcatraz/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/git/trees{/sha}', + created_at: '2013-05-16T04:41:13Z', + events_url: 'https://api.github.com/repos/mralexgray/Alcatraz/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/Alcatraz/merges', + mirror_url: null, + updated_at: '2014-03-19T20:38:35Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/compare/{base}...{head}', + description: 'The most awesome (and only) Xcode package manager!', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/assignees{/user}', + downloads_url: 'https://api.github.com/repos/mralexgray/Alcatraz/downloads', + has_downloads: true, + languages_url: 'https://api.github.com/repos/mralexgray/Alcatraz/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 12916552, + url: 'https://api.github.com/repos/mralexgray/alcatraz-packages', + fork: true, + name: 'alcatraz-packages', + size: 826, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/alcatraz-packages.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnkxMjkxNjU1Mg==', + private: false, + ssh_url: 'git@github.com:mralexgray/alcatraz-packages.git', + svn_url: 'https://github.com/mralexgray/alcatraz-packages', + archived: false, + disabled: false, + has_wiki: true, + homepage: 'mneorr.github.com/Alcatraz', + html_url: 'https://github.com/mralexgray/alcatraz-packages', + keys_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/keys{/key_id}', + language: 'Ruby', + tags_url: 'https://api.github.com/repos/mralexgray/alcatraz-packages/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/alcatraz-packages.git', + forks_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/forks', + full_name: 'mralexgray/alcatraz-packages', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/pulls{/number}', + pushed_at: '2015-12-14T16:21:31Z', + teams_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/git/trees{/sha}', + created_at: '2013-09-18T07:15:24Z', + events_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/merges', + mirror_url: null, + updated_at: '2015-11-10T20:52:30Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/compare/{base}...{head}', + description: 'Package list repository for Alcatraz', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 44278362, + url: 'https://api.github.com/repos/mralexgray/alexicons', + fork: true, + name: 'alexicons', + size: 257, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/alexicons.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnk0NDI3ODM2Mg==', + private: false, + ssh_url: 'git@github.com:mralexgray/alexicons.git', + svn_url: 'https://github.com/mralexgray/alexicons', + archived: false, + disabled: false, + has_wiki: false, + homepage: null, + html_url: 'https://github.com/mralexgray/alexicons', + keys_url: 'https://api.github.com/repos/mralexgray/alexicons/keys{/key_id}', + language: 'CoffeeScript', + tags_url: 'https://api.github.com/repos/mralexgray/alexicons/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/alexicons/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/alexicons.git', + forks_url: 'https://api.github.com/repos/mralexgray/alexicons/forks', + full_name: 'mralexgray/alexicons', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/alexicons/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/alexicons/pulls{/number}', + pushed_at: '2015-10-16T03:57:51Z', + teams_url: 'https://api.github.com/repos/mralexgray/alexicons/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/alexicons/git/trees{/sha}', + created_at: '2015-10-14T21:49:39Z', + events_url: 'https://api.github.com/repos/mralexgray/alexicons/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/alexicons/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/alexicons/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/alexicons/merges', + mirror_url: null, + updated_at: '2015-10-15T06:20:08Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/alexicons/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/alexicons/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/alexicons/compare/{base}...{head}', + description: 'Get popular cat names', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/alexicons/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/alexicons/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/alexicons/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/alexicons/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/alexicons/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/alexicons/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/alexicons/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/alexicons/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/alexicons/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/alexicons/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/alexicons/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/alexicons/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/alexicons/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/alexicons/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/alexicons/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/alexicons/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/alexicons/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/alexicons/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/alexicons/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/alexicons/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/alexicons/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 10476467, + url: 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate', + fork: true, + name: 'Alfred-Google-Translate', + size: 103, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/Alfred-Google-Translate.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnkxMDQ3NjQ2Nw==', + private: false, + ssh_url: 'git@github.com:mralexgray/Alfred-Google-Translate.git', + svn_url: 'https://github.com/mralexgray/Alfred-Google-Translate', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/Alfred-Google-Translate', + keys_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/keys{/key_id}', + language: 'Shell', + tags_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/Alfred-Google-Translate.git', + forks_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/forks', + full_name: 'mralexgray/Alfred-Google-Translate', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/pulls{/number}', + pushed_at: '2013-01-12T19:39:03Z', + teams_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/git/trees{/sha}', + created_at: '2013-06-04T10:45:10Z', + events_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/merges', + mirror_url: null, + updated_at: '2013-06-04T10:45:10Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/compare/{base}...{head}', + description: 'Extension for Alfred that will do a Google translate for you', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 5524019, + url: 'https://api.github.com/repos/mralexgray/Amber', + fork: false, + name: 'Amber', + size: 48, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/Amber.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnk1NTI0MDE5', + private: false, + ssh_url: 'git@github.com:mralexgray/Amber.git', + svn_url: 'https://github.com/mralexgray/Amber', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/Amber', + keys_url: 'https://api.github.com/repos/mralexgray/Amber/keys{/key_id}', + language: null, + tags_url: 'https://api.github.com/repos/mralexgray/Amber/tags', + watchers: 0, + blobs_url: 'https://api.github.com/repos/mralexgray/Amber/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/Amber.git', + forks_url: 'https://api.github.com/repos/mralexgray/Amber/forks', + full_name: 'mralexgray/Amber', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/Amber/hooks', + pulls_url: 'https://api.github.com/repos/mralexgray/Amber/pulls{/number}', + pushed_at: '2012-08-23T10:38:25Z', + teams_url: 'https://api.github.com/repos/mralexgray/Amber/teams', + trees_url: 'https://api.github.com/repos/mralexgray/Amber/git/trees{/sha}', + created_at: '2012-08-23T10:38:24Z', + events_url: 'https://api.github.com/repos/mralexgray/Amber/events', + has_issues: true, + issues_url: 'https://api.github.com/repos/mralexgray/Amber/issues{/number}', + labels_url: 'https://api.github.com/repos/mralexgray/Amber/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/Amber/merges', + mirror_url: null, + updated_at: '2013-01-11T22:25:35Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/Amber/{archive_format}{/ref}', + commits_url: 'https://api.github.com/repos/mralexgray/Amber/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/Amber/compare/{base}...{head}', + description: 'Fork of the difficult-to-deal-with Amber.framework', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/Amber/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/Amber/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/Amber/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/Amber/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/Amber/git/tags{/sha}', + has_projects: true, + releases_url: 'https://api.github.com/repos/mralexgray/Amber/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/Amber/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/Amber/assignees{/user}', + downloads_url: 'https://api.github.com/repos/mralexgray/Amber/downloads', + has_downloads: true, + languages_url: 'https://api.github.com/repos/mralexgray/Amber/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/Amber/milestones{/number}', + stargazers_url: 'https://api.github.com/repos/mralexgray/Amber/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/Amber/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/Amber/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/Amber/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/Amber/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/Amber/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/Amber/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/Amber/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/Amber/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/Amber/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 10809060, + url: 'https://api.github.com/repos/mralexgray/Amethyst', + fork: true, + name: 'Amethyst', + size: 12623, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/Amethyst.git', + license: { + key: 'mit', + url: 'https://api.github.com/licenses/mit', + name: 'MIT License', + node_id: 'MDc6TGljZW5zZTEz', + spdx_id: 'MIT', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkxMDgwOTA2MA==', + private: false, + ssh_url: 'git@github.com:mralexgray/Amethyst.git', + svn_url: 'https://github.com/mralexgray/Amethyst', + archived: false, + disabled: false, + has_wiki: true, + homepage: 'http://ianyh.github.io/Amethyst/', + html_url: 'https://github.com/mralexgray/Amethyst', + keys_url: 'https://api.github.com/repos/mralexgray/Amethyst/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/Amethyst/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/Amethyst/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/Amethyst.git', + forks_url: 'https://api.github.com/repos/mralexgray/Amethyst/forks', + full_name: 'mralexgray/Amethyst', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/Amethyst/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/Amethyst/pulls{/number}', + pushed_at: '2013-06-18T02:54:11Z', + teams_url: 'https://api.github.com/repos/mralexgray/Amethyst/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/Amethyst/git/trees{/sha}', + created_at: '2013-06-20T00:34:22Z', + events_url: 'https://api.github.com/repos/mralexgray/Amethyst/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/Amethyst/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/Amethyst/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/Amethyst/merges', + mirror_url: null, + updated_at: '2013-06-20T00:34:22Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/Amethyst/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/Amethyst/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/Amethyst/compare/{base}...{head}', + description: 'Tiling window manager for OS X.', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/Amethyst/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/Amethyst/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/Amethyst/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/Amethyst/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/Amethyst/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/Amethyst/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/Amethyst/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/Amethyst/assignees{/user}', + downloads_url: 'https://api.github.com/repos/mralexgray/Amethyst/downloads', + has_downloads: true, + languages_url: 'https://api.github.com/repos/mralexgray/Amethyst/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/Amethyst/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/Amethyst/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/Amethyst/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/Amethyst/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/Amethyst/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/Amethyst/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/Amethyst/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/Amethyst/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/Amethyst/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/Amethyst/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/Amethyst/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 3684286, + url: 'https://api.github.com/repos/mralexgray/Animated-Paths', + fork: true, + name: 'Animated-Paths', + size: 411, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/Animated-Paths.git', + license: { + key: 'other', + url: null, + name: 'Other', + node_id: 'MDc6TGljZW5zZTA=', + spdx_id: 'NOASSERTION', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkzNjg0Mjg2', + private: false, + ssh_url: 'git@github.com:mralexgray/Animated-Paths.git', + svn_url: 'https://github.com/mralexgray/Animated-Paths', + archived: false, + disabled: false, + has_wiki: true, + homepage: + 'http://oleb.net/blog/2010/12/animating-drawing-of-cgpath-with-cashapelayer/', + html_url: 'https://github.com/mralexgray/Animated-Paths', + keys_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/Animated-Paths/tags', + watchers: 2, + blobs_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/Animated-Paths.git', + forks_url: 'https://api.github.com/repos/mralexgray/Animated-Paths/forks', + full_name: 'mralexgray/Animated-Paths', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/Animated-Paths/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/pulls{/number}', + pushed_at: '2010-12-30T20:56:51Z', + teams_url: 'https://api.github.com/repos/mralexgray/Animated-Paths/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/git/trees{/sha}', + created_at: '2012-03-11T02:56:38Z', + events_url: 'https://api.github.com/repos/mralexgray/Animated-Paths/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/Animated-Paths/merges', + mirror_url: null, + updated_at: '2013-01-08T04:12:21Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/compare/{base}...{head}', + description: + 'Demo project: Animating the drawing of a CGPath with CAShapeLayer.strokeEnd', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/stargazers', + watchers_count: 2, + deployments_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/issues/events{/number}', + stargazers_count: 2, + subscription_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 16662874, + url: 'https://api.github.com/repos/mralexgray/AnsiLove.framework', + fork: true, + name: 'AnsiLove.framework', + size: 3780, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/AnsiLove.framework.git', + license: { + key: 'other', + url: null, + name: 'Other', + node_id: 'MDc6TGljZW5zZTA=', + spdx_id: 'NOASSERTION', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkxNjY2Mjg3NA==', + private: false, + ssh_url: 'git@github.com:mralexgray/AnsiLove.framework.git', + svn_url: 'https://github.com/mralexgray/AnsiLove.framework', + archived: false, + disabled: false, + has_wiki: false, + homepage: 'http://byteproject.net', + html_url: 'https://github.com/mralexgray/AnsiLove.framework', + keys_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/keys{/key_id}', + language: 'M', + tags_url: 'https://api.github.com/repos/mralexgray/AnsiLove.framework/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/AnsiLove.framework.git', + forks_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/forks', + full_name: 'mralexgray/AnsiLove.framework', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/pulls{/number}', + pushed_at: '2013-10-04T14:08:38Z', + teams_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/git/trees{/sha}', + created_at: '2014-02-09T08:30:27Z', + events_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/merges', + mirror_url: null, + updated_at: '2015-01-13T20:41:46Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/compare/{base}...{head}', + description: 'Cocoa Framework for rendering ANSi / ASCII art', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 5189563, + url: 'https://api.github.com/repos/mralexgray/ANTrackBar', + fork: true, + name: 'ANTrackBar', + size: 94, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/ANTrackBar.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnk1MTg5NTYz', + private: false, + ssh_url: 'git@github.com:mralexgray/ANTrackBar.git', + svn_url: 'https://github.com/mralexgray/ANTrackBar', + archived: false, + disabled: false, + has_wiki: true, + homepage: '', + html_url: 'https://github.com/mralexgray/ANTrackBar', + keys_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/ANTrackBar/tags', + watchers: 2, + blobs_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/ANTrackBar.git', + forks_url: 'https://api.github.com/repos/mralexgray/ANTrackBar/forks', + full_name: 'mralexgray/ANTrackBar', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/ANTrackBar/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/pulls{/number}', + pushed_at: '2012-03-09T01:40:02Z', + teams_url: 'https://api.github.com/repos/mralexgray/ANTrackBar/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/git/trees{/sha}', + created_at: '2012-07-26T08:17:22Z', + events_url: 'https://api.github.com/repos/mralexgray/ANTrackBar/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/ANTrackBar/merges', + mirror_url: null, + updated_at: '2013-01-11T10:29:56Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/compare/{base}...{head}', + description: 'An easy-to-use Cocoa seek bar with a pleasing appearance', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/stargazers', + watchers_count: 2, + deployments_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/issues/events{/number}', + stargazers_count: 2, + subscription_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 16240152, + url: 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C', + fork: true, + name: 'AOP-in-Objective-C', + size: 340, + forks: 1, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/AOP-in-Objective-C.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnkxNjI0MDE1Mg==', + private: false, + ssh_url: 'git@github.com:mralexgray/AOP-in-Objective-C.git', + svn_url: 'https://github.com/mralexgray/AOP-in-Objective-C', + archived: false, + disabled: false, + has_wiki: true, + homepage: 'http://innoli.hu/en/opensource/', + html_url: 'https://github.com/mralexgray/AOP-in-Objective-C', + keys_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/AOP-in-Objective-C.git', + forks_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/forks', + full_name: 'mralexgray/AOP-in-Objective-C', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/pulls{/number}', + pushed_at: '2014-02-12T16:23:20Z', + teams_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/git/trees{/sha}', + created_at: '2014-01-25T21:18:04Z', + events_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/merges', + mirror_url: null, + updated_at: '2014-06-19T19:38:12Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/compare/{base}...{head}', + description: + 'An NSProxy based library for easily enabling AOP like functionality in Objective-C.', + forks_count: 1, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/languages', + default_branch: 'travis-coveralls', + milestones_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 13141936, + url: 'https://api.github.com/repos/mralexgray/Apaxy', + fork: true, + name: 'Apaxy', + size: 113, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/Apaxy.git', + license: { + key: 'unlicense', + url: 'https://api.github.com/licenses/unlicense', + name: 'The Unlicense', + node_id: 'MDc6TGljZW5zZTE1', + spdx_id: 'Unlicense', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkxMzE0MTkzNg==', + private: false, + ssh_url: 'git@github.com:mralexgray/Apaxy.git', + svn_url: 'https://github.com/mralexgray/Apaxy', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/Apaxy', + keys_url: 'https://api.github.com/repos/mralexgray/Apaxy/keys{/key_id}', + language: 'CSS', + tags_url: 'https://api.github.com/repos/mralexgray/Apaxy/tags', + watchers: 0, + blobs_url: 'https://api.github.com/repos/mralexgray/Apaxy/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/Apaxy.git', + forks_url: 'https://api.github.com/repos/mralexgray/Apaxy/forks', + full_name: 'mralexgray/Apaxy', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/Apaxy/hooks', + pulls_url: 'https://api.github.com/repos/mralexgray/Apaxy/pulls{/number}', + pushed_at: '2013-08-02T16:01:32Z', + teams_url: 'https://api.github.com/repos/mralexgray/Apaxy/teams', + trees_url: 'https://api.github.com/repos/mralexgray/Apaxy/git/trees{/sha}', + created_at: '2013-09-27T05:05:35Z', + events_url: 'https://api.github.com/repos/mralexgray/Apaxy/events', + has_issues: false, + issues_url: 'https://api.github.com/repos/mralexgray/Apaxy/issues{/number}', + labels_url: 'https://api.github.com/repos/mralexgray/Apaxy/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/Apaxy/merges', + mirror_url: null, + updated_at: '2018-02-16T21:40:24Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/Apaxy/{archive_format}{/ref}', + commits_url: 'https://api.github.com/repos/mralexgray/Apaxy/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/Apaxy/compare/{base}...{head}', + description: + 'A simple, customisable theme for your Apache directory listing.', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/Apaxy/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/Apaxy/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/Apaxy/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/Apaxy/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/Apaxy/git/tags{/sha}', + has_projects: true, + releases_url: 'https://api.github.com/repos/mralexgray/Apaxy/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/Apaxy/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/Apaxy/assignees{/user}', + downloads_url: 'https://api.github.com/repos/mralexgray/Apaxy/downloads', + has_downloads: true, + languages_url: 'https://api.github.com/repos/mralexgray/Apaxy/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/Apaxy/milestones{/number}', + stargazers_url: 'https://api.github.com/repos/mralexgray/Apaxy/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/Apaxy/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/Apaxy/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/Apaxy/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/Apaxy/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/Apaxy/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/Apaxy/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/Apaxy/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/Apaxy/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/Apaxy/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 20027360, + url: 'https://api.github.com/repos/mralexgray/app', + fork: true, + name: 'app', + size: 1890, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/app.git', + license: { + key: 'other', + url: null, + name: 'Other', + node_id: 'MDc6TGljZW5zZTA=', + spdx_id: 'NOASSERTION', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkyMDAyNzM2MA==', + private: false, + ssh_url: 'git@github.com:mralexgray/app.git', + svn_url: 'https://github.com/mralexgray/app', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/app', + keys_url: 'https://api.github.com/repos/mralexgray/app/keys{/key_id}', + language: 'JavaScript', + tags_url: 'https://api.github.com/repos/mralexgray/app/tags', + watchers: 0, + blobs_url: 'https://api.github.com/repos/mralexgray/app/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/app.git', + forks_url: 'https://api.github.com/repos/mralexgray/app/forks', + full_name: 'mralexgray/app', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/app/hooks', + pulls_url: 'https://api.github.com/repos/mralexgray/app/pulls{/number}', + pushed_at: '2014-05-20T19:51:38Z', + teams_url: 'https://api.github.com/repos/mralexgray/app/teams', + trees_url: 'https://api.github.com/repos/mralexgray/app/git/trees{/sha}', + created_at: '2014-05-21T15:54:20Z', + events_url: 'https://api.github.com/repos/mralexgray/app/events', + has_issues: false, + issues_url: 'https://api.github.com/repos/mralexgray/app/issues{/number}', + labels_url: 'https://api.github.com/repos/mralexgray/app/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/app/merges', + mirror_url: null, + updated_at: '2014-05-21T15:54:22Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/app/{archive_format}{/ref}', + commits_url: 'https://api.github.com/repos/mralexgray/app/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/app/compare/{base}...{head}', + description: 'Instant mobile web app creation', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/app/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/app/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/app/contents/{+path}', + git_refs_url: 'https://api.github.com/repos/mralexgray/app/git/refs{/sha}', + git_tags_url: 'https://api.github.com/repos/mralexgray/app/git/tags{/sha}', + has_projects: true, + releases_url: 'https://api.github.com/repos/mralexgray/app/releases{/id}', + statuses_url: 'https://api.github.com/repos/mralexgray/app/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/app/assignees{/user}', + downloads_url: 'https://api.github.com/repos/mralexgray/app/downloads', + has_downloads: true, + languages_url: 'https://api.github.com/repos/mralexgray/app/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/app/milestones{/number}', + stargazers_url: 'https://api.github.com/repos/mralexgray/app/stargazers', + watchers_count: 0, + deployments_url: 'https://api.github.com/repos/mralexgray/app/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/app/git/commits{/sha}', + subscribers_url: 'https://api.github.com/repos/mralexgray/app/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/app/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/app/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/app/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/app/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/app/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/app/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + ], + data2: [ + { + id: 6104546, + url: 'https://api.github.com/repos/mralexgray/-REPONAME', + fork: false, + name: '-REPONAME', + size: 48, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/-REPONAME.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnk2MTA0NTQ2', + private: false, + ssh_url: 'git@github.com:mralexgray/-REPONAME.git', + svn_url: 'https://github.com/mralexgray/-REPONAME', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/-REPONAME', + keys_url: 'https://api.github.com/repos/mralexgray/-REPONAME/keys{/key_id}', + language: null, + tags_url: 'https://api.github.com/repos/mralexgray/-REPONAME/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/-REPONAME.git', + forks_url: 'https://api.github.com/repos/mralexgray/-REPONAME/forks', + full_name: 'mralexgray/-REPONAME', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/-REPONAME/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/pulls{/number}', + pushed_at: '2012-10-06T16:37:39Z', + teams_url: 'https://api.github.com/repos/mralexgray/-REPONAME/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/git/trees{/sha}', + created_at: '2012-10-06T16:37:39Z', + events_url: 'https://api.github.com/repos/mralexgray/-REPONAME/events', + has_issues: true, + issues_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/-REPONAME/merges', + mirror_url: null, + updated_at: '2013-01-12T13:39:30Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/compare/{base}...{head}', + description: null, + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 104510411, + url: 'https://api.github.com/repos/mralexgray/...', + fork: true, + name: '...', + size: 113, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/....git', + license: { + key: 'mit', + url: 'https://api.github.com/licenses/mit', + name: 'MIT License', + node_id: 'MDc6TGljZW5zZTEz', + spdx_id: 'MIT', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkxMDQ1MTA0MTE=', + private: false, + ssh_url: 'git@github.com:mralexgray/....git', + svn_url: 'https://github.com/mralexgray/...', + archived: false, + disabled: false, + has_wiki: false, + homepage: 'https://driesvints.com/blog/getting-started-with-dotfiles', + html_url: 'https://github.com/mralexgray/...', + keys_url: 'https://api.github.com/repos/mralexgray/.../keys{/key_id}', + language: 'Shell', + tags_url: 'https://api.github.com/repos/mralexgray/.../tags', + watchers: 0, + blobs_url: 'https://api.github.com/repos/mralexgray/.../git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/....git', + forks_url: 'https://api.github.com/repos/mralexgray/.../forks', + full_name: 'mralexgray/...', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/.../hooks', + pulls_url: 'https://api.github.com/repos/mralexgray/.../pulls{/number}', + pushed_at: '2017-09-15T08:27:32Z', + teams_url: 'https://api.github.com/repos/mralexgray/.../teams', + trees_url: 'https://api.github.com/repos/mralexgray/.../git/trees{/sha}', + created_at: '2017-09-22T19:19:42Z', + events_url: 'https://api.github.com/repos/mralexgray/.../events', + has_issues: false, + issues_url: 'https://api.github.com/repos/mralexgray/.../issues{/number}', + labels_url: 'https://api.github.com/repos/mralexgray/.../labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/.../merges', + mirror_url: null, + updated_at: '2017-09-22T19:20:22Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/.../{archive_format}{/ref}', + commits_url: 'https://api.github.com/repos/mralexgray/.../commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/.../compare/{base}...{head}', + description: ':computer: Public repo for my personal dotfiles.', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/.../branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/.../comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/.../contents/{+path}', + git_refs_url: 'https://api.github.com/repos/mralexgray/.../git/refs{/sha}', + git_tags_url: 'https://api.github.com/repos/mralexgray/.../git/tags{/sha}', + has_projects: true, + releases_url: 'https://api.github.com/repos/mralexgray/.../releases{/id}', + statuses_url: 'https://api.github.com/repos/mralexgray/.../statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/.../assignees{/user}', + downloads_url: 'https://api.github.com/repos/mralexgray/.../downloads', + has_downloads: true, + languages_url: 'https://api.github.com/repos/mralexgray/.../languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/.../milestones{/number}', + stargazers_url: 'https://api.github.com/repos/mralexgray/.../stargazers', + watchers_count: 0, + deployments_url: 'https://api.github.com/repos/mralexgray/.../deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/.../git/commits{/sha}', + subscribers_url: 'https://api.github.com/repos/mralexgray/.../subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/.../contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/.../issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/.../subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/.../collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/.../issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/.../notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 58656723, + url: 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol', + fork: true, + name: '2200087-Serial-Protocol', + size: 41, + forks: 1, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/2200087-Serial-Protocol.git', + license: { + key: 'gpl-2.0', + url: 'https://api.github.com/licenses/gpl-2.0', + name: 'GNU General Public License v2.0', + node_id: 'MDc6TGljZW5zZTg=', + spdx_id: 'GPL-2.0', + }, + node_id: 'MDEwOlJlcG9zaXRvcnk1ODY1NjcyMw==', + private: false, + ssh_url: 'git@github.com:mralexgray/2200087-Serial-Protocol.git', + svn_url: 'https://github.com/mralexgray/2200087-Serial-Protocol', + archived: false, + disabled: false, + has_wiki: true, + homepage: 'http://daviddworken.com', + html_url: 'https://github.com/mralexgray/2200087-Serial-Protocol', + keys_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/keys{/key_id}', + language: 'Python', + tags_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/2200087-Serial-Protocol.git', + forks_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/forks', + full_name: 'mralexgray/2200087-Serial-Protocol', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/pulls{/number}', + pushed_at: '2016-05-12T16:07:24Z', + teams_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/git/trees{/sha}', + created_at: '2016-05-12T16:05:28Z', + events_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/merges', + mirror_url: null, + updated_at: '2016-05-12T16:05:30Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/compare/{base}...{head}', + description: + "A reverse engineered protocol description and accompanying code for Radioshack's 2200087 multimeter", + forks_count: 1, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 13121042, + url: 'https://api.github.com/repos/mralexgray/ace', + fork: true, + name: 'ace', + size: 21080, + forks: 1, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/ace.git', + license: { + key: 'other', + url: null, + name: 'Other', + node_id: 'MDc6TGljZW5zZTA=', + spdx_id: 'NOASSERTION', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkxMzEyMTA0Mg==', + private: false, + ssh_url: 'git@github.com:mralexgray/ace.git', + svn_url: 'https://github.com/mralexgray/ace', + archived: false, + disabled: false, + has_wiki: true, + homepage: 'http://ace.c9.io', + html_url: 'https://github.com/mralexgray/ace', + keys_url: 'https://api.github.com/repos/mralexgray/ace/keys{/key_id}', + language: 'JavaScript', + tags_url: 'https://api.github.com/repos/mralexgray/ace/tags', + watchers: 0, + blobs_url: 'https://api.github.com/repos/mralexgray/ace/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/ace.git', + forks_url: 'https://api.github.com/repos/mralexgray/ace/forks', + full_name: 'mralexgray/ace', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/ace/hooks', + pulls_url: 'https://api.github.com/repos/mralexgray/ace/pulls{/number}', + pushed_at: '2013-10-26T12:34:48Z', + teams_url: 'https://api.github.com/repos/mralexgray/ace/teams', + trees_url: 'https://api.github.com/repos/mralexgray/ace/git/trees{/sha}', + created_at: '2013-09-26T11:58:10Z', + events_url: 'https://api.github.com/repos/mralexgray/ace/events', + has_issues: false, + issues_url: 'https://api.github.com/repos/mralexgray/ace/issues{/number}', + labels_url: 'https://api.github.com/repos/mralexgray/ace/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/ace/merges', + mirror_url: null, + updated_at: '2013-10-26T12:34:49Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/ace/{archive_format}{/ref}', + commits_url: 'https://api.github.com/repos/mralexgray/ace/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/ace/compare/{base}...{head}', + description: 'Ace (Ajax.org Cloud9 Editor)', + forks_count: 1, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/ace/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/ace/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/ace/contents/{+path}', + git_refs_url: 'https://api.github.com/repos/mralexgray/ace/git/refs{/sha}', + git_tags_url: 'https://api.github.com/repos/mralexgray/ace/git/tags{/sha}', + has_projects: true, + releases_url: 'https://api.github.com/repos/mralexgray/ace/releases{/id}', + statuses_url: 'https://api.github.com/repos/mralexgray/ace/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/ace/assignees{/user}', + downloads_url: 'https://api.github.com/repos/mralexgray/ace/downloads', + has_downloads: true, + languages_url: 'https://api.github.com/repos/mralexgray/ace/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/ace/milestones{/number}', + stargazers_url: 'https://api.github.com/repos/mralexgray/ace/stargazers', + watchers_count: 0, + deployments_url: 'https://api.github.com/repos/mralexgray/ace/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/ace/git/commits{/sha}', + subscribers_url: 'https://api.github.com/repos/mralexgray/ace/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/ace/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/ace/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/ace/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/ace/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/ace/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/ace/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 10791045, + url: 'https://api.github.com/repos/mralexgray/ACEView', + fork: true, + name: 'ACEView', + size: 1733, + forks: 1, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/ACEView.git', + license: { + key: 'other', + url: null, + name: 'Other', + node_id: 'MDc6TGljZW5zZTA=', + spdx_id: 'NOASSERTION', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkxMDc5MTA0NQ==', + private: false, + ssh_url: 'git@github.com:mralexgray/ACEView.git', + svn_url: 'https://github.com/mralexgray/ACEView', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/ACEView', + keys_url: 'https://api.github.com/repos/mralexgray/ACEView/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/ACEView/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/ACEView/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/ACEView.git', + forks_url: 'https://api.github.com/repos/mralexgray/ACEView/forks', + full_name: 'mralexgray/ACEView', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/ACEView/hooks', + pulls_url: 'https://api.github.com/repos/mralexgray/ACEView/pulls{/number}', + pushed_at: '2014-05-09T01:36:23Z', + teams_url: 'https://api.github.com/repos/mralexgray/ACEView/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/ACEView/git/trees{/sha}', + created_at: '2013-06-19T12:15:04Z', + events_url: 'https://api.github.com/repos/mralexgray/ACEView/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/ACEView/issues{/number}', + labels_url: 'https://api.github.com/repos/mralexgray/ACEView/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/ACEView/merges', + mirror_url: null, + updated_at: '2015-11-24T01:14:10Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/ACEView/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/ACEView/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/ACEView/compare/{base}...{head}', + description: 'Use the wonderful ACE editor in your Cocoa applications', + forks_count: 1, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/ACEView/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/ACEView/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/ACEView/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/ACEView/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/ACEView/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/ACEView/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/ACEView/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/ACEView/assignees{/user}', + downloads_url: 'https://api.github.com/repos/mralexgray/ACEView/downloads', + has_downloads: true, + languages_url: 'https://api.github.com/repos/mralexgray/ACEView/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/ACEView/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/ACEView/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/ACEView/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/ACEView/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/ACEView/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/ACEView/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/ACEView/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/ACEView/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/ACEView/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/ACEView/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/ACEView/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 13623648, + url: 'https://api.github.com/repos/mralexgray/ActiveLog', + fork: true, + name: 'ActiveLog', + size: 60, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/ActiveLog.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnkxMzYyMzY0OA==', + private: false, + ssh_url: 'git@github.com:mralexgray/ActiveLog.git', + svn_url: 'https://github.com/mralexgray/ActiveLog', + archived: false, + disabled: false, + has_wiki: true, + homepage: 'http://deepitpro.com/en/articles/ActiveLog/info/', + html_url: 'https://github.com/mralexgray/ActiveLog', + keys_url: 'https://api.github.com/repos/mralexgray/ActiveLog/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/ActiveLog/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/ActiveLog.git', + forks_url: 'https://api.github.com/repos/mralexgray/ActiveLog/forks', + full_name: 'mralexgray/ActiveLog', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/ActiveLog/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/pulls{/number}', + pushed_at: '2011-07-03T06:28:59Z', + teams_url: 'https://api.github.com/repos/mralexgray/ActiveLog/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/git/trees{/sha}', + created_at: '2013-10-16T15:52:37Z', + events_url: 'https://api.github.com/repos/mralexgray/ActiveLog/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/ActiveLog/merges', + mirror_url: null, + updated_at: '2013-10-16T15:52:37Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/compare/{base}...{head}', + description: 'Shut up all logs with active filter.', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 9716210, + url: 'https://api.github.com/repos/mralexgray/adium', + fork: false, + name: 'adium', + size: 277719, + forks: 37, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/adium.git', + license: { + key: 'other', + url: null, + name: 'Other', + node_id: 'MDc6TGljZW5zZTA=', + spdx_id: 'NOASSERTION', + }, + node_id: 'MDEwOlJlcG9zaXRvcnk5NzE2MjEw', + private: false, + ssh_url: 'git@github.com:mralexgray/adium.git', + svn_url: 'https://github.com/mralexgray/adium', + archived: false, + disabled: false, + has_wiki: false, + homepage: null, + html_url: 'https://github.com/mralexgray/adium', + keys_url: 'https://api.github.com/repos/mralexgray/adium/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/adium/tags', + watchers: 0, + blobs_url: 'https://api.github.com/repos/mralexgray/adium/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/adium.git', + forks_url: 'https://api.github.com/repos/mralexgray/adium/forks', + full_name: 'mralexgray/adium', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/adium/hooks', + pulls_url: 'https://api.github.com/repos/mralexgray/adium/pulls{/number}', + pushed_at: '2013-04-26T16:43:53Z', + teams_url: 'https://api.github.com/repos/mralexgray/adium/teams', + trees_url: 'https://api.github.com/repos/mralexgray/adium/git/trees{/sha}', + created_at: '2013-04-27T14:59:33Z', + events_url: 'https://api.github.com/repos/mralexgray/adium/events', + has_issues: false, + issues_url: 'https://api.github.com/repos/mralexgray/adium/issues{/number}', + labels_url: 'https://api.github.com/repos/mralexgray/adium/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/adium/merges', + mirror_url: null, + updated_at: '2019-12-11T06:51:45Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/adium/{archive_format}{/ref}', + commits_url: 'https://api.github.com/repos/mralexgray/adium/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/adium/compare/{base}...{head}', + description: 'Official mirror of hg.adium.im', + forks_count: 37, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/adium/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/adium/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/adium/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/adium/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/adium/git/tags{/sha}', + has_projects: true, + releases_url: 'https://api.github.com/repos/mralexgray/adium/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/adium/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/adium/assignees{/user}', + downloads_url: 'https://api.github.com/repos/mralexgray/adium/downloads', + has_downloads: true, + languages_url: 'https://api.github.com/repos/mralexgray/adium/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/adium/milestones{/number}', + stargazers_url: 'https://api.github.com/repos/mralexgray/adium/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/adium/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/adium/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/adium/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/adium/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/adium/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/adium/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/adium/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/adium/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/adium/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 12752329, + url: 'https://api.github.com/repos/mralexgray/ADLivelyTableView', + fork: true, + name: 'ADLivelyTableView', + size: 73, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/ADLivelyTableView.git', + license: { + key: 'other', + url: null, + name: 'Other', + node_id: 'MDc6TGljZW5zZTA=', + spdx_id: 'NOASSERTION', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkxMjc1MjMyOQ==', + private: false, + ssh_url: 'git@github.com:mralexgray/ADLivelyTableView.git', + svn_url: 'https://github.com/mralexgray/ADLivelyTableView', + archived: false, + disabled: false, + has_wiki: true, + homepage: 'http://applidium.com/en/news/lively_uitableview/', + html_url: 'https://github.com/mralexgray/ADLivelyTableView', + keys_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/ADLivelyTableView/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/ADLivelyTableView.git', + forks_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/forks', + full_name: 'mralexgray/ADLivelyTableView', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/pulls{/number}', + pushed_at: '2012-05-10T10:40:15Z', + teams_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/git/trees{/sha}', + created_at: '2013-09-11T09:18:01Z', + events_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/merges', + mirror_url: null, + updated_at: '2013-09-11T09:18:03Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/compare/{base}...{head}', + description: 'Lively UITableView', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 5697379, + url: 'https://api.github.com/repos/mralexgray/AFIncrementalStore', + fork: true, + name: 'AFIncrementalStore', + size: 139, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/AFIncrementalStore.git', + license: { + key: 'mit', + url: 'https://api.github.com/licenses/mit', + name: 'MIT License', + node_id: 'MDc6TGljZW5zZTEz', + spdx_id: 'MIT', + }, + node_id: 'MDEwOlJlcG9zaXRvcnk1Njk3Mzc5', + private: false, + ssh_url: 'git@github.com:mralexgray/AFIncrementalStore.git', + svn_url: 'https://github.com/mralexgray/AFIncrementalStore', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/AFIncrementalStore', + keys_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/AFIncrementalStore/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/AFIncrementalStore.git', + forks_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/forks', + full_name: 'mralexgray/AFIncrementalStore', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/pulls{/number}', + pushed_at: '2012-09-01T22:46:25Z', + teams_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/git/trees{/sha}', + created_at: '2012-09-06T04:20:33Z', + events_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/merges', + mirror_url: null, + updated_at: '2013-01-12T03:15:29Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/compare/{base}...{head}', + description: 'Core Data Persistence with AFNetworking, Done Right', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 6969621, + url: 'https://api.github.com/repos/mralexgray/AFNetworking', + fork: true, + name: 'AFNetworking', + size: 4341, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/AFNetworking.git', + license: { + key: 'mit', + url: 'https://api.github.com/licenses/mit', + name: 'MIT License', + node_id: 'MDc6TGljZW5zZTEz', + spdx_id: 'MIT', + }, + node_id: 'MDEwOlJlcG9zaXRvcnk2OTY5NjIx', + private: false, + ssh_url: 'git@github.com:mralexgray/AFNetworking.git', + svn_url: 'https://github.com/mralexgray/AFNetworking', + archived: false, + disabled: false, + has_wiki: true, + homepage: 'http://afnetworking.com', + html_url: 'https://github.com/mralexgray/AFNetworking', + keys_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/AFNetworking/tags', + watchers: 2, + blobs_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/AFNetworking.git', + forks_url: 'https://api.github.com/repos/mralexgray/AFNetworking/forks', + full_name: 'mralexgray/AFNetworking', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/AFNetworking/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/pulls{/number}', + pushed_at: '2014-01-24T07:14:32Z', + teams_url: 'https://api.github.com/repos/mralexgray/AFNetworking/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/git/trees{/sha}', + created_at: '2012-12-02T17:00:04Z', + events_url: 'https://api.github.com/repos/mralexgray/AFNetworking/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/AFNetworking/merges', + mirror_url: null, + updated_at: '2014-01-24T07:14:33Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/compare/{base}...{head}', + description: 'A delightful iOS and OS X networking framework', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/stargazers', + watchers_count: 2, + deployments_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/issues/events{/number}', + stargazers_count: 2, + subscription_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 9485541, + url: 'https://api.github.com/repos/mralexgray/AGNSSplitView', + fork: true, + name: 'AGNSSplitView', + size: 68, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/AGNSSplitView.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnk5NDg1NTQx', + private: false, + ssh_url: 'git@github.com:mralexgray/AGNSSplitView.git', + svn_url: 'https://github.com/mralexgray/AGNSSplitView', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/AGNSSplitView', + keys_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/AGNSSplitView/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/AGNSSplitView.git', + forks_url: 'https://api.github.com/repos/mralexgray/AGNSSplitView/forks', + full_name: 'mralexgray/AGNSSplitView', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/AGNSSplitView/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/pulls{/number}', + pushed_at: '2013-02-26T00:32:32Z', + teams_url: 'https://api.github.com/repos/mralexgray/AGNSSplitView/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/git/trees{/sha}', + created_at: '2013-04-17T00:10:13Z', + events_url: 'https://api.github.com/repos/mralexgray/AGNSSplitView/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/AGNSSplitView/merges', + mirror_url: null, + updated_at: '2013-04-17T00:10:13Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/compare/{base}...{head}', + description: 'Simple NSSplitView additions.', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 12767784, + url: 'https://api.github.com/repos/mralexgray/AGScopeBar', + fork: true, + name: 'AGScopeBar', + size: 64, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/AGScopeBar.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnkxMjc2Nzc4NA==', + private: false, + ssh_url: 'git@github.com:mralexgray/AGScopeBar.git', + svn_url: 'https://github.com/mralexgray/AGScopeBar', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/AGScopeBar', + keys_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/AGScopeBar/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/AGScopeBar.git', + forks_url: 'https://api.github.com/repos/mralexgray/AGScopeBar/forks', + full_name: 'mralexgray/AGScopeBar', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/AGScopeBar/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/pulls{/number}', + pushed_at: '2013-05-07T03:35:29Z', + teams_url: 'https://api.github.com/repos/mralexgray/AGScopeBar/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/git/trees{/sha}', + created_at: '2013-09-11T21:06:54Z', + events_url: 'https://api.github.com/repos/mralexgray/AGScopeBar/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/AGScopeBar/merges', + mirror_url: null, + updated_at: '2013-09-11T21:06:54Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/compare/{base}...{head}', + description: 'Custom scope bar implementation for Cocoa', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 31829499, + url: 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin', + fork: true, + name: 'agvtool-xcode-plugin', + size: 102, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/agvtool-xcode-plugin.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnkzMTgyOTQ5OQ==', + private: false, + ssh_url: 'git@github.com:mralexgray/agvtool-xcode-plugin.git', + svn_url: 'https://github.com/mralexgray/agvtool-xcode-plugin', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/agvtool-xcode-plugin', + keys_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/keys{/key_id}', + language: 'Objective-C', + tags_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/agvtool-xcode-plugin.git', + forks_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/forks', + full_name: 'mralexgray/agvtool-xcode-plugin', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/pulls{/number}', + pushed_at: '2015-03-08T00:04:31Z', + teams_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/git/trees{/sha}', + created_at: '2015-03-07T22:15:38Z', + events_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/merges', + mirror_url: null, + updated_at: '2015-03-07T22:15:41Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/compare/{base}...{head}', + description: 'this is a plugin wrapper for agvtool for xcode.', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 9227846, + url: 'https://api.github.com/repos/mralexgray/AHContentBrowser', + fork: true, + name: 'AHContentBrowser', + size: 223, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/AHContentBrowser.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnk5MjI3ODQ2', + private: false, + ssh_url: 'git@github.com:mralexgray/AHContentBrowser.git', + svn_url: 'https://github.com/mralexgray/AHContentBrowser', + archived: false, + disabled: false, + has_wiki: true, + homepage: '', + html_url: 'https://github.com/mralexgray/AHContentBrowser', + keys_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/AHContentBrowser/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/AHContentBrowser.git', + forks_url: 'https://api.github.com/repos/mralexgray/AHContentBrowser/forks', + full_name: 'mralexgray/AHContentBrowser', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/AHContentBrowser/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/pulls{/number}', + pushed_at: '2013-03-13T17:38:23Z', + teams_url: 'https://api.github.com/repos/mralexgray/AHContentBrowser/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/git/trees{/sha}', + created_at: '2013-04-04T20:56:16Z', + events_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/merges', + mirror_url: null, + updated_at: '2015-10-22T05:00:24Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/compare/{base}...{head}', + description: + 'A Mac only webview that loads a fast readable version of the website if available.', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 37430328, + url: 'https://api.github.com/repos/mralexgray/AHLaunchCtl', + fork: true, + name: 'AHLaunchCtl', + size: 592, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/AHLaunchCtl.git', + license: { + key: 'mit', + url: 'https://api.github.com/licenses/mit', + name: 'MIT License', + node_id: 'MDc6TGljZW5zZTEz', + spdx_id: 'MIT', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkzNzQzMDMyOA==', + private: false, + ssh_url: 'git@github.com:mralexgray/AHLaunchCtl.git', + svn_url: 'https://github.com/mralexgray/AHLaunchCtl', + archived: false, + disabled: false, + has_wiki: true, + homepage: '', + html_url: 'https://github.com/mralexgray/AHLaunchCtl', + keys_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/AHLaunchCtl/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/AHLaunchCtl.git', + forks_url: 'https://api.github.com/repos/mralexgray/AHLaunchCtl/forks', + full_name: 'mralexgray/AHLaunchCtl', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/AHLaunchCtl/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/pulls{/number}', + pushed_at: '2015-05-26T18:50:48Z', + teams_url: 'https://api.github.com/repos/mralexgray/AHLaunchCtl/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/git/trees{/sha}', + created_at: '2015-06-14T21:31:03Z', + events_url: 'https://api.github.com/repos/mralexgray/AHLaunchCtl/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/AHLaunchCtl/merges', + mirror_url: null, + updated_at: '2015-06-14T21:31:04Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/compare/{base}...{head}', + description: 'LaunchD Framework for Cocoa Apps', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 9167473, + url: 'https://api.github.com/repos/mralexgray/AHLayout', + fork: true, + name: 'AHLayout', + size: 359, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/AHLayout.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnk5MTY3NDcz', + private: false, + ssh_url: 'git@github.com:mralexgray/AHLayout.git', + svn_url: 'https://github.com/mralexgray/AHLayout', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/AHLayout', + keys_url: 'https://api.github.com/repos/mralexgray/AHLayout/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/AHLayout/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/AHLayout/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/AHLayout.git', + forks_url: 'https://api.github.com/repos/mralexgray/AHLayout/forks', + full_name: 'mralexgray/AHLayout', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/AHLayout/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/AHLayout/pulls{/number}', + pushed_at: '2013-07-08T02:31:14Z', + teams_url: 'https://api.github.com/repos/mralexgray/AHLayout/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/AHLayout/git/trees{/sha}', + created_at: '2013-04-02T10:10:30Z', + events_url: 'https://api.github.com/repos/mralexgray/AHLayout/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/AHLayout/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/AHLayout/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/AHLayout/merges', + mirror_url: null, + updated_at: '2013-07-08T02:31:17Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/AHLayout/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/AHLayout/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/AHLayout/compare/{base}...{head}', + description: 'AHLayout', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/AHLayout/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/AHLayout/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/AHLayout/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/AHLayout/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/AHLayout/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/AHLayout/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/AHLayout/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/AHLayout/assignees{/user}', + downloads_url: 'https://api.github.com/repos/mralexgray/AHLayout/downloads', + has_downloads: true, + languages_url: 'https://api.github.com/repos/mralexgray/AHLayout/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/AHLayout/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/AHLayout/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/AHLayout/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/AHLayout/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/AHLayout/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/AHLayout/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/AHLayout/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/AHLayout/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/AHLayout/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/AHLayout/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/AHLayout/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 18450201, + url: 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework', + fork: true, + name: 'Airmail-Plug-In-Framework', + size: 888, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/Airmail-Plug-In-Framework.git', + license: { + key: 'gpl-2.0', + url: 'https://api.github.com/licenses/gpl-2.0', + name: 'GNU General Public License v2.0', + node_id: 'MDc6TGljZW5zZTg=', + spdx_id: 'GPL-2.0', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkxODQ1MDIwMQ==', + private: false, + ssh_url: 'git@github.com:mralexgray/Airmail-Plug-In-Framework.git', + svn_url: 'https://github.com/mralexgray/Airmail-Plug-In-Framework', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/Airmail-Plug-In-Framework', + keys_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/keys{/key_id}', + language: null, + tags_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/Airmail-Plug-In-Framework.git', + forks_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/forks', + full_name: 'mralexgray/Airmail-Plug-In-Framework', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/pulls{/number}', + pushed_at: '2014-03-27T15:42:19Z', + teams_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/git/trees{/sha}', + created_at: '2014-04-04T19:33:54Z', + events_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/merges', + mirror_url: null, + updated_at: '2014-11-23T19:31:04Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/compare/{base}...{head}', + description: null, + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 5203219, + url: 'https://api.github.com/repos/mralexgray/AJS-iTunes-API', + fork: true, + name: 'AJS-iTunes-API', + size: 103, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/AJS-iTunes-API.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnk1MjAzMjE5', + private: false, + ssh_url: 'git@github.com:mralexgray/AJS-iTunes-API.git', + svn_url: 'https://github.com/mralexgray/AJS-iTunes-API', + archived: false, + disabled: false, + has_wiki: true, + homepage: '', + html_url: 'https://github.com/mralexgray/AJS-iTunes-API', + keys_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/tags', + watchers: 2, + blobs_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/AJS-iTunes-API.git', + forks_url: 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/forks', + full_name: 'mralexgray/AJS-iTunes-API', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/pulls{/number}', + pushed_at: '2011-10-30T22:26:48Z', + teams_url: 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/git/trees{/sha}', + created_at: '2012-07-27T10:20:58Z', + events_url: 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/merges', + mirror_url: null, + updated_at: '2013-01-11T11:00:05Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/compare/{base}...{head}', + description: + 'Cocoa wrapper for the iTunes search API - for iOS and Mac OSX projects', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/stargazers', + watchers_count: 2, + deployments_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/issues/events{/number}', + stargazers_count: 2, + subscription_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 10093801, + url: 'https://api.github.com/repos/mralexgray/Alcatraz', + fork: true, + name: 'Alcatraz', + size: 3668, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/Alcatraz.git', + license: { + key: 'mit', + url: 'https://api.github.com/licenses/mit', + name: 'MIT License', + node_id: 'MDc6TGljZW5zZTEz', + spdx_id: 'MIT', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkxMDA5MzgwMQ==', + private: false, + ssh_url: 'git@github.com:mralexgray/Alcatraz.git', + svn_url: 'https://github.com/mralexgray/Alcatraz', + archived: false, + disabled: false, + has_wiki: false, + homepage: 'mneorr.github.com/Alcatraz', + html_url: 'https://github.com/mralexgray/Alcatraz', + keys_url: 'https://api.github.com/repos/mralexgray/Alcatraz/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/Alcatraz/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/Alcatraz.git', + forks_url: 'https://api.github.com/repos/mralexgray/Alcatraz/forks', + full_name: 'mralexgray/Alcatraz', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/Alcatraz/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/pulls{/number}', + pushed_at: '2014-03-19T12:50:37Z', + teams_url: 'https://api.github.com/repos/mralexgray/Alcatraz/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/git/trees{/sha}', + created_at: '2013-05-16T04:41:13Z', + events_url: 'https://api.github.com/repos/mralexgray/Alcatraz/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/Alcatraz/merges', + mirror_url: null, + updated_at: '2014-03-19T20:38:35Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/compare/{base}...{head}', + description: 'The most awesome (and only) Xcode package manager!', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/assignees{/user}', + downloads_url: 'https://api.github.com/repos/mralexgray/Alcatraz/downloads', + has_downloads: true, + languages_url: 'https://api.github.com/repos/mralexgray/Alcatraz/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 12916552, + url: 'https://api.github.com/repos/mralexgray/alcatraz-packages', + fork: true, + name: 'alcatraz-packages', + size: 826, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/alcatraz-packages.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnkxMjkxNjU1Mg==', + private: false, + ssh_url: 'git@github.com:mralexgray/alcatraz-packages.git', + svn_url: 'https://github.com/mralexgray/alcatraz-packages', + archived: false, + disabled: false, + has_wiki: true, + homepage: 'mneorr.github.com/Alcatraz', + html_url: 'https://github.com/mralexgray/alcatraz-packages', + keys_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/keys{/key_id}', + language: 'Ruby', + tags_url: 'https://api.github.com/repos/mralexgray/alcatraz-packages/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/alcatraz-packages.git', + forks_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/forks', + full_name: 'mralexgray/alcatraz-packages', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/pulls{/number}', + pushed_at: '2015-12-14T16:21:31Z', + teams_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/git/trees{/sha}', + created_at: '2013-09-18T07:15:24Z', + events_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/merges', + mirror_url: null, + updated_at: '2015-11-10T20:52:30Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/compare/{base}...{head}', + description: 'Package list repository for Alcatraz', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 44278362, + url: 'https://api.github.com/repos/mralexgray/alexicons', + fork: true, + name: 'alexicons', + size: 257, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/alexicons.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnk0NDI3ODM2Mg==', + private: false, + ssh_url: 'git@github.com:mralexgray/alexicons.git', + svn_url: 'https://github.com/mralexgray/alexicons', + archived: false, + disabled: false, + has_wiki: false, + homepage: null, + html_url: 'https://github.com/mralexgray/alexicons', + keys_url: 'https://api.github.com/repos/mralexgray/alexicons/keys{/key_id}', + language: 'CoffeeScript', + tags_url: 'https://api.github.com/repos/mralexgray/alexicons/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/alexicons/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/alexicons.git', + forks_url: 'https://api.github.com/repos/mralexgray/alexicons/forks', + full_name: 'mralexgray/alexicons', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/alexicons/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/alexicons/pulls{/number}', + pushed_at: '2015-10-16T03:57:51Z', + teams_url: 'https://api.github.com/repos/mralexgray/alexicons/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/alexicons/git/trees{/sha}', + created_at: '2015-10-14T21:49:39Z', + events_url: 'https://api.github.com/repos/mralexgray/alexicons/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/alexicons/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/alexicons/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/alexicons/merges', + mirror_url: null, + updated_at: '2015-10-15T06:20:08Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/alexicons/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/alexicons/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/alexicons/compare/{base}...{head}', + description: 'Get popular cat names', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/alexicons/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/alexicons/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/alexicons/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/alexicons/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/alexicons/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/alexicons/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/alexicons/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/alexicons/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/alexicons/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/alexicons/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/alexicons/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/alexicons/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/alexicons/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/alexicons/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/alexicons/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/alexicons/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/alexicons/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/alexicons/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/alexicons/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/alexicons/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/alexicons/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 10476467, + url: 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate', + fork: true, + name: 'Alfred-Google-Translate', + size: 103, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/Alfred-Google-Translate.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnkxMDQ3NjQ2Nw==', + private: false, + ssh_url: 'git@github.com:mralexgray/Alfred-Google-Translate.git', + svn_url: 'https://github.com/mralexgray/Alfred-Google-Translate', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/Alfred-Google-Translate', + keys_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/keys{/key_id}', + language: 'Shell', + tags_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/Alfred-Google-Translate.git', + forks_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/forks', + full_name: 'mralexgray/Alfred-Google-Translate', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/pulls{/number}', + pushed_at: '2013-01-12T19:39:03Z', + teams_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/git/trees{/sha}', + created_at: '2013-06-04T10:45:10Z', + events_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/merges', + mirror_url: null, + updated_at: '2013-06-04T10:45:10Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/compare/{base}...{head}', + description: 'Extension for Alfred that will do a Google translate for you', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 5524019, + url: 'https://api.github.com/repos/mralexgray/Amber', + fork: false, + name: 'Amber', + size: 48, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/Amber.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnk1NTI0MDE5', + private: false, + ssh_url: 'git@github.com:mralexgray/Amber.git', + svn_url: 'https://github.com/mralexgray/Amber', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/Amber', + keys_url: 'https://api.github.com/repos/mralexgray/Amber/keys{/key_id}', + language: null, + tags_url: 'https://api.github.com/repos/mralexgray/Amber/tags', + watchers: 0, + blobs_url: 'https://api.github.com/repos/mralexgray/Amber/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/Amber.git', + forks_url: 'https://api.github.com/repos/mralexgray/Amber/forks', + full_name: 'mralexgray/Amber', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/Amber/hooks', + pulls_url: 'https://api.github.com/repos/mralexgray/Amber/pulls{/number}', + pushed_at: '2012-08-23T10:38:25Z', + teams_url: 'https://api.github.com/repos/mralexgray/Amber/teams', + trees_url: 'https://api.github.com/repos/mralexgray/Amber/git/trees{/sha}', + created_at: '2012-08-23T10:38:24Z', + events_url: 'https://api.github.com/repos/mralexgray/Amber/events', + has_issues: true, + issues_url: 'https://api.github.com/repos/mralexgray/Amber/issues{/number}', + labels_url: 'https://api.github.com/repos/mralexgray/Amber/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/Amber/merges', + mirror_url: null, + updated_at: '2013-01-11T22:25:35Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/Amber/{archive_format}{/ref}', + commits_url: 'https://api.github.com/repos/mralexgray/Amber/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/Amber/compare/{base}...{head}', + description: 'Fork of the difficult-to-deal-with Amber.framework', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/Amber/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/Amber/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/Amber/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/Amber/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/Amber/git/tags{/sha}', + has_projects: true, + releases_url: 'https://api.github.com/repos/mralexgray/Amber/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/Amber/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/Amber/assignees{/user}', + downloads_url: 'https://api.github.com/repos/mralexgray/Amber/downloads', + has_downloads: true, + languages_url: 'https://api.github.com/repos/mralexgray/Amber/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/Amber/milestones{/number}', + stargazers_url: 'https://api.github.com/repos/mralexgray/Amber/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/Amber/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/Amber/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/Amber/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/Amber/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/Amber/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/Amber/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/Amber/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/Amber/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/Amber/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 10809060, + url: 'https://api.github.com/repos/mralexgray/Amethyst', + fork: true, + name: 'Amethyst', + size: 12623, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/Amethyst.git', + license: { + key: 'mit', + url: 'https://api.github.com/licenses/mit', + name: 'MIT License', + node_id: 'MDc6TGljZW5zZTEz', + spdx_id: 'MIT', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkxMDgwOTA2MA==', + private: false, + ssh_url: 'git@github.com:mralexgray/Amethyst.git', + svn_url: 'https://github.com/mralexgray/Amethyst', + archived: false, + disabled: false, + has_wiki: true, + homepage: 'http://ianyh.github.io/Amethyst/', + html_url: 'https://github.com/mralexgray/Amethyst', + keys_url: 'https://api.github.com/repos/mralexgray/Amethyst/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/Amethyst/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/Amethyst/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/Amethyst.git', + forks_url: 'https://api.github.com/repos/mralexgray/Amethyst/forks', + full_name: 'mralexgray/Amethyst', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/Amethyst/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/Amethyst/pulls{/number}', + pushed_at: '2013-06-18T02:54:11Z', + teams_url: 'https://api.github.com/repos/mralexgray/Amethyst/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/Amethyst/git/trees{/sha}', + created_at: '2013-06-20T00:34:22Z', + events_url: 'https://api.github.com/repos/mralexgray/Amethyst/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/Amethyst/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/Amethyst/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/Amethyst/merges', + mirror_url: null, + updated_at: '2013-06-20T00:34:22Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/Amethyst/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/Amethyst/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/Amethyst/compare/{base}...{head}', + description: 'Tiling window manager for OS X.', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/Amethyst/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/Amethyst/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/Amethyst/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/Amethyst/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/Amethyst/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/Amethyst/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/Amethyst/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/Amethyst/assignees{/user}', + downloads_url: 'https://api.github.com/repos/mralexgray/Amethyst/downloads', + has_downloads: true, + languages_url: 'https://api.github.com/repos/mralexgray/Amethyst/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/Amethyst/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/Amethyst/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/Amethyst/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/Amethyst/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/Amethyst/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/Amethyst/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/Amethyst/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/Amethyst/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/Amethyst/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/Amethyst/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/Amethyst/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 3684286, + url: 'https://api.github.com/repos/mralexgray/Animated-Paths', + fork: true, + name: 'Animated-Paths', + size: 411, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/Animated-Paths.git', + license: { + key: 'other', + url: null, + name: 'Other', + node_id: 'MDc6TGljZW5zZTA=', + spdx_id: 'NOASSERTION', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkzNjg0Mjg2', + private: false, + ssh_url: 'git@github.com:mralexgray/Animated-Paths.git', + svn_url: 'https://github.com/mralexgray/Animated-Paths', + archived: false, + disabled: false, + has_wiki: true, + homepage: + 'http://oleb.net/blog/2010/12/animating-drawing-of-cgpath-with-cashapelayer/', + html_url: 'https://github.com/mralexgray/Animated-Paths', + keys_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/Animated-Paths/tags', + watchers: 2, + blobs_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/Animated-Paths.git', + forks_url: 'https://api.github.com/repos/mralexgray/Animated-Paths/forks', + full_name: 'mralexgray/Animated-Paths', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/Animated-Paths/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/pulls{/number}', + pushed_at: '2010-12-30T20:56:51Z', + teams_url: 'https://api.github.com/repos/mralexgray/Animated-Paths/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/git/trees{/sha}', + created_at: '2012-03-11T02:56:38Z', + events_url: 'https://api.github.com/repos/mralexgray/Animated-Paths/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/Animated-Paths/merges', + mirror_url: null, + updated_at: '2013-01-08T04:12:21Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/compare/{base}...{head}', + description: + 'Demo project: Animating the drawing of a CGPath with CAShapeLayer.strokeEnd', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/stargazers', + watchers_count: 2, + deployments_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/issues/events{/number}', + stargazers_count: 2, + subscription_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 16662874, + url: 'https://api.github.com/repos/mralexgray/AnsiLove.framework', + fork: true, + name: 'AnsiLove.framework', + size: 3780, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/AnsiLove.framework.git', + license: { + key: 'other', + url: null, + name: 'Other', + node_id: 'MDc6TGljZW5zZTA=', + spdx_id: 'NOASSERTION', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkxNjY2Mjg3NA==', + private: false, + ssh_url: 'git@github.com:mralexgray/AnsiLove.framework.git', + svn_url: 'https://github.com/mralexgray/AnsiLove.framework', + archived: false, + disabled: false, + has_wiki: false, + homepage: 'http://byteproject.net', + html_url: 'https://github.com/mralexgray/AnsiLove.framework', + keys_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/keys{/key_id}', + language: 'M', + tags_url: 'https://api.github.com/repos/mralexgray/AnsiLove.framework/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/AnsiLove.framework.git', + forks_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/forks', + full_name: 'mralexgray/AnsiLove.framework', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/pulls{/number}', + pushed_at: '2013-10-04T14:08:38Z', + teams_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/git/trees{/sha}', + created_at: '2014-02-09T08:30:27Z', + events_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/merges', + mirror_url: null, + updated_at: '2015-01-13T20:41:46Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/compare/{base}...{head}', + description: 'Cocoa Framework for rendering ANSi / ASCII art', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 5189563, + url: 'https://api.github.com/repos/mralexgray/ANTrackBar', + fork: true, + name: 'ANTrackBar', + size: 94, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/ANTrackBar.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnk1MTg5NTYz', + private: false, + ssh_url: 'git@github.com:mralexgray/ANTrackBar.git', + svn_url: 'https://github.com/mralexgray/ANTrackBar', + archived: false, + disabled: false, + has_wiki: true, + homepage: '', + html_url: 'https://github.com/mralexgray/ANTrackBar', + keys_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/ANTrackBar/tags', + watchers: 2, + blobs_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/ANTrackBar.git', + forks_url: 'https://api.github.com/repos/mralexgray/ANTrackBar/forks', + full_name: 'mralexgray/ANTrackBar', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/ANTrackBar/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/pulls{/number}', + pushed_at: '2012-03-09T01:40:02Z', + teams_url: 'https://api.github.com/repos/mralexgray/ANTrackBar/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/git/trees{/sha}', + created_at: '2012-07-26T08:17:22Z', + events_url: 'https://api.github.com/repos/mralexgray/ANTrackBar/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/ANTrackBar/merges', + mirror_url: null, + updated_at: '2013-01-11T10:29:56Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/compare/{base}...{head}', + description: 'An easy-to-use Cocoa seek bar with a pleasing appearance', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/stargazers', + watchers_count: 2, + deployments_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/issues/events{/number}', + stargazers_count: 2, + subscription_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 16240152, + url: 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C', + fork: true, + name: 'AOP-in-Objective-C', + size: 340, + forks: 1, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/AOP-in-Objective-C.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnkxNjI0MDE1Mg==', + private: false, + ssh_url: 'git@github.com:mralexgray/AOP-in-Objective-C.git', + svn_url: 'https://github.com/mralexgray/AOP-in-Objective-C', + archived: false, + disabled: false, + has_wiki: true, + homepage: 'http://innoli.hu/en/opensource/', + html_url: 'https://github.com/mralexgray/AOP-in-Objective-C', + keys_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/AOP-in-Objective-C.git', + forks_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/forks', + full_name: 'mralexgray/AOP-in-Objective-C', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/pulls{/number}', + pushed_at: '2014-02-12T16:23:20Z', + teams_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/git/trees{/sha}', + created_at: '2014-01-25T21:18:04Z', + events_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/merges', + mirror_url: null, + updated_at: '2014-06-19T19:38:12Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/compare/{base}...{head}', + description: + 'An NSProxy based library for easily enabling AOP like functionality in Objective-C.', + forks_count: 1, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/languages', + default_branch: 'travis-coveralls', + milestones_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 13141936, + url: 'https://api.github.com/repos/mralexgray/Apaxy', + fork: true, + name: 'Apaxy', + size: 113, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/Apaxy.git', + license: { + key: 'unlicense', + url: 'https://api.github.com/licenses/unlicense', + name: 'The Unlicense', + node_id: 'MDc6TGljZW5zZTE1', + spdx_id: 'Unlicense', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkxMzE0MTkzNg==', + private: false, + ssh_url: 'git@github.com:mralexgray/Apaxy.git', + svn_url: 'https://github.com/mralexgray/Apaxy', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/Apaxy', + keys_url: 'https://api.github.com/repos/mralexgray/Apaxy/keys{/key_id}', + language: 'CSS', + tags_url: 'https://api.github.com/repos/mralexgray/Apaxy/tags', + watchers: 0, + blobs_url: 'https://api.github.com/repos/mralexgray/Apaxy/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/Apaxy.git', + forks_url: 'https://api.github.com/repos/mralexgray/Apaxy/forks', + full_name: 'mralexgray/Apaxy', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/Apaxy/hooks', + pulls_url: 'https://api.github.com/repos/mralexgray/Apaxy/pulls{/number}', + pushed_at: '2013-08-02T16:01:32Z', + teams_url: 'https://api.github.com/repos/mralexgray/Apaxy/teams', + trees_url: 'https://api.github.com/repos/mralexgray/Apaxy/git/trees{/sha}', + created_at: '2013-09-27T05:05:35Z', + events_url: 'https://api.github.com/repos/mralexgray/Apaxy/events', + has_issues: false, + issues_url: 'https://api.github.com/repos/mralexgray/Apaxy/issues{/number}', + labels_url: 'https://api.github.com/repos/mralexgray/Apaxy/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/Apaxy/merges', + mirror_url: null, + updated_at: '2018-02-16T21:40:24Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/Apaxy/{archive_format}{/ref}', + commits_url: 'https://api.github.com/repos/mralexgray/Apaxy/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/Apaxy/compare/{base}...{head}', + description: + 'A simple, customisable theme for your Apache directory listing.', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/Apaxy/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/Apaxy/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/Apaxy/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/Apaxy/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/Apaxy/git/tags{/sha}', + has_projects: true, + releases_url: 'https://api.github.com/repos/mralexgray/Apaxy/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/Apaxy/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/Apaxy/assignees{/user}', + downloads_url: 'https://api.github.com/repos/mralexgray/Apaxy/downloads', + has_downloads: true, + languages_url: 'https://api.github.com/repos/mralexgray/Apaxy/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/Apaxy/milestones{/number}', + stargazers_url: 'https://api.github.com/repos/mralexgray/Apaxy/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/Apaxy/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/Apaxy/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/Apaxy/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/Apaxy/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/Apaxy/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/Apaxy/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/Apaxy/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/Apaxy/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/Apaxy/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 20027360, + url: 'https://api.github.com/repos/mralexgray/app', + fork: true, + name: 'app', + size: 1890, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/app.git', + license: { + key: 'other', + url: null, + name: 'Other', + node_id: 'MDc6TGljZW5zZTA=', + spdx_id: 'NOASSERTION', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkyMDAyNzM2MA==', + private: false, + ssh_url: 'git@github.com:mralexgray/app.git', + svn_url: 'https://github.com/mralexgray/app', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/app', + keys_url: 'https://api.github.com/repos/mralexgray/app/keys{/key_id}', + language: 'JavaScript', + tags_url: 'https://api.github.com/repos/mralexgray/app/tags', + watchers: 0, + blobs_url: 'https://api.github.com/repos/mralexgray/app/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/app.git', + forks_url: 'https://api.github.com/repos/mralexgray/app/forks', + full_name: 'mralexgray/app', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/app/hooks', + pulls_url: 'https://api.github.com/repos/mralexgray/app/pulls{/number}', + pushed_at: '2014-05-20T19:51:38Z', + teams_url: 'https://api.github.com/repos/mralexgray/app/teams', + trees_url: 'https://api.github.com/repos/mralexgray/app/git/trees{/sha}', + created_at: '2014-05-21T15:54:20Z', + events_url: 'https://api.github.com/repos/mralexgray/app/events', + has_issues: false, + issues_url: 'https://api.github.com/repos/mralexgray/app/issues{/number}', + labels_url: 'https://api.github.com/repos/mralexgray/app/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/app/merges', + mirror_url: null, + updated_at: '2014-05-21T15:54:22Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/app/{archive_format}{/ref}', + commits_url: 'https://api.github.com/repos/mralexgray/app/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/app/compare/{base}...{head}', + description: 'Instant mobile web app creation', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/app/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/app/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/app/contents/{+path}', + git_refs_url: 'https://api.github.com/repos/mralexgray/app/git/refs{/sha}', + git_tags_url: 'https://api.github.com/repos/mralexgray/app/git/tags{/sha}', + has_projects: true, + releases_url: 'https://api.github.com/repos/mralexgray/app/releases{/id}', + statuses_url: 'https://api.github.com/repos/mralexgray/app/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/app/assignees{/user}', + downloads_url: 'https://api.github.com/repos/mralexgray/app/downloads', + has_downloads: true, + languages_url: 'https://api.github.com/repos/mralexgray/app/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/app/milestones{/number}', + stargazers_url: 'https://api.github.com/repos/mralexgray/app/stargazers', + watchers_count: 0, + deployments_url: 'https://api.github.com/repos/mralexgray/app/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/app/git/commits{/sha}', + subscribers_url: 'https://api.github.com/repos/mralexgray/app/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/app/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/app/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/app/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/app/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/app/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/app/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + ], + trait1: 'new-val', + }, + library: { + name: 'http', + }, + }, + rudderId: 'daf823fb-e8d3-413a-8313-d34cd756f968', + messageId: 'c864b4cd-8f07-4922-b3d0-82ef04c987d3', + timestamp: '2020-02-02T00:23:09.544Z', + 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', + }, + metadata: { + userId: 'anon-id-new<<>>identified user id', + jobId: 31, + sourceId: '2DTlLPQxignYp4ag9sISgGN2uY7', + destinationId: '2DTozIMGtBwTGNJtuvdPByFSL2Z', + attemptNum: 0, + receivedAt: '2022-08-18T08:43:13.521+05:30', + createdAt: '2022-08-18T03:13:15.549Z', + firstAttemptedAt: '', + transformAt: 'router', + workspaceId: '2DTlBMipxWfJZzZ1SsjELQWvkwd', + secret: null, + jobsT: { + UUID: '47b3937a-1fef-49fa-85c8-649673bd7170', + JobID: 31, + UserID: 'anon-id-new<<>>identified user id', + CreatedAt: '2022-08-18T03:13:15.549078Z', + ExpireAt: '2022-08-18T03:13:15.549078Z', + CustomVal: 'LAMBDA', + EventCount: 1, + EventPayload: { + type: 'identify', + sentAt: '2022-08-18T08:43:15.539+05:30', + userId: 'identified user id', + context: { + ip: '14.5.67.21', + traits: { + data: [ + { + id: 6104546, + url: 'https://api.github.com/repos/mralexgray/-REPONAME', + fork: false, + name: '-REPONAME', + size: 48, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/-REPONAME.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnk2MTA0NTQ2', + private: false, + ssh_url: 'git@github.com:mralexgray/-REPONAME.git', + svn_url: 'https://github.com/mralexgray/-REPONAME', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/-REPONAME', + keys_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/keys{/key_id}', + language: null, + tags_url: 'https://api.github.com/repos/mralexgray/-REPONAME/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/-REPONAME.git', + forks_url: 'https://api.github.com/repos/mralexgray/-REPONAME/forks', + full_name: 'mralexgray/-REPONAME', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/-REPONAME/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/pulls{/number}', + pushed_at: '2012-10-06T16:37:39Z', + teams_url: 'https://api.github.com/repos/mralexgray/-REPONAME/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/git/trees{/sha}', + created_at: '2012-10-06T16:37:39Z', + events_url: 'https://api.github.com/repos/mralexgray/-REPONAME/events', + has_issues: true, + issues_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/-REPONAME/merges', + mirror_url: null, + updated_at: '2013-01-12T13:39:30Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/compare/{base}...{head}', + description: null, + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 104510411, + url: 'https://api.github.com/repos/mralexgray/...', + fork: true, + name: '...', + size: 113, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/....git', + license: { + key: 'mit', + url: 'https://api.github.com/licenses/mit', + name: 'MIT License', + node_id: 'MDc6TGljZW5zZTEz', + spdx_id: 'MIT', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkxMDQ1MTA0MTE=', + private: false, + ssh_url: 'git@github.com:mralexgray/....git', + svn_url: 'https://github.com/mralexgray/...', + archived: false, + disabled: false, + has_wiki: false, + homepage: 'https://driesvints.com/blog/getting-started-with-dotfiles', + html_url: 'https://github.com/mralexgray/...', + keys_url: 'https://api.github.com/repos/mralexgray/.../keys{/key_id}', + language: 'Shell', + tags_url: 'https://api.github.com/repos/mralexgray/.../tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/.../git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/....git', + forks_url: 'https://api.github.com/repos/mralexgray/.../forks', + full_name: 'mralexgray/...', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/.../hooks', + pulls_url: 'https://api.github.com/repos/mralexgray/.../pulls{/number}', + pushed_at: '2017-09-15T08:27:32Z', + teams_url: 'https://api.github.com/repos/mralexgray/.../teams', + trees_url: + 'https://api.github.com/repos/mralexgray/.../git/trees{/sha}', + created_at: '2017-09-22T19:19:42Z', + events_url: 'https://api.github.com/repos/mralexgray/.../events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/.../issues{/number}', + labels_url: 'https://api.github.com/repos/mralexgray/.../labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/.../merges', + mirror_url: null, + updated_at: '2017-09-22T19:20:22Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/.../{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/.../commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/.../compare/{base}...{head}', + description: ':computer: Public repo for my personal dotfiles.', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/.../branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/.../comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/.../contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/.../git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/.../git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/.../releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/.../statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/.../assignees{/user}', + downloads_url: 'https://api.github.com/repos/mralexgray/.../downloads', + has_downloads: true, + languages_url: 'https://api.github.com/repos/mralexgray/.../languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/.../milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/.../stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/.../deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/.../git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/.../subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/.../contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/.../issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/.../subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/.../collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/.../issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/.../notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 58656723, + url: 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol', + fork: true, + name: '2200087-Serial-Protocol', + size: 41, + forks: 1, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/2200087-Serial-Protocol.git', + license: { + key: 'gpl-2.0', + url: 'https://api.github.com/licenses/gpl-2.0', + name: 'GNU General Public License v2.0', + node_id: 'MDc6TGljZW5zZTg=', + spdx_id: 'GPL-2.0', + }, + node_id: 'MDEwOlJlcG9zaXRvcnk1ODY1NjcyMw==', + private: false, + ssh_url: 'git@github.com:mralexgray/2200087-Serial-Protocol.git', + svn_url: 'https://github.com/mralexgray/2200087-Serial-Protocol', + archived: false, + disabled: false, + has_wiki: true, + homepage: 'http://daviddworken.com', + html_url: 'https://github.com/mralexgray/2200087-Serial-Protocol', + keys_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/keys{/key_id}', + language: 'Python', + tags_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/2200087-Serial-Protocol.git', + forks_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/forks', + full_name: 'mralexgray/2200087-Serial-Protocol', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/pulls{/number}', + pushed_at: '2016-05-12T16:07:24Z', + teams_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/git/trees{/sha}', + created_at: '2016-05-12T16:05:28Z', + events_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/merges', + mirror_url: null, + updated_at: '2016-05-12T16:05:30Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/compare/{base}...{head}', + description: + "A reverse engineered protocol description and accompanying code for Radioshack's 2200087 multimeter", + forks_count: 1, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 13121042, + url: 'https://api.github.com/repos/mralexgray/ace', + fork: true, + name: 'ace', + size: 21080, + forks: 1, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/ace.git', + license: { + key: 'other', + url: null, + name: 'Other', + node_id: 'MDc6TGljZW5zZTA=', + spdx_id: 'NOASSERTION', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkxMzEyMTA0Mg==', + private: false, + ssh_url: 'git@github.com:mralexgray/ace.git', + svn_url: 'https://github.com/mralexgray/ace', + archived: false, + disabled: false, + has_wiki: true, + homepage: 'http://ace.c9.io', + html_url: 'https://github.com/mralexgray/ace', + keys_url: 'https://api.github.com/repos/mralexgray/ace/keys{/key_id}', + language: 'JavaScript', + tags_url: 'https://api.github.com/repos/mralexgray/ace/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/ace/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/ace.git', + forks_url: 'https://api.github.com/repos/mralexgray/ace/forks', + full_name: 'mralexgray/ace', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/ace/hooks', + pulls_url: 'https://api.github.com/repos/mralexgray/ace/pulls{/number}', + pushed_at: '2013-10-26T12:34:48Z', + teams_url: 'https://api.github.com/repos/mralexgray/ace/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/ace/git/trees{/sha}', + created_at: '2013-09-26T11:58:10Z', + events_url: 'https://api.github.com/repos/mralexgray/ace/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/ace/issues{/number}', + labels_url: 'https://api.github.com/repos/mralexgray/ace/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/ace/merges', + mirror_url: null, + updated_at: '2013-10-26T12:34:49Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/ace/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/ace/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/ace/compare/{base}...{head}', + description: 'Ace (Ajax.org Cloud9 Editor)', + forks_count: 1, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/ace/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/ace/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/ace/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/ace/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/ace/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/ace/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/ace/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/ace/assignees{/user}', + downloads_url: 'https://api.github.com/repos/mralexgray/ace/downloads', + has_downloads: true, + languages_url: 'https://api.github.com/repos/mralexgray/ace/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/ace/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/ace/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/ace/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/ace/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/ace/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/ace/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/ace/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/ace/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/ace/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/ace/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/ace/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 10791045, + url: 'https://api.github.com/repos/mralexgray/ACEView', + fork: true, + name: 'ACEView', + size: 1733, + forks: 1, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/ACEView.git', + license: { + key: 'other', + url: null, + name: 'Other', + node_id: 'MDc6TGljZW5zZTA=', + spdx_id: 'NOASSERTION', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkxMDc5MTA0NQ==', + private: false, + ssh_url: 'git@github.com:mralexgray/ACEView.git', + svn_url: 'https://github.com/mralexgray/ACEView', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/ACEView', + keys_url: + 'https://api.github.com/repos/mralexgray/ACEView/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/ACEView/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/ACEView/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/ACEView.git', + forks_url: 'https://api.github.com/repos/mralexgray/ACEView/forks', + full_name: 'mralexgray/ACEView', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/ACEView/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/ACEView/pulls{/number}', + pushed_at: '2014-05-09T01:36:23Z', + teams_url: 'https://api.github.com/repos/mralexgray/ACEView/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/ACEView/git/trees{/sha}', + created_at: '2013-06-19T12:15:04Z', + events_url: 'https://api.github.com/repos/mralexgray/ACEView/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/ACEView/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/ACEView/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/ACEView/merges', + mirror_url: null, + updated_at: '2015-11-24T01:14:10Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/ACEView/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/ACEView/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/ACEView/compare/{base}...{head}', + description: 'Use the wonderful ACE editor in your Cocoa applications', + forks_count: 1, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/ACEView/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/ACEView/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/ACEView/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/ACEView/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/ACEView/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/ACEView/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/ACEView/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/ACEView/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/ACEView/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/ACEView/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/ACEView/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/ACEView/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/ACEView/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/ACEView/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/ACEView/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/ACEView/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/ACEView/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/ACEView/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/ACEView/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/ACEView/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/ACEView/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 13623648, + url: 'https://api.github.com/repos/mralexgray/ActiveLog', + fork: true, + name: 'ActiveLog', + size: 60, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/ActiveLog.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnkxMzYyMzY0OA==', + private: false, + ssh_url: 'git@github.com:mralexgray/ActiveLog.git', + svn_url: 'https://github.com/mralexgray/ActiveLog', + archived: false, + disabled: false, + has_wiki: true, + homepage: 'http://deepitpro.com/en/articles/ActiveLog/info/', + html_url: 'https://github.com/mralexgray/ActiveLog', + keys_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/ActiveLog/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/ActiveLog.git', + forks_url: 'https://api.github.com/repos/mralexgray/ActiveLog/forks', + full_name: 'mralexgray/ActiveLog', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/ActiveLog/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/pulls{/number}', + pushed_at: '2011-07-03T06:28:59Z', + teams_url: 'https://api.github.com/repos/mralexgray/ActiveLog/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/git/trees{/sha}', + created_at: '2013-10-16T15:52:37Z', + events_url: 'https://api.github.com/repos/mralexgray/ActiveLog/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/ActiveLog/merges', + mirror_url: null, + updated_at: '2013-10-16T15:52:37Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/compare/{base}...{head}', + description: 'Shut up all logs with active filter.', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 9716210, + url: 'https://api.github.com/repos/mralexgray/adium', + fork: false, + name: 'adium', + size: 277719, + forks: 37, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/adium.git', + license: { + key: 'other', + url: null, + name: 'Other', + node_id: 'MDc6TGljZW5zZTA=', + spdx_id: 'NOASSERTION', + }, + node_id: 'MDEwOlJlcG9zaXRvcnk5NzE2MjEw', + private: false, + ssh_url: 'git@github.com:mralexgray/adium.git', + svn_url: 'https://github.com/mralexgray/adium', + archived: false, + disabled: false, + has_wiki: false, + homepage: null, + html_url: 'https://github.com/mralexgray/adium', + keys_url: 'https://api.github.com/repos/mralexgray/adium/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/adium/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/adium/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/adium.git', + forks_url: 'https://api.github.com/repos/mralexgray/adium/forks', + full_name: 'mralexgray/adium', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/adium/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/adium/pulls{/number}', + pushed_at: '2013-04-26T16:43:53Z', + teams_url: 'https://api.github.com/repos/mralexgray/adium/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/adium/git/trees{/sha}', + created_at: '2013-04-27T14:59:33Z', + events_url: 'https://api.github.com/repos/mralexgray/adium/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/adium/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/adium/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/adium/merges', + mirror_url: null, + updated_at: '2019-12-11T06:51:45Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/adium/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/adium/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/adium/compare/{base}...{head}', + description: 'Official mirror of hg.adium.im', + forks_count: 37, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/adium/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/adium/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/adium/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/adium/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/adium/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/adium/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/adium/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/adium/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/adium/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/adium/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/adium/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/adium/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/adium/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/adium/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/adium/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/adium/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/adium/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/adium/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/adium/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/adium/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/adium/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 12752329, + url: 'https://api.github.com/repos/mralexgray/ADLivelyTableView', + fork: true, + name: 'ADLivelyTableView', + size: 73, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/ADLivelyTableView.git', + license: { + key: 'other', + url: null, + name: 'Other', + node_id: 'MDc6TGljZW5zZTA=', + spdx_id: 'NOASSERTION', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkxMjc1MjMyOQ==', + private: false, + ssh_url: 'git@github.com:mralexgray/ADLivelyTableView.git', + svn_url: 'https://github.com/mralexgray/ADLivelyTableView', + archived: false, + disabled: false, + has_wiki: true, + homepage: 'http://applidium.com/en/news/lively_uitableview/', + html_url: 'https://github.com/mralexgray/ADLivelyTableView', + keys_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/keys{/key_id}', + language: 'Objective-C', + tags_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/ADLivelyTableView.git', + forks_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/forks', + full_name: 'mralexgray/ADLivelyTableView', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/pulls{/number}', + pushed_at: '2012-05-10T10:40:15Z', + teams_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/git/trees{/sha}', + created_at: '2013-09-11T09:18:01Z', + events_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/merges', + mirror_url: null, + updated_at: '2013-09-11T09:18:03Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/compare/{base}...{head}', + description: 'Lively UITableView', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 5697379, + url: 'https://api.github.com/repos/mralexgray/AFIncrementalStore', + fork: true, + name: 'AFIncrementalStore', + size: 139, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/AFIncrementalStore.git', + license: { + key: 'mit', + url: 'https://api.github.com/licenses/mit', + name: 'MIT License', + node_id: 'MDc6TGljZW5zZTEz', + spdx_id: 'MIT', + }, + node_id: 'MDEwOlJlcG9zaXRvcnk1Njk3Mzc5', + private: false, + ssh_url: 'git@github.com:mralexgray/AFIncrementalStore.git', + svn_url: 'https://github.com/mralexgray/AFIncrementalStore', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/AFIncrementalStore', + keys_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/keys{/key_id}', + language: 'Objective-C', + tags_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/AFIncrementalStore.git', + forks_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/forks', + full_name: 'mralexgray/AFIncrementalStore', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/pulls{/number}', + pushed_at: '2012-09-01T22:46:25Z', + teams_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/git/trees{/sha}', + created_at: '2012-09-06T04:20:33Z', + events_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/merges', + mirror_url: null, + updated_at: '2013-01-12T03:15:29Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/compare/{base}...{head}', + description: 'Core Data Persistence with AFNetworking, Done Right', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 6969621, + url: 'https://api.github.com/repos/mralexgray/AFNetworking', + fork: true, + name: 'AFNetworking', + size: 4341, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/AFNetworking.git', + license: { + key: 'mit', + url: 'https://api.github.com/licenses/mit', + name: 'MIT License', + node_id: 'MDc6TGljZW5zZTEz', + spdx_id: 'MIT', + }, + node_id: 'MDEwOlJlcG9zaXRvcnk2OTY5NjIx', + private: false, + ssh_url: 'git@github.com:mralexgray/AFNetworking.git', + svn_url: 'https://github.com/mralexgray/AFNetworking', + archived: false, + disabled: false, + has_wiki: true, + homepage: 'http://afnetworking.com', + html_url: 'https://github.com/mralexgray/AFNetworking', + keys_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/AFNetworking/tags', + watchers: 2, + blobs_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/AFNetworking.git', + forks_url: 'https://api.github.com/repos/mralexgray/AFNetworking/forks', + full_name: 'mralexgray/AFNetworking', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/AFNetworking/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/pulls{/number}', + pushed_at: '2014-01-24T07:14:32Z', + teams_url: 'https://api.github.com/repos/mralexgray/AFNetworking/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/git/trees{/sha}', + created_at: '2012-12-02T17:00:04Z', + events_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/merges', + mirror_url: null, + updated_at: '2014-01-24T07:14:33Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/compare/{base}...{head}', + description: 'A delightful iOS and OS X networking framework', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/stargazers', + watchers_count: 2, + deployments_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/issues/events{/number}', + stargazers_count: 2, + subscription_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 9485541, + url: 'https://api.github.com/repos/mralexgray/AGNSSplitView', + fork: true, + name: 'AGNSSplitView', + size: 68, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/AGNSSplitView.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnk5NDg1NTQx', + private: false, + ssh_url: 'git@github.com:mralexgray/AGNSSplitView.git', + svn_url: 'https://github.com/mralexgray/AGNSSplitView', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/AGNSSplitView', + keys_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/AGNSSplitView/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/AGNSSplitView.git', + forks_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/forks', + full_name: 'mralexgray/AGNSSplitView', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/pulls{/number}', + pushed_at: '2013-02-26T00:32:32Z', + teams_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/git/trees{/sha}', + created_at: '2013-04-17T00:10:13Z', + events_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/merges', + mirror_url: null, + updated_at: '2013-04-17T00:10:13Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/compare/{base}...{head}', + description: 'Simple NSSplitView additions.', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 12767784, + url: 'https://api.github.com/repos/mralexgray/AGScopeBar', + fork: true, + name: 'AGScopeBar', + size: 64, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/AGScopeBar.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnkxMjc2Nzc4NA==', + private: false, + ssh_url: 'git@github.com:mralexgray/AGScopeBar.git', + svn_url: 'https://github.com/mralexgray/AGScopeBar', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/AGScopeBar', + keys_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/AGScopeBar/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/AGScopeBar.git', + forks_url: 'https://api.github.com/repos/mralexgray/AGScopeBar/forks', + full_name: 'mralexgray/AGScopeBar', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/AGScopeBar/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/pulls{/number}', + pushed_at: '2013-05-07T03:35:29Z', + teams_url: 'https://api.github.com/repos/mralexgray/AGScopeBar/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/git/trees{/sha}', + created_at: '2013-09-11T21:06:54Z', + events_url: 'https://api.github.com/repos/mralexgray/AGScopeBar/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/AGScopeBar/merges', + mirror_url: null, + updated_at: '2013-09-11T21:06:54Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/compare/{base}...{head}', + description: 'Custom scope bar implementation for Cocoa', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 31829499, + url: 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin', + fork: true, + name: 'agvtool-xcode-plugin', + size: 102, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/agvtool-xcode-plugin.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnkzMTgyOTQ5OQ==', + private: false, + ssh_url: 'git@github.com:mralexgray/agvtool-xcode-plugin.git', + svn_url: 'https://github.com/mralexgray/agvtool-xcode-plugin', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/agvtool-xcode-plugin', + keys_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/keys{/key_id}', + language: 'Objective-C', + tags_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/agvtool-xcode-plugin.git', + forks_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/forks', + full_name: 'mralexgray/agvtool-xcode-plugin', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/pulls{/number}', + pushed_at: '2015-03-08T00:04:31Z', + teams_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/git/trees{/sha}', + created_at: '2015-03-07T22:15:38Z', + events_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/merges', + mirror_url: null, + updated_at: '2015-03-07T22:15:41Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/compare/{base}...{head}', + description: 'this is a plugin wrapper for agvtool for xcode.', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 9227846, + url: 'https://api.github.com/repos/mralexgray/AHContentBrowser', + fork: true, + name: 'AHContentBrowser', + size: 223, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/AHContentBrowser.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnk5MjI3ODQ2', + private: false, + ssh_url: 'git@github.com:mralexgray/AHContentBrowser.git', + svn_url: 'https://github.com/mralexgray/AHContentBrowser', + archived: false, + disabled: false, + has_wiki: true, + homepage: '', + html_url: 'https://github.com/mralexgray/AHContentBrowser', + keys_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/keys{/key_id}', + language: 'Objective-C', + tags_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/AHContentBrowser.git', + forks_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/forks', + full_name: 'mralexgray/AHContentBrowser', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/pulls{/number}', + pushed_at: '2013-03-13T17:38:23Z', + teams_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/git/trees{/sha}', + created_at: '2013-04-04T20:56:16Z', + events_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/merges', + mirror_url: null, + updated_at: '2015-10-22T05:00:24Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/compare/{base}...{head}', + description: + 'A Mac only webview that loads a fast readable version of the website if available.', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 37430328, + url: 'https://api.github.com/repos/mralexgray/AHLaunchCtl', + fork: true, + name: 'AHLaunchCtl', + size: 592, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/AHLaunchCtl.git', + license: { + key: 'mit', + url: 'https://api.github.com/licenses/mit', + name: 'MIT License', + node_id: 'MDc6TGljZW5zZTEz', + spdx_id: 'MIT', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkzNzQzMDMyOA==', + private: false, + ssh_url: 'git@github.com:mralexgray/AHLaunchCtl.git', + svn_url: 'https://github.com/mralexgray/AHLaunchCtl', + archived: false, + disabled: false, + has_wiki: true, + homepage: '', + html_url: 'https://github.com/mralexgray/AHLaunchCtl', + keys_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/AHLaunchCtl/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/AHLaunchCtl.git', + forks_url: 'https://api.github.com/repos/mralexgray/AHLaunchCtl/forks', + full_name: 'mralexgray/AHLaunchCtl', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/AHLaunchCtl/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/pulls{/number}', + pushed_at: '2015-05-26T18:50:48Z', + teams_url: 'https://api.github.com/repos/mralexgray/AHLaunchCtl/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/git/trees{/sha}', + created_at: '2015-06-14T21:31:03Z', + events_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/merges', + mirror_url: null, + updated_at: '2015-06-14T21:31:04Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/compare/{base}...{head}', + description: 'LaunchD Framework for Cocoa Apps', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 9167473, + url: 'https://api.github.com/repos/mralexgray/AHLayout', + fork: true, + name: 'AHLayout', + size: 359, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/AHLayout.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnk5MTY3NDcz', + private: false, + ssh_url: 'git@github.com:mralexgray/AHLayout.git', + svn_url: 'https://github.com/mralexgray/AHLayout', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/AHLayout', + keys_url: + 'https://api.github.com/repos/mralexgray/AHLayout/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/AHLayout/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/AHLayout/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/AHLayout.git', + forks_url: 'https://api.github.com/repos/mralexgray/AHLayout/forks', + full_name: 'mralexgray/AHLayout', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/AHLayout/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/AHLayout/pulls{/number}', + pushed_at: '2013-07-08T02:31:14Z', + teams_url: 'https://api.github.com/repos/mralexgray/AHLayout/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/AHLayout/git/trees{/sha}', + created_at: '2013-04-02T10:10:30Z', + events_url: 'https://api.github.com/repos/mralexgray/AHLayout/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/AHLayout/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/AHLayout/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/AHLayout/merges', + mirror_url: null, + updated_at: '2013-07-08T02:31:17Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/AHLayout/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/AHLayout/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/AHLayout/compare/{base}...{head}', + description: 'AHLayout', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/AHLayout/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/AHLayout/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/AHLayout/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/AHLayout/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/AHLayout/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/AHLayout/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/AHLayout/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/AHLayout/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/AHLayout/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/AHLayout/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/AHLayout/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/AHLayout/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/AHLayout/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/AHLayout/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/AHLayout/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/AHLayout/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/AHLayout/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/AHLayout/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/AHLayout/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/AHLayout/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/AHLayout/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 18450201, + url: 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework', + fork: true, + name: 'Airmail-Plug-In-Framework', + size: 888, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/Airmail-Plug-In-Framework.git', + license: { + key: 'gpl-2.0', + url: 'https://api.github.com/licenses/gpl-2.0', + name: 'GNU General Public License v2.0', + node_id: 'MDc6TGljZW5zZTg=', + spdx_id: 'GPL-2.0', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkxODQ1MDIwMQ==', + private: false, + ssh_url: 'git@github.com:mralexgray/Airmail-Plug-In-Framework.git', + svn_url: 'https://github.com/mralexgray/Airmail-Plug-In-Framework', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/Airmail-Plug-In-Framework', + keys_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/keys{/key_id}', + language: null, + tags_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/git/blobs{/sha}', + clone_url: + 'https://github.com/mralexgray/Airmail-Plug-In-Framework.git', + forks_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/forks', + full_name: 'mralexgray/Airmail-Plug-In-Framework', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/pulls{/number}', + pushed_at: '2014-03-27T15:42:19Z', + teams_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/git/trees{/sha}', + created_at: '2014-04-04T19:33:54Z', + events_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/merges', + mirror_url: null, + updated_at: '2014-11-23T19:31:04Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/compare/{base}...{head}', + description: null, + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 5203219, + url: 'https://api.github.com/repos/mralexgray/AJS-iTunes-API', + fork: true, + name: 'AJS-iTunes-API', + size: 103, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/AJS-iTunes-API.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnk1MjAzMjE5', + private: false, + ssh_url: 'git@github.com:mralexgray/AJS-iTunes-API.git', + svn_url: 'https://github.com/mralexgray/AJS-iTunes-API', + archived: false, + disabled: false, + has_wiki: true, + homepage: '', + html_url: 'https://github.com/mralexgray/AJS-iTunes-API', + keys_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/tags', + watchers: 2, + blobs_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/AJS-iTunes-API.git', + forks_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/forks', + full_name: 'mralexgray/AJS-iTunes-API', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/pulls{/number}', + pushed_at: '2011-10-30T22:26:48Z', + teams_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/git/trees{/sha}', + created_at: '2012-07-27T10:20:58Z', + events_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/merges', + mirror_url: null, + updated_at: '2013-01-11T11:00:05Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/compare/{base}...{head}', + description: + 'Cocoa wrapper for the iTunes search API - for iOS and Mac OSX projects', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/stargazers', + watchers_count: 2, + deployments_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/issues/events{/number}', + stargazers_count: 2, + subscription_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 10093801, + url: 'https://api.github.com/repos/mralexgray/Alcatraz', + fork: true, + name: 'Alcatraz', + size: 3668, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/Alcatraz.git', + license: { + key: 'mit', + url: 'https://api.github.com/licenses/mit', + name: 'MIT License', + node_id: 'MDc6TGljZW5zZTEz', + spdx_id: 'MIT', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkxMDA5MzgwMQ==', + private: false, + ssh_url: 'git@github.com:mralexgray/Alcatraz.git', + svn_url: 'https://github.com/mralexgray/Alcatraz', + archived: false, + disabled: false, + has_wiki: false, + homepage: 'mneorr.github.com/Alcatraz', + html_url: 'https://github.com/mralexgray/Alcatraz', + keys_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/Alcatraz/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/Alcatraz.git', + forks_url: 'https://api.github.com/repos/mralexgray/Alcatraz/forks', + full_name: 'mralexgray/Alcatraz', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/Alcatraz/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/pulls{/number}', + pushed_at: '2014-03-19T12:50:37Z', + teams_url: 'https://api.github.com/repos/mralexgray/Alcatraz/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/git/trees{/sha}', + created_at: '2013-05-16T04:41:13Z', + events_url: 'https://api.github.com/repos/mralexgray/Alcatraz/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/Alcatraz/merges', + mirror_url: null, + updated_at: '2014-03-19T20:38:35Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/compare/{base}...{head}', + description: 'The most awesome (and only) Xcode package manager!', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 12916552, + url: 'https://api.github.com/repos/mralexgray/alcatraz-packages', + fork: true, + name: 'alcatraz-packages', + size: 826, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/alcatraz-packages.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnkxMjkxNjU1Mg==', + private: false, + ssh_url: 'git@github.com:mralexgray/alcatraz-packages.git', + svn_url: 'https://github.com/mralexgray/alcatraz-packages', + archived: false, + disabled: false, + has_wiki: true, + homepage: 'mneorr.github.com/Alcatraz', + html_url: 'https://github.com/mralexgray/alcatraz-packages', + keys_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/keys{/key_id}', + language: 'Ruby', + tags_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/alcatraz-packages.git', + forks_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/forks', + full_name: 'mralexgray/alcatraz-packages', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/pulls{/number}', + pushed_at: '2015-12-14T16:21:31Z', + teams_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/git/trees{/sha}', + created_at: '2013-09-18T07:15:24Z', + events_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/merges', + mirror_url: null, + updated_at: '2015-11-10T20:52:30Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/compare/{base}...{head}', + description: 'Package list repository for Alcatraz', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 44278362, + url: 'https://api.github.com/repos/mralexgray/alexicons', + fork: true, + name: 'alexicons', + size: 257, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/alexicons.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnk0NDI3ODM2Mg==', + private: false, + ssh_url: 'git@github.com:mralexgray/alexicons.git', + svn_url: 'https://github.com/mralexgray/alexicons', + archived: false, + disabled: false, + has_wiki: false, + homepage: null, + html_url: 'https://github.com/mralexgray/alexicons', + keys_url: + 'https://api.github.com/repos/mralexgray/alexicons/keys{/key_id}', + language: 'CoffeeScript', + tags_url: 'https://api.github.com/repos/mralexgray/alexicons/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/alexicons/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/alexicons.git', + forks_url: 'https://api.github.com/repos/mralexgray/alexicons/forks', + full_name: 'mralexgray/alexicons', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/alexicons/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/alexicons/pulls{/number}', + pushed_at: '2015-10-16T03:57:51Z', + teams_url: 'https://api.github.com/repos/mralexgray/alexicons/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/alexicons/git/trees{/sha}', + created_at: '2015-10-14T21:49:39Z', + events_url: 'https://api.github.com/repos/mralexgray/alexicons/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/alexicons/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/alexicons/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/alexicons/merges', + mirror_url: null, + updated_at: '2015-10-15T06:20:08Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/alexicons/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/alexicons/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/alexicons/compare/{base}...{head}', + description: 'Get popular cat names', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/alexicons/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/alexicons/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/alexicons/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/alexicons/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/alexicons/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/alexicons/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/alexicons/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/alexicons/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/alexicons/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/alexicons/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/alexicons/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/alexicons/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/alexicons/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/alexicons/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/alexicons/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/alexicons/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/alexicons/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/alexicons/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/alexicons/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/alexicons/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/alexicons/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 10476467, + url: 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate', + fork: true, + name: 'Alfred-Google-Translate', + size: 103, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/Alfred-Google-Translate.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnkxMDQ3NjQ2Nw==', + private: false, + ssh_url: 'git@github.com:mralexgray/Alfred-Google-Translate.git', + svn_url: 'https://github.com/mralexgray/Alfred-Google-Translate', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/Alfred-Google-Translate', + keys_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/keys{/key_id}', + language: 'Shell', + tags_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/Alfred-Google-Translate.git', + forks_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/forks', + full_name: 'mralexgray/Alfred-Google-Translate', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/pulls{/number}', + pushed_at: '2013-01-12T19:39:03Z', + teams_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/git/trees{/sha}', + created_at: '2013-06-04T10:45:10Z', + events_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/merges', + mirror_url: null, + updated_at: '2013-06-04T10:45:10Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/compare/{base}...{head}', + description: + 'Extension for Alfred that will do a Google translate for you', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 5524019, + url: 'https://api.github.com/repos/mralexgray/Amber', + fork: false, + name: 'Amber', + size: 48, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/Amber.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnk1NTI0MDE5', + private: false, + ssh_url: 'git@github.com:mralexgray/Amber.git', + svn_url: 'https://github.com/mralexgray/Amber', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/Amber', + keys_url: 'https://api.github.com/repos/mralexgray/Amber/keys{/key_id}', + language: null, + tags_url: 'https://api.github.com/repos/mralexgray/Amber/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/Amber/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/Amber.git', + forks_url: 'https://api.github.com/repos/mralexgray/Amber/forks', + full_name: 'mralexgray/Amber', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/Amber/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/Amber/pulls{/number}', + pushed_at: '2012-08-23T10:38:25Z', + teams_url: 'https://api.github.com/repos/mralexgray/Amber/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/Amber/git/trees{/sha}', + created_at: '2012-08-23T10:38:24Z', + events_url: 'https://api.github.com/repos/mralexgray/Amber/events', + has_issues: true, + issues_url: + 'https://api.github.com/repos/mralexgray/Amber/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/Amber/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/Amber/merges', + mirror_url: null, + updated_at: '2013-01-11T22:25:35Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/Amber/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/Amber/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/Amber/compare/{base}...{head}', + description: 'Fork of the difficult-to-deal-with Amber.framework', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/Amber/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/Amber/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/Amber/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/Amber/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/Amber/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/Amber/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/Amber/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/Amber/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/Amber/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/Amber/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/Amber/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/Amber/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/Amber/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/Amber/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/Amber/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/Amber/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/Amber/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/Amber/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/Amber/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/Amber/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/Amber/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 10809060, + url: 'https://api.github.com/repos/mralexgray/Amethyst', + fork: true, + name: 'Amethyst', + size: 12623, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/Amethyst.git', + license: { + key: 'mit', + url: 'https://api.github.com/licenses/mit', + name: 'MIT License', + node_id: 'MDc6TGljZW5zZTEz', + spdx_id: 'MIT', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkxMDgwOTA2MA==', + private: false, + ssh_url: 'git@github.com:mralexgray/Amethyst.git', + svn_url: 'https://github.com/mralexgray/Amethyst', + archived: false, + disabled: false, + has_wiki: true, + homepage: 'http://ianyh.github.io/Amethyst/', + html_url: 'https://github.com/mralexgray/Amethyst', + keys_url: + 'https://api.github.com/repos/mralexgray/Amethyst/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/Amethyst/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/Amethyst/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/Amethyst.git', + forks_url: 'https://api.github.com/repos/mralexgray/Amethyst/forks', + full_name: 'mralexgray/Amethyst', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/Amethyst/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/Amethyst/pulls{/number}', + pushed_at: '2013-06-18T02:54:11Z', + teams_url: 'https://api.github.com/repos/mralexgray/Amethyst/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/Amethyst/git/trees{/sha}', + created_at: '2013-06-20T00:34:22Z', + events_url: 'https://api.github.com/repos/mralexgray/Amethyst/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/Amethyst/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/Amethyst/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/Amethyst/merges', + mirror_url: null, + updated_at: '2013-06-20T00:34:22Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/Amethyst/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/Amethyst/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/Amethyst/compare/{base}...{head}', + description: 'Tiling window manager for OS X.', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/Amethyst/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/Amethyst/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/Amethyst/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/Amethyst/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/Amethyst/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/Amethyst/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/Amethyst/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/Amethyst/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/Amethyst/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/Amethyst/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/Amethyst/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/Amethyst/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/Amethyst/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/Amethyst/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/Amethyst/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/Amethyst/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/Amethyst/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/Amethyst/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/Amethyst/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/Amethyst/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/Amethyst/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 3684286, + url: 'https://api.github.com/repos/mralexgray/Animated-Paths', + fork: true, + name: 'Animated-Paths', + size: 411, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/Animated-Paths.git', + license: { + key: 'other', + url: null, + name: 'Other', + node_id: 'MDc6TGljZW5zZTA=', + spdx_id: 'NOASSERTION', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkzNjg0Mjg2', + private: false, + ssh_url: 'git@github.com:mralexgray/Animated-Paths.git', + svn_url: 'https://github.com/mralexgray/Animated-Paths', + archived: false, + disabled: false, + has_wiki: true, + homepage: + 'http://oleb.net/blog/2010/12/animating-drawing-of-cgpath-with-cashapelayer/', + html_url: 'https://github.com/mralexgray/Animated-Paths', + keys_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/Animated-Paths/tags', + watchers: 2, + blobs_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/Animated-Paths.git', + forks_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/forks', + full_name: 'mralexgray/Animated-Paths', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/pulls{/number}', + pushed_at: '2010-12-30T20:56:51Z', + teams_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/git/trees{/sha}', + created_at: '2012-03-11T02:56:38Z', + events_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/merges', + mirror_url: null, + updated_at: '2013-01-08T04:12:21Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/compare/{base}...{head}', + description: + 'Demo project: Animating the drawing of a CGPath with CAShapeLayer.strokeEnd', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/stargazers', + watchers_count: 2, + deployments_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/issues/events{/number}', + stargazers_count: 2, + subscription_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 16662874, + url: 'https://api.github.com/repos/mralexgray/AnsiLove.framework', + fork: true, + name: 'AnsiLove.framework', + size: 3780, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/AnsiLove.framework.git', + license: { + key: 'other', + url: null, + name: 'Other', + node_id: 'MDc6TGljZW5zZTA=', + spdx_id: 'NOASSERTION', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkxNjY2Mjg3NA==', + private: false, + ssh_url: 'git@github.com:mralexgray/AnsiLove.framework.git', + svn_url: 'https://github.com/mralexgray/AnsiLove.framework', + archived: false, + disabled: false, + has_wiki: false, + homepage: 'http://byteproject.net', + html_url: 'https://github.com/mralexgray/AnsiLove.framework', + keys_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/keys{/key_id}', + language: 'M', + tags_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/AnsiLove.framework.git', + forks_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/forks', + full_name: 'mralexgray/AnsiLove.framework', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/pulls{/number}', + pushed_at: '2013-10-04T14:08:38Z', + teams_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/git/trees{/sha}', + created_at: '2014-02-09T08:30:27Z', + events_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/merges', + mirror_url: null, + updated_at: '2015-01-13T20:41:46Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/compare/{base}...{head}', + description: 'Cocoa Framework for rendering ANSi / ASCII art', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 5189563, + url: 'https://api.github.com/repos/mralexgray/ANTrackBar', + fork: true, + name: 'ANTrackBar', + size: 94, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/ANTrackBar.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnk1MTg5NTYz', + private: false, + ssh_url: 'git@github.com:mralexgray/ANTrackBar.git', + svn_url: 'https://github.com/mralexgray/ANTrackBar', + archived: false, + disabled: false, + has_wiki: true, + homepage: '', + html_url: 'https://github.com/mralexgray/ANTrackBar', + keys_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/ANTrackBar/tags', + watchers: 2, + blobs_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/ANTrackBar.git', + forks_url: 'https://api.github.com/repos/mralexgray/ANTrackBar/forks', + full_name: 'mralexgray/ANTrackBar', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/ANTrackBar/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/pulls{/number}', + pushed_at: '2012-03-09T01:40:02Z', + teams_url: 'https://api.github.com/repos/mralexgray/ANTrackBar/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/git/trees{/sha}', + created_at: '2012-07-26T08:17:22Z', + events_url: 'https://api.github.com/repos/mralexgray/ANTrackBar/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/ANTrackBar/merges', + mirror_url: null, + updated_at: '2013-01-11T10:29:56Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/compare/{base}...{head}', + description: 'An easy-to-use Cocoa seek bar with a pleasing appearance', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/stargazers', + watchers_count: 2, + deployments_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/issues/events{/number}', + stargazers_count: 2, + subscription_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 16240152, + url: 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C', + fork: true, + name: 'AOP-in-Objective-C', + size: 340, + forks: 1, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/AOP-in-Objective-C.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnkxNjI0MDE1Mg==', + private: false, + ssh_url: 'git@github.com:mralexgray/AOP-in-Objective-C.git', + svn_url: 'https://github.com/mralexgray/AOP-in-Objective-C', + archived: false, + disabled: false, + has_wiki: true, + homepage: 'http://innoli.hu/en/opensource/', + html_url: 'https://github.com/mralexgray/AOP-in-Objective-C', + keys_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/keys{/key_id}', + language: 'Objective-C', + tags_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/AOP-in-Objective-C.git', + forks_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/forks', + full_name: 'mralexgray/AOP-in-Objective-C', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/pulls{/number}', + pushed_at: '2014-02-12T16:23:20Z', + teams_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/git/trees{/sha}', + created_at: '2014-01-25T21:18:04Z', + events_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/merges', + mirror_url: null, + updated_at: '2014-06-19T19:38:12Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/compare/{base}...{head}', + description: + 'An NSProxy based library for easily enabling AOP like functionality in Objective-C.', + forks_count: 1, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/languages', + default_branch: 'travis-coveralls', + milestones_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 13141936, + url: 'https://api.github.com/repos/mralexgray/Apaxy', + fork: true, + name: 'Apaxy', + size: 113, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/Apaxy.git', + license: { + key: 'unlicense', + url: 'https://api.github.com/licenses/unlicense', + name: 'The Unlicense', + node_id: 'MDc6TGljZW5zZTE1', + spdx_id: 'Unlicense', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkxMzE0MTkzNg==', + private: false, + ssh_url: 'git@github.com:mralexgray/Apaxy.git', + svn_url: 'https://github.com/mralexgray/Apaxy', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/Apaxy', + keys_url: 'https://api.github.com/repos/mralexgray/Apaxy/keys{/key_id}', + language: 'CSS', + tags_url: 'https://api.github.com/repos/mralexgray/Apaxy/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/Apaxy/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/Apaxy.git', + forks_url: 'https://api.github.com/repos/mralexgray/Apaxy/forks', + full_name: 'mralexgray/Apaxy', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/Apaxy/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/Apaxy/pulls{/number}', + pushed_at: '2013-08-02T16:01:32Z', + teams_url: 'https://api.github.com/repos/mralexgray/Apaxy/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/Apaxy/git/trees{/sha}', + created_at: '2013-09-27T05:05:35Z', + events_url: 'https://api.github.com/repos/mralexgray/Apaxy/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/Apaxy/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/Apaxy/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/Apaxy/merges', + mirror_url: null, + updated_at: '2018-02-16T21:40:24Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/Apaxy/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/Apaxy/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/Apaxy/compare/{base}...{head}', + description: + 'A simple, customisable theme for your Apache directory listing.', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/Apaxy/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/Apaxy/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/Apaxy/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/Apaxy/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/Apaxy/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/Apaxy/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/Apaxy/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/Apaxy/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/Apaxy/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/Apaxy/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/Apaxy/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/Apaxy/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/Apaxy/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/Apaxy/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/Apaxy/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/Apaxy/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/Apaxy/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/Apaxy/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/Apaxy/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/Apaxy/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/Apaxy/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 20027360, + url: 'https://api.github.com/repos/mralexgray/app', + fork: true, + name: 'app', + size: 1890, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/app.git', + license: { + key: 'other', + url: null, + name: 'Other', + node_id: 'MDc6TGljZW5zZTA=', + spdx_id: 'NOASSERTION', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkyMDAyNzM2MA==', + private: false, + ssh_url: 'git@github.com:mralexgray/app.git', + svn_url: 'https://github.com/mralexgray/app', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/app', + keys_url: 'https://api.github.com/repos/mralexgray/app/keys{/key_id}', + language: 'JavaScript', + tags_url: 'https://api.github.com/repos/mralexgray/app/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/app/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/app.git', + forks_url: 'https://api.github.com/repos/mralexgray/app/forks', + full_name: 'mralexgray/app', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/app/hooks', + pulls_url: 'https://api.github.com/repos/mralexgray/app/pulls{/number}', + pushed_at: '2014-05-20T19:51:38Z', + teams_url: 'https://api.github.com/repos/mralexgray/app/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/app/git/trees{/sha}', + created_at: '2014-05-21T15:54:20Z', + events_url: 'https://api.github.com/repos/mralexgray/app/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/app/issues{/number}', + labels_url: 'https://api.github.com/repos/mralexgray/app/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/app/merges', + mirror_url: null, + updated_at: '2014-05-21T15:54:22Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/app/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/app/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/app/compare/{base}...{head}', + description: 'Instant mobile web app creation', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/app/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/app/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/app/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/app/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/app/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/app/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/app/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/app/assignees{/user}', + downloads_url: 'https://api.github.com/repos/mralexgray/app/downloads', + has_downloads: true, + languages_url: 'https://api.github.com/repos/mralexgray/app/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/app/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/app/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/app/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/app/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/app/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/app/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/app/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/app/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/app/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/app/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/app/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + ], + data2: [ + { + id: 6104546, + url: 'https://api.github.com/repos/mralexgray/-REPONAME', + fork: false, + name: '-REPONAME', + size: 48, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/-REPONAME.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnk2MTA0NTQ2', + private: false, + ssh_url: 'git@github.com:mralexgray/-REPONAME.git', + svn_url: 'https://github.com/mralexgray/-REPONAME', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/-REPONAME', + keys_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/keys{/key_id}', + language: null, + tags_url: 'https://api.github.com/repos/mralexgray/-REPONAME/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/-REPONAME.git', + forks_url: 'https://api.github.com/repos/mralexgray/-REPONAME/forks', + full_name: 'mralexgray/-REPONAME', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/-REPONAME/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/pulls{/number}', + pushed_at: '2012-10-06T16:37:39Z', + teams_url: 'https://api.github.com/repos/mralexgray/-REPONAME/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/git/trees{/sha}', + created_at: '2012-10-06T16:37:39Z', + events_url: 'https://api.github.com/repos/mralexgray/-REPONAME/events', + has_issues: true, + issues_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/-REPONAME/merges', + mirror_url: null, + updated_at: '2013-01-12T13:39:30Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/compare/{base}...{head}', + description: null, + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 104510411, + url: 'https://api.github.com/repos/mralexgray/...', + fork: true, + name: '...', + size: 113, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/....git', + license: { + key: 'mit', + url: 'https://api.github.com/licenses/mit', + name: 'MIT License', + node_id: 'MDc6TGljZW5zZTEz', + spdx_id: 'MIT', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkxMDQ1MTA0MTE=', + private: false, + ssh_url: 'git@github.com:mralexgray/....git', + svn_url: 'https://github.com/mralexgray/...', + archived: false, + disabled: false, + has_wiki: false, + homepage: 'https://driesvints.com/blog/getting-started-with-dotfiles', + html_url: 'https://github.com/mralexgray/...', + keys_url: 'https://api.github.com/repos/mralexgray/.../keys{/key_id}', + language: 'Shell', + tags_url: 'https://api.github.com/repos/mralexgray/.../tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/.../git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/....git', + forks_url: 'https://api.github.com/repos/mralexgray/.../forks', + full_name: 'mralexgray/...', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/.../hooks', + pulls_url: 'https://api.github.com/repos/mralexgray/.../pulls{/number}', + pushed_at: '2017-09-15T08:27:32Z', + teams_url: 'https://api.github.com/repos/mralexgray/.../teams', + trees_url: + 'https://api.github.com/repos/mralexgray/.../git/trees{/sha}', + created_at: '2017-09-22T19:19:42Z', + events_url: 'https://api.github.com/repos/mralexgray/.../events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/.../issues{/number}', + labels_url: 'https://api.github.com/repos/mralexgray/.../labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/.../merges', + mirror_url: null, + updated_at: '2017-09-22T19:20:22Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/.../{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/.../commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/.../compare/{base}...{head}', + description: ':computer: Public repo for my personal dotfiles.', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/.../branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/.../comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/.../contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/.../git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/.../git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/.../releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/.../statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/.../assignees{/user}', + downloads_url: 'https://api.github.com/repos/mralexgray/.../downloads', + has_downloads: true, + languages_url: 'https://api.github.com/repos/mralexgray/.../languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/.../milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/.../stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/.../deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/.../git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/.../subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/.../contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/.../issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/.../subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/.../collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/.../issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/.../notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 58656723, + url: 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol', + fork: true, + name: '2200087-Serial-Protocol', + size: 41, + forks: 1, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/2200087-Serial-Protocol.git', + license: { + key: 'gpl-2.0', + url: 'https://api.github.com/licenses/gpl-2.0', + name: 'GNU General Public License v2.0', + node_id: 'MDc6TGljZW5zZTg=', + spdx_id: 'GPL-2.0', + }, + node_id: 'MDEwOlJlcG9zaXRvcnk1ODY1NjcyMw==', + private: false, + ssh_url: 'git@github.com:mralexgray/2200087-Serial-Protocol.git', + svn_url: 'https://github.com/mralexgray/2200087-Serial-Protocol', + archived: false, + disabled: false, + has_wiki: true, + homepage: 'http://daviddworken.com', + html_url: 'https://github.com/mralexgray/2200087-Serial-Protocol', + keys_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/keys{/key_id}', + language: 'Python', + tags_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/2200087-Serial-Protocol.git', + forks_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/forks', + full_name: 'mralexgray/2200087-Serial-Protocol', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/pulls{/number}', + pushed_at: '2016-05-12T16:07:24Z', + teams_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/git/trees{/sha}', + created_at: '2016-05-12T16:05:28Z', + events_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/merges', + mirror_url: null, + updated_at: '2016-05-12T16:05:30Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/compare/{base}...{head}', + description: + "A reverse engineered protocol description and accompanying code for Radioshack's 2200087 multimeter", + forks_count: 1, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 13121042, + url: 'https://api.github.com/repos/mralexgray/ace', + fork: true, + name: 'ace', + size: 21080, + forks: 1, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/ace.git', + license: { + key: 'other', + url: null, + name: 'Other', + node_id: 'MDc6TGljZW5zZTA=', + spdx_id: 'NOASSERTION', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkxMzEyMTA0Mg==', + private: false, + ssh_url: 'git@github.com:mralexgray/ace.git', + svn_url: 'https://github.com/mralexgray/ace', + archived: false, + disabled: false, + has_wiki: true, + homepage: 'http://ace.c9.io', + html_url: 'https://github.com/mralexgray/ace', + keys_url: 'https://api.github.com/repos/mralexgray/ace/keys{/key_id}', + language: 'JavaScript', + tags_url: 'https://api.github.com/repos/mralexgray/ace/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/ace/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/ace.git', + forks_url: 'https://api.github.com/repos/mralexgray/ace/forks', + full_name: 'mralexgray/ace', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/ace/hooks', + pulls_url: 'https://api.github.com/repos/mralexgray/ace/pulls{/number}', + pushed_at: '2013-10-26T12:34:48Z', + teams_url: 'https://api.github.com/repos/mralexgray/ace/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/ace/git/trees{/sha}', + created_at: '2013-09-26T11:58:10Z', + events_url: 'https://api.github.com/repos/mralexgray/ace/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/ace/issues{/number}', + labels_url: 'https://api.github.com/repos/mralexgray/ace/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/ace/merges', + mirror_url: null, + updated_at: '2013-10-26T12:34:49Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/ace/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/ace/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/ace/compare/{base}...{head}', + description: 'Ace (Ajax.org Cloud9 Editor)', + forks_count: 1, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/ace/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/ace/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/ace/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/ace/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/ace/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/ace/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/ace/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/ace/assignees{/user}', + downloads_url: 'https://api.github.com/repos/mralexgray/ace/downloads', + has_downloads: true, + languages_url: 'https://api.github.com/repos/mralexgray/ace/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/ace/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/ace/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/ace/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/ace/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/ace/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/ace/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/ace/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/ace/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/ace/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/ace/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/ace/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 10791045, + url: 'https://api.github.com/repos/mralexgray/ACEView', + fork: true, + name: 'ACEView', + size: 1733, + forks: 1, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/ACEView.git', + license: { + key: 'other', + url: null, + name: 'Other', + node_id: 'MDc6TGljZW5zZTA=', + spdx_id: 'NOASSERTION', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkxMDc5MTA0NQ==', + private: false, + ssh_url: 'git@github.com:mralexgray/ACEView.git', + svn_url: 'https://github.com/mralexgray/ACEView', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/ACEView', + keys_url: + 'https://api.github.com/repos/mralexgray/ACEView/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/ACEView/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/ACEView/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/ACEView.git', + forks_url: 'https://api.github.com/repos/mralexgray/ACEView/forks', + full_name: 'mralexgray/ACEView', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/ACEView/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/ACEView/pulls{/number}', + pushed_at: '2014-05-09T01:36:23Z', + teams_url: 'https://api.github.com/repos/mralexgray/ACEView/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/ACEView/git/trees{/sha}', + created_at: '2013-06-19T12:15:04Z', + events_url: 'https://api.github.com/repos/mralexgray/ACEView/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/ACEView/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/ACEView/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/ACEView/merges', + mirror_url: null, + updated_at: '2015-11-24T01:14:10Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/ACEView/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/ACEView/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/ACEView/compare/{base}...{head}', + description: 'Use the wonderful ACE editor in your Cocoa applications', + forks_count: 1, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/ACEView/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/ACEView/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/ACEView/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/ACEView/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/ACEView/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/ACEView/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/ACEView/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/ACEView/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/ACEView/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/ACEView/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/ACEView/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/ACEView/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/ACEView/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/ACEView/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/ACEView/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/ACEView/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/ACEView/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/ACEView/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/ACEView/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/ACEView/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/ACEView/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 13623648, + url: 'https://api.github.com/repos/mralexgray/ActiveLog', + fork: true, + name: 'ActiveLog', + size: 60, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/ActiveLog.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnkxMzYyMzY0OA==', + private: false, + ssh_url: 'git@github.com:mralexgray/ActiveLog.git', + svn_url: 'https://github.com/mralexgray/ActiveLog', + archived: false, + disabled: false, + has_wiki: true, + homepage: 'http://deepitpro.com/en/articles/ActiveLog/info/', + html_url: 'https://github.com/mralexgray/ActiveLog', + keys_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/ActiveLog/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/ActiveLog.git', + forks_url: 'https://api.github.com/repos/mralexgray/ActiveLog/forks', + full_name: 'mralexgray/ActiveLog', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/ActiveLog/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/pulls{/number}', + pushed_at: '2011-07-03T06:28:59Z', + teams_url: 'https://api.github.com/repos/mralexgray/ActiveLog/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/git/trees{/sha}', + created_at: '2013-10-16T15:52:37Z', + events_url: 'https://api.github.com/repos/mralexgray/ActiveLog/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/ActiveLog/merges', + mirror_url: null, + updated_at: '2013-10-16T15:52:37Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/compare/{base}...{head}', + description: 'Shut up all logs with active filter.', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 9716210, + url: 'https://api.github.com/repos/mralexgray/adium', + fork: false, + name: 'adium', + size: 277719, + forks: 37, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/adium.git', + license: { + key: 'other', + url: null, + name: 'Other', + node_id: 'MDc6TGljZW5zZTA=', + spdx_id: 'NOASSERTION', + }, + node_id: 'MDEwOlJlcG9zaXRvcnk5NzE2MjEw', + private: false, + ssh_url: 'git@github.com:mralexgray/adium.git', + svn_url: 'https://github.com/mralexgray/adium', + archived: false, + disabled: false, + has_wiki: false, + homepage: null, + html_url: 'https://github.com/mralexgray/adium', + keys_url: 'https://api.github.com/repos/mralexgray/adium/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/adium/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/adium/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/adium.git', + forks_url: 'https://api.github.com/repos/mralexgray/adium/forks', + full_name: 'mralexgray/adium', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/adium/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/adium/pulls{/number}', + pushed_at: '2013-04-26T16:43:53Z', + teams_url: 'https://api.github.com/repos/mralexgray/adium/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/adium/git/trees{/sha}', + created_at: '2013-04-27T14:59:33Z', + events_url: 'https://api.github.com/repos/mralexgray/adium/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/adium/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/adium/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/adium/merges', + mirror_url: null, + updated_at: '2019-12-11T06:51:45Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/adium/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/adium/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/adium/compare/{base}...{head}', + description: 'Official mirror of hg.adium.im', + forks_count: 37, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/adium/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/adium/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/adium/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/adium/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/adium/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/adium/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/adium/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/adium/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/adium/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/adium/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/adium/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/adium/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/adium/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/adium/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/adium/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/adium/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/adium/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/adium/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/adium/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/adium/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/adium/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 12752329, + url: 'https://api.github.com/repos/mralexgray/ADLivelyTableView', + fork: true, + name: 'ADLivelyTableView', + size: 73, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/ADLivelyTableView.git', + license: { + key: 'other', + url: null, + name: 'Other', + node_id: 'MDc6TGljZW5zZTA=', + spdx_id: 'NOASSERTION', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkxMjc1MjMyOQ==', + private: false, + ssh_url: 'git@github.com:mralexgray/ADLivelyTableView.git', + svn_url: 'https://github.com/mralexgray/ADLivelyTableView', + archived: false, + disabled: false, + has_wiki: true, + homepage: 'http://applidium.com/en/news/lively_uitableview/', + html_url: 'https://github.com/mralexgray/ADLivelyTableView', + keys_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/keys{/key_id}', + language: 'Objective-C', + tags_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/ADLivelyTableView.git', + forks_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/forks', + full_name: 'mralexgray/ADLivelyTableView', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/pulls{/number}', + pushed_at: '2012-05-10T10:40:15Z', + teams_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/git/trees{/sha}', + created_at: '2013-09-11T09:18:01Z', + events_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/merges', + mirror_url: null, + updated_at: '2013-09-11T09:18:03Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/compare/{base}...{head}', + description: 'Lively UITableView', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 5697379, + url: 'https://api.github.com/repos/mralexgray/AFIncrementalStore', + fork: true, + name: 'AFIncrementalStore', + size: 139, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/AFIncrementalStore.git', + license: { + key: 'mit', + url: 'https://api.github.com/licenses/mit', + name: 'MIT License', + node_id: 'MDc6TGljZW5zZTEz', + spdx_id: 'MIT', + }, + node_id: 'MDEwOlJlcG9zaXRvcnk1Njk3Mzc5', + private: false, + ssh_url: 'git@github.com:mralexgray/AFIncrementalStore.git', + svn_url: 'https://github.com/mralexgray/AFIncrementalStore', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/AFIncrementalStore', + keys_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/keys{/key_id}', + language: 'Objective-C', + tags_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/AFIncrementalStore.git', + forks_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/forks', + full_name: 'mralexgray/AFIncrementalStore', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/pulls{/number}', + pushed_at: '2012-09-01T22:46:25Z', + teams_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/git/trees{/sha}', + created_at: '2012-09-06T04:20:33Z', + events_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/merges', + mirror_url: null, + updated_at: '2013-01-12T03:15:29Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/compare/{base}...{head}', + description: 'Core Data Persistence with AFNetworking, Done Right', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 6969621, + url: 'https://api.github.com/repos/mralexgray/AFNetworking', + fork: true, + name: 'AFNetworking', + size: 4341, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/AFNetworking.git', + license: { + key: 'mit', + url: 'https://api.github.com/licenses/mit', + name: 'MIT License', + node_id: 'MDc6TGljZW5zZTEz', + spdx_id: 'MIT', + }, + node_id: 'MDEwOlJlcG9zaXRvcnk2OTY5NjIx', + private: false, + ssh_url: 'git@github.com:mralexgray/AFNetworking.git', + svn_url: 'https://github.com/mralexgray/AFNetworking', + archived: false, + disabled: false, + has_wiki: true, + homepage: 'http://afnetworking.com', + html_url: 'https://github.com/mralexgray/AFNetworking', + keys_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/AFNetworking/tags', + watchers: 2, + blobs_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/AFNetworking.git', + forks_url: 'https://api.github.com/repos/mralexgray/AFNetworking/forks', + full_name: 'mralexgray/AFNetworking', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/AFNetworking/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/pulls{/number}', + pushed_at: '2014-01-24T07:14:32Z', + teams_url: 'https://api.github.com/repos/mralexgray/AFNetworking/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/git/trees{/sha}', + created_at: '2012-12-02T17:00:04Z', + events_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/merges', + mirror_url: null, + updated_at: '2014-01-24T07:14:33Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/compare/{base}...{head}', + description: 'A delightful iOS and OS X networking framework', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/stargazers', + watchers_count: 2, + deployments_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/issues/events{/number}', + stargazers_count: 2, + subscription_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 9485541, + url: 'https://api.github.com/repos/mralexgray/AGNSSplitView', + fork: true, + name: 'AGNSSplitView', + size: 68, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/AGNSSplitView.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnk5NDg1NTQx', + private: false, + ssh_url: 'git@github.com:mralexgray/AGNSSplitView.git', + svn_url: 'https://github.com/mralexgray/AGNSSplitView', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/AGNSSplitView', + keys_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/AGNSSplitView/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/AGNSSplitView.git', + forks_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/forks', + full_name: 'mralexgray/AGNSSplitView', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/pulls{/number}', + pushed_at: '2013-02-26T00:32:32Z', + teams_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/git/trees{/sha}', + created_at: '2013-04-17T00:10:13Z', + events_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/merges', + mirror_url: null, + updated_at: '2013-04-17T00:10:13Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/compare/{base}...{head}', + description: 'Simple NSSplitView additions.', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 12767784, + url: 'https://api.github.com/repos/mralexgray/AGScopeBar', + fork: true, + name: 'AGScopeBar', + size: 64, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/AGScopeBar.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnkxMjc2Nzc4NA==', + private: false, + ssh_url: 'git@github.com:mralexgray/AGScopeBar.git', + svn_url: 'https://github.com/mralexgray/AGScopeBar', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/AGScopeBar', + keys_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/AGScopeBar/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/AGScopeBar.git', + forks_url: 'https://api.github.com/repos/mralexgray/AGScopeBar/forks', + full_name: 'mralexgray/AGScopeBar', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/AGScopeBar/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/pulls{/number}', + pushed_at: '2013-05-07T03:35:29Z', + teams_url: 'https://api.github.com/repos/mralexgray/AGScopeBar/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/git/trees{/sha}', + created_at: '2013-09-11T21:06:54Z', + events_url: 'https://api.github.com/repos/mralexgray/AGScopeBar/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/AGScopeBar/merges', + mirror_url: null, + updated_at: '2013-09-11T21:06:54Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/compare/{base}...{head}', + description: 'Custom scope bar implementation for Cocoa', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 31829499, + url: 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin', + fork: true, + name: 'agvtool-xcode-plugin', + size: 102, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/agvtool-xcode-plugin.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnkzMTgyOTQ5OQ==', + private: false, + ssh_url: 'git@github.com:mralexgray/agvtool-xcode-plugin.git', + svn_url: 'https://github.com/mralexgray/agvtool-xcode-plugin', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/agvtool-xcode-plugin', + keys_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/keys{/key_id}', + language: 'Objective-C', + tags_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/agvtool-xcode-plugin.git', + forks_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/forks', + full_name: 'mralexgray/agvtool-xcode-plugin', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/pulls{/number}', + pushed_at: '2015-03-08T00:04:31Z', + teams_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/git/trees{/sha}', + created_at: '2015-03-07T22:15:38Z', + events_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/merges', + mirror_url: null, + updated_at: '2015-03-07T22:15:41Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/compare/{base}...{head}', + description: 'this is a plugin wrapper for agvtool for xcode.', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 9227846, + url: 'https://api.github.com/repos/mralexgray/AHContentBrowser', + fork: true, + name: 'AHContentBrowser', + size: 223, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/AHContentBrowser.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnk5MjI3ODQ2', + private: false, + ssh_url: 'git@github.com:mralexgray/AHContentBrowser.git', + svn_url: 'https://github.com/mralexgray/AHContentBrowser', + archived: false, + disabled: false, + has_wiki: true, + homepage: '', + html_url: 'https://github.com/mralexgray/AHContentBrowser', + keys_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/keys{/key_id}', + language: 'Objective-C', + tags_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/AHContentBrowser.git', + forks_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/forks', + full_name: 'mralexgray/AHContentBrowser', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/pulls{/number}', + pushed_at: '2013-03-13T17:38:23Z', + teams_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/git/trees{/sha}', + created_at: '2013-04-04T20:56:16Z', + events_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/merges', + mirror_url: null, + updated_at: '2015-10-22T05:00:24Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/compare/{base}...{head}', + description: + 'A Mac only webview that loads a fast readable version of the website if available.', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 37430328, + url: 'https://api.github.com/repos/mralexgray/AHLaunchCtl', + fork: true, + name: 'AHLaunchCtl', + size: 592, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/AHLaunchCtl.git', + license: { + key: 'mit', + url: 'https://api.github.com/licenses/mit', + name: 'MIT License', + node_id: 'MDc6TGljZW5zZTEz', + spdx_id: 'MIT', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkzNzQzMDMyOA==', + private: false, + ssh_url: 'git@github.com:mralexgray/AHLaunchCtl.git', + svn_url: 'https://github.com/mralexgray/AHLaunchCtl', + archived: false, + disabled: false, + has_wiki: true, + homepage: '', + html_url: 'https://github.com/mralexgray/AHLaunchCtl', + keys_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/AHLaunchCtl/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/AHLaunchCtl.git', + forks_url: 'https://api.github.com/repos/mralexgray/AHLaunchCtl/forks', + full_name: 'mralexgray/AHLaunchCtl', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/AHLaunchCtl/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/pulls{/number}', + pushed_at: '2015-05-26T18:50:48Z', + teams_url: 'https://api.github.com/repos/mralexgray/AHLaunchCtl/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/git/trees{/sha}', + created_at: '2015-06-14T21:31:03Z', + events_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/merges', + mirror_url: null, + updated_at: '2015-06-14T21:31:04Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/compare/{base}...{head}', + description: 'LaunchD Framework for Cocoa Apps', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 9167473, + url: 'https://api.github.com/repos/mralexgray/AHLayout', + fork: true, + name: 'AHLayout', + size: 359, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/AHLayout.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnk5MTY3NDcz', + private: false, + ssh_url: 'git@github.com:mralexgray/AHLayout.git', + svn_url: 'https://github.com/mralexgray/AHLayout', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/AHLayout', + keys_url: + 'https://api.github.com/repos/mralexgray/AHLayout/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/AHLayout/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/AHLayout/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/AHLayout.git', + forks_url: 'https://api.github.com/repos/mralexgray/AHLayout/forks', + full_name: 'mralexgray/AHLayout', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/AHLayout/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/AHLayout/pulls{/number}', + pushed_at: '2013-07-08T02:31:14Z', + teams_url: 'https://api.github.com/repos/mralexgray/AHLayout/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/AHLayout/git/trees{/sha}', + created_at: '2013-04-02T10:10:30Z', + events_url: 'https://api.github.com/repos/mralexgray/AHLayout/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/AHLayout/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/AHLayout/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/AHLayout/merges', + mirror_url: null, + updated_at: '2013-07-08T02:31:17Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/AHLayout/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/AHLayout/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/AHLayout/compare/{base}...{head}', + description: 'AHLayout', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/AHLayout/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/AHLayout/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/AHLayout/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/AHLayout/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/AHLayout/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/AHLayout/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/AHLayout/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/AHLayout/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/AHLayout/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/AHLayout/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/AHLayout/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/AHLayout/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/AHLayout/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/AHLayout/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/AHLayout/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/AHLayout/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/AHLayout/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/AHLayout/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/AHLayout/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/AHLayout/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/AHLayout/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 18450201, + url: 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework', + fork: true, + name: 'Airmail-Plug-In-Framework', + size: 888, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/Airmail-Plug-In-Framework.git', + license: { + key: 'gpl-2.0', + url: 'https://api.github.com/licenses/gpl-2.0', + name: 'GNU General Public License v2.0', + node_id: 'MDc6TGljZW5zZTg=', + spdx_id: 'GPL-2.0', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkxODQ1MDIwMQ==', + private: false, + ssh_url: 'git@github.com:mralexgray/Airmail-Plug-In-Framework.git', + svn_url: 'https://github.com/mralexgray/Airmail-Plug-In-Framework', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/Airmail-Plug-In-Framework', + keys_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/keys{/key_id}', + language: null, + tags_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/git/blobs{/sha}', + clone_url: + 'https://github.com/mralexgray/Airmail-Plug-In-Framework.git', + forks_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/forks', + full_name: 'mralexgray/Airmail-Plug-In-Framework', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/pulls{/number}', + pushed_at: '2014-03-27T15:42:19Z', + teams_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/git/trees{/sha}', + created_at: '2014-04-04T19:33:54Z', + events_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/merges', + mirror_url: null, + updated_at: '2014-11-23T19:31:04Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/compare/{base}...{head}', + description: null, + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 5203219, + url: 'https://api.github.com/repos/mralexgray/AJS-iTunes-API', + fork: true, + name: 'AJS-iTunes-API', + size: 103, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/AJS-iTunes-API.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnk1MjAzMjE5', + private: false, + ssh_url: 'git@github.com:mralexgray/AJS-iTunes-API.git', + svn_url: 'https://github.com/mralexgray/AJS-iTunes-API', + archived: false, + disabled: false, + has_wiki: true, + homepage: '', + html_url: 'https://github.com/mralexgray/AJS-iTunes-API', + keys_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/tags', + watchers: 2, + blobs_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/AJS-iTunes-API.git', + forks_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/forks', + full_name: 'mralexgray/AJS-iTunes-API', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/pulls{/number}', + pushed_at: '2011-10-30T22:26:48Z', + teams_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/git/trees{/sha}', + created_at: '2012-07-27T10:20:58Z', + events_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/merges', + mirror_url: null, + updated_at: '2013-01-11T11:00:05Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/compare/{base}...{head}', + description: + 'Cocoa wrapper for the iTunes search API - for iOS and Mac OSX projects', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/stargazers', + watchers_count: 2, + deployments_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/issues/events{/number}', + stargazers_count: 2, + subscription_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 10093801, + url: 'https://api.github.com/repos/mralexgray/Alcatraz', + fork: true, + name: 'Alcatraz', + size: 3668, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/Alcatraz.git', + license: { + key: 'mit', + url: 'https://api.github.com/licenses/mit', + name: 'MIT License', + node_id: 'MDc6TGljZW5zZTEz', + spdx_id: 'MIT', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkxMDA5MzgwMQ==', + private: false, + ssh_url: 'git@github.com:mralexgray/Alcatraz.git', + svn_url: 'https://github.com/mralexgray/Alcatraz', + archived: false, + disabled: false, + has_wiki: false, + homepage: 'mneorr.github.com/Alcatraz', + html_url: 'https://github.com/mralexgray/Alcatraz', + keys_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/Alcatraz/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/Alcatraz.git', + forks_url: 'https://api.github.com/repos/mralexgray/Alcatraz/forks', + full_name: 'mralexgray/Alcatraz', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/Alcatraz/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/pulls{/number}', + pushed_at: '2014-03-19T12:50:37Z', + teams_url: 'https://api.github.com/repos/mralexgray/Alcatraz/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/git/trees{/sha}', + created_at: '2013-05-16T04:41:13Z', + events_url: 'https://api.github.com/repos/mralexgray/Alcatraz/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/Alcatraz/merges', + mirror_url: null, + updated_at: '2014-03-19T20:38:35Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/compare/{base}...{head}', + description: 'The most awesome (and only) Xcode package manager!', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 12916552, + url: 'https://api.github.com/repos/mralexgray/alcatraz-packages', + fork: true, + name: 'alcatraz-packages', + size: 826, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/alcatraz-packages.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnkxMjkxNjU1Mg==', + private: false, + ssh_url: 'git@github.com:mralexgray/alcatraz-packages.git', + svn_url: 'https://github.com/mralexgray/alcatraz-packages', + archived: false, + disabled: false, + has_wiki: true, + homepage: 'mneorr.github.com/Alcatraz', + html_url: 'https://github.com/mralexgray/alcatraz-packages', + keys_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/keys{/key_id}', + language: 'Ruby', + tags_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/alcatraz-packages.git', + forks_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/forks', + full_name: 'mralexgray/alcatraz-packages', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/pulls{/number}', + pushed_at: '2015-12-14T16:21:31Z', + teams_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/git/trees{/sha}', + created_at: '2013-09-18T07:15:24Z', + events_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/merges', + mirror_url: null, + updated_at: '2015-11-10T20:52:30Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/compare/{base}...{head}', + description: 'Package list repository for Alcatraz', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 44278362, + url: 'https://api.github.com/repos/mralexgray/alexicons', + fork: true, + name: 'alexicons', + size: 257, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/alexicons.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnk0NDI3ODM2Mg==', + private: false, + ssh_url: 'git@github.com:mralexgray/alexicons.git', + svn_url: 'https://github.com/mralexgray/alexicons', + archived: false, + disabled: false, + has_wiki: false, + homepage: null, + html_url: 'https://github.com/mralexgray/alexicons', + keys_url: + 'https://api.github.com/repos/mralexgray/alexicons/keys{/key_id}', + language: 'CoffeeScript', + tags_url: 'https://api.github.com/repos/mralexgray/alexicons/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/alexicons/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/alexicons.git', + forks_url: 'https://api.github.com/repos/mralexgray/alexicons/forks', + full_name: 'mralexgray/alexicons', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/alexicons/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/alexicons/pulls{/number}', + pushed_at: '2015-10-16T03:57:51Z', + teams_url: 'https://api.github.com/repos/mralexgray/alexicons/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/alexicons/git/trees{/sha}', + created_at: '2015-10-14T21:49:39Z', + events_url: 'https://api.github.com/repos/mralexgray/alexicons/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/alexicons/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/alexicons/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/alexicons/merges', + mirror_url: null, + updated_at: '2015-10-15T06:20:08Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/alexicons/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/alexicons/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/alexicons/compare/{base}...{head}', + description: 'Get popular cat names', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/alexicons/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/alexicons/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/alexicons/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/alexicons/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/alexicons/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/alexicons/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/alexicons/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/alexicons/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/alexicons/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/alexicons/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/alexicons/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/alexicons/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/alexicons/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/alexicons/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/alexicons/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/alexicons/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/alexicons/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/alexicons/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/alexicons/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/alexicons/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/alexicons/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 10476467, + url: 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate', + fork: true, + name: 'Alfred-Google-Translate', + size: 103, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/Alfred-Google-Translate.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnkxMDQ3NjQ2Nw==', + private: false, + ssh_url: 'git@github.com:mralexgray/Alfred-Google-Translate.git', + svn_url: 'https://github.com/mralexgray/Alfred-Google-Translate', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/Alfred-Google-Translate', + keys_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/keys{/key_id}', + language: 'Shell', + tags_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/Alfred-Google-Translate.git', + forks_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/forks', + full_name: 'mralexgray/Alfred-Google-Translate', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/pulls{/number}', + pushed_at: '2013-01-12T19:39:03Z', + teams_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/git/trees{/sha}', + created_at: '2013-06-04T10:45:10Z', + events_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/merges', + mirror_url: null, + updated_at: '2013-06-04T10:45:10Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/compare/{base}...{head}', + description: + 'Extension for Alfred that will do a Google translate for you', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 5524019, + url: 'https://api.github.com/repos/mralexgray/Amber', + fork: false, + name: 'Amber', + size: 48, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/Amber.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnk1NTI0MDE5', + private: false, + ssh_url: 'git@github.com:mralexgray/Amber.git', + svn_url: 'https://github.com/mralexgray/Amber', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/Amber', + keys_url: 'https://api.github.com/repos/mralexgray/Amber/keys{/key_id}', + language: null, + tags_url: 'https://api.github.com/repos/mralexgray/Amber/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/Amber/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/Amber.git', + forks_url: 'https://api.github.com/repos/mralexgray/Amber/forks', + full_name: 'mralexgray/Amber', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/Amber/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/Amber/pulls{/number}', + pushed_at: '2012-08-23T10:38:25Z', + teams_url: 'https://api.github.com/repos/mralexgray/Amber/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/Amber/git/trees{/sha}', + created_at: '2012-08-23T10:38:24Z', + events_url: 'https://api.github.com/repos/mralexgray/Amber/events', + has_issues: true, + issues_url: + 'https://api.github.com/repos/mralexgray/Amber/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/Amber/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/Amber/merges', + mirror_url: null, + updated_at: '2013-01-11T22:25:35Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/Amber/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/Amber/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/Amber/compare/{base}...{head}', + description: 'Fork of the difficult-to-deal-with Amber.framework', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/Amber/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/Amber/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/Amber/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/Amber/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/Amber/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/Amber/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/Amber/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/Amber/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/Amber/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/Amber/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/Amber/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/Amber/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/Amber/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/Amber/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/Amber/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/Amber/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/Amber/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/Amber/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/Amber/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/Amber/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/Amber/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 10809060, + url: 'https://api.github.com/repos/mralexgray/Amethyst', + fork: true, + name: 'Amethyst', + size: 12623, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/Amethyst.git', + license: { + key: 'mit', + url: 'https://api.github.com/licenses/mit', + name: 'MIT License', + node_id: 'MDc6TGljZW5zZTEz', + spdx_id: 'MIT', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkxMDgwOTA2MA==', + private: false, + ssh_url: 'git@github.com:mralexgray/Amethyst.git', + svn_url: 'https://github.com/mralexgray/Amethyst', + archived: false, + disabled: false, + has_wiki: true, + homepage: 'http://ianyh.github.io/Amethyst/', + html_url: 'https://github.com/mralexgray/Amethyst', + keys_url: + 'https://api.github.com/repos/mralexgray/Amethyst/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/Amethyst/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/Amethyst/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/Amethyst.git', + forks_url: 'https://api.github.com/repos/mralexgray/Amethyst/forks', + full_name: 'mralexgray/Amethyst', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/Amethyst/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/Amethyst/pulls{/number}', + pushed_at: '2013-06-18T02:54:11Z', + teams_url: 'https://api.github.com/repos/mralexgray/Amethyst/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/Amethyst/git/trees{/sha}', + created_at: '2013-06-20T00:34:22Z', + events_url: 'https://api.github.com/repos/mralexgray/Amethyst/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/Amethyst/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/Amethyst/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/Amethyst/merges', + mirror_url: null, + updated_at: '2013-06-20T00:34:22Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/Amethyst/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/Amethyst/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/Amethyst/compare/{base}...{head}', + description: 'Tiling window manager for OS X.', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/Amethyst/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/Amethyst/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/Amethyst/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/Amethyst/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/Amethyst/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/Amethyst/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/Amethyst/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/Amethyst/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/Amethyst/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/Amethyst/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/Amethyst/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/Amethyst/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/Amethyst/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/Amethyst/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/Amethyst/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/Amethyst/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/Amethyst/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/Amethyst/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/Amethyst/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/Amethyst/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/Amethyst/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 3684286, + url: 'https://api.github.com/repos/mralexgray/Animated-Paths', + fork: true, + name: 'Animated-Paths', + size: 411, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/Animated-Paths.git', + license: { + key: 'other', + url: null, + name: 'Other', + node_id: 'MDc6TGljZW5zZTA=', + spdx_id: 'NOASSERTION', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkzNjg0Mjg2', + private: false, + ssh_url: 'git@github.com:mralexgray/Animated-Paths.git', + svn_url: 'https://github.com/mralexgray/Animated-Paths', + archived: false, + disabled: false, + has_wiki: true, + homepage: + 'http://oleb.net/blog/2010/12/animating-drawing-of-cgpath-with-cashapelayer/', + html_url: 'https://github.com/mralexgray/Animated-Paths', + keys_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/Animated-Paths/tags', + watchers: 2, + blobs_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/Animated-Paths.git', + forks_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/forks', + full_name: 'mralexgray/Animated-Paths', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/pulls{/number}', + pushed_at: '2010-12-30T20:56:51Z', + teams_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/git/trees{/sha}', + created_at: '2012-03-11T02:56:38Z', + events_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/merges', + mirror_url: null, + updated_at: '2013-01-08T04:12:21Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/compare/{base}...{head}', + description: + 'Demo project: Animating the drawing of a CGPath with CAShapeLayer.strokeEnd', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/stargazers', + watchers_count: 2, + deployments_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/issues/events{/number}', + stargazers_count: 2, + subscription_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 16662874, + url: 'https://api.github.com/repos/mralexgray/AnsiLove.framework', + fork: true, + name: 'AnsiLove.framework', + size: 3780, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/AnsiLove.framework.git', + license: { + key: 'other', + url: null, + name: 'Other', + node_id: 'MDc6TGljZW5zZTA=', + spdx_id: 'NOASSERTION', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkxNjY2Mjg3NA==', + private: false, + ssh_url: 'git@github.com:mralexgray/AnsiLove.framework.git', + svn_url: 'https://github.com/mralexgray/AnsiLove.framework', + archived: false, + disabled: false, + has_wiki: false, + homepage: 'http://byteproject.net', + html_url: 'https://github.com/mralexgray/AnsiLove.framework', + keys_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/keys{/key_id}', + language: 'M', + tags_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/AnsiLove.framework.git', + forks_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/forks', + full_name: 'mralexgray/AnsiLove.framework', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/pulls{/number}', + pushed_at: '2013-10-04T14:08:38Z', + teams_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/git/trees{/sha}', + created_at: '2014-02-09T08:30:27Z', + events_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/merges', + mirror_url: null, + updated_at: '2015-01-13T20:41:46Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/compare/{base}...{head}', + description: 'Cocoa Framework for rendering ANSi / ASCII art', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 5189563, + url: 'https://api.github.com/repos/mralexgray/ANTrackBar', + fork: true, + name: 'ANTrackBar', + size: 94, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/ANTrackBar.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnk1MTg5NTYz', + private: false, + ssh_url: 'git@github.com:mralexgray/ANTrackBar.git', + svn_url: 'https://github.com/mralexgray/ANTrackBar', + archived: false, + disabled: false, + has_wiki: true, + homepage: '', + html_url: 'https://github.com/mralexgray/ANTrackBar', + keys_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/ANTrackBar/tags', + watchers: 2, + blobs_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/ANTrackBar.git', + forks_url: 'https://api.github.com/repos/mralexgray/ANTrackBar/forks', + full_name: 'mralexgray/ANTrackBar', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/ANTrackBar/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/pulls{/number}', + pushed_at: '2012-03-09T01:40:02Z', + teams_url: 'https://api.github.com/repos/mralexgray/ANTrackBar/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/git/trees{/sha}', + created_at: '2012-07-26T08:17:22Z', + events_url: 'https://api.github.com/repos/mralexgray/ANTrackBar/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/ANTrackBar/merges', + mirror_url: null, + updated_at: '2013-01-11T10:29:56Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/compare/{base}...{head}', + description: 'An easy-to-use Cocoa seek bar with a pleasing appearance', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/stargazers', + watchers_count: 2, + deployments_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/issues/events{/number}', + stargazers_count: 2, + subscription_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 16240152, + url: 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C', + fork: true, + name: 'AOP-in-Objective-C', + size: 340, + forks: 1, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/AOP-in-Objective-C.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnkxNjI0MDE1Mg==', + private: false, + ssh_url: 'git@github.com:mralexgray/AOP-in-Objective-C.git', + svn_url: 'https://github.com/mralexgray/AOP-in-Objective-C', + archived: false, + disabled: false, + has_wiki: true, + homepage: 'http://innoli.hu/en/opensource/', + html_url: 'https://github.com/mralexgray/AOP-in-Objective-C', + keys_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/keys{/key_id}', + language: 'Objective-C', + tags_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/AOP-in-Objective-C.git', + forks_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/forks', + full_name: 'mralexgray/AOP-in-Objective-C', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/pulls{/number}', + pushed_at: '2014-02-12T16:23:20Z', + teams_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/git/trees{/sha}', + created_at: '2014-01-25T21:18:04Z', + events_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/merges', + mirror_url: null, + updated_at: '2014-06-19T19:38:12Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/compare/{base}...{head}', + description: + 'An NSProxy based library for easily enabling AOP like functionality in Objective-C.', + forks_count: 1, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/languages', + default_branch: 'travis-coveralls', + milestones_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 13141936, + url: 'https://api.github.com/repos/mralexgray/Apaxy', + fork: true, + name: 'Apaxy', + size: 113, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/Apaxy.git', + license: { + key: 'unlicense', + url: 'https://api.github.com/licenses/unlicense', + name: 'The Unlicense', + node_id: 'MDc6TGljZW5zZTE1', + spdx_id: 'Unlicense', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkxMzE0MTkzNg==', + private: false, + ssh_url: 'git@github.com:mralexgray/Apaxy.git', + svn_url: 'https://github.com/mralexgray/Apaxy', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/Apaxy', + keys_url: 'https://api.github.com/repos/mralexgray/Apaxy/keys{/key_id}', + language: 'CSS', + tags_url: 'https://api.github.com/repos/mralexgray/Apaxy/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/Apaxy/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/Apaxy.git', + forks_url: 'https://api.github.com/repos/mralexgray/Apaxy/forks', + full_name: 'mralexgray/Apaxy', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/Apaxy/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/Apaxy/pulls{/number}', + pushed_at: '2013-08-02T16:01:32Z', + teams_url: 'https://api.github.com/repos/mralexgray/Apaxy/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/Apaxy/git/trees{/sha}', + created_at: '2013-09-27T05:05:35Z', + events_url: 'https://api.github.com/repos/mralexgray/Apaxy/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/Apaxy/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/Apaxy/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/Apaxy/merges', + mirror_url: null, + updated_at: '2018-02-16T21:40:24Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/Apaxy/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/Apaxy/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/Apaxy/compare/{base}...{head}', + description: + 'A simple, customisable theme for your Apache directory listing.', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/Apaxy/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/Apaxy/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/Apaxy/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/Apaxy/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/Apaxy/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/Apaxy/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/Apaxy/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/Apaxy/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/Apaxy/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/Apaxy/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/Apaxy/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/Apaxy/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/Apaxy/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/Apaxy/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/Apaxy/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/Apaxy/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/Apaxy/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/Apaxy/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/Apaxy/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/Apaxy/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/Apaxy/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 20027360, + url: 'https://api.github.com/repos/mralexgray/app', + fork: true, + name: 'app', + size: 1890, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/app.git', + license: { + key: 'other', + url: null, + name: 'Other', + node_id: 'MDc6TGljZW5zZTA=', + spdx_id: 'NOASSERTION', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkyMDAyNzM2MA==', + private: false, + ssh_url: 'git@github.com:mralexgray/app.git', + svn_url: 'https://github.com/mralexgray/app', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/app', + keys_url: 'https://api.github.com/repos/mralexgray/app/keys{/key_id}', + language: 'JavaScript', + tags_url: 'https://api.github.com/repos/mralexgray/app/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/app/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/app.git', + forks_url: 'https://api.github.com/repos/mralexgray/app/forks', + full_name: 'mralexgray/app', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/app/hooks', + pulls_url: 'https://api.github.com/repos/mralexgray/app/pulls{/number}', + pushed_at: '2014-05-20T19:51:38Z', + teams_url: 'https://api.github.com/repos/mralexgray/app/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/app/git/trees{/sha}', + created_at: '2014-05-21T15:54:20Z', + events_url: 'https://api.github.com/repos/mralexgray/app/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/app/issues{/number}', + labels_url: 'https://api.github.com/repos/mralexgray/app/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/app/merges', + mirror_url: null, + updated_at: '2014-05-21T15:54:22Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/app/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/app/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/app/compare/{base}...{head}', + description: 'Instant mobile web app creation', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/app/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/app/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/app/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/app/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/app/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/app/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/app/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/app/assignees{/user}', + downloads_url: 'https://api.github.com/repos/mralexgray/app/downloads', + has_downloads: true, + languages_url: 'https://api.github.com/repos/mralexgray/app/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/app/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/app/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/app/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/app/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/app/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/app/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/app/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/app/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/app/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/app/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/app/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + ], + trait1: 'new-val', + }, + library: { + name: 'http', + }, + }, + rudderId: 'daf823fb-e8d3-413a-8313-d34cd756f968', + messageId: 'c864b4cd-8f07-4922-b3d0-82ef04c987d3', + timestamp: '2020-02-02T00:23:09.544Z', + 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', + }, + PayloadSize: 95943, + LastJobStatus: { + JobID: 0, + JobState: '', + AttemptNum: 0, + ExecTime: '0001-01-01T00:00:00Z', + RetryTime: '0001-01-01T00:00:00Z', + ErrorCode: '', + ErrorResponse: null, + Parameters: null, + WorkspaceId: '', + }, + Parameters: { + record_id: null, + source_id: '2DTlLPQxignYp4ag9sISgGN2uY7', + event_name: '', + event_type: 'identify', + message_id: 'c864b4cd-8f07-4922-b3d0-82ef04c987d3', + received_at: '2022-08-18T08:43:13.521+05:30', + workspaceId: '2DTlBMipxWfJZzZ1SsjELQWvkwd', + transform_at: 'router', + source_job_id: '', + destination_id: '2DTozIMGtBwTGNJtuvdPByFSL2Z', + gateway_job_id: 6, + source_task_id: '', + source_batch_id: '', + source_category: '', + source_job_run_id: '', + source_task_run_id: '', + source_definition_id: '2DTlJaW1jHhM8B27Et2CMTZoxZF', + destination_definition_id: '', + }, + WorkspaceId: '2DTlBMipxWfJZzZ1SsjELQWvkwd', + }, + workerAssignedTime: '2022-08-18T08:43:16.586825+05:30', + }, + destination: { + ID: '2DTozIMGtBwTGNJtuvdPByFSL2Z', + Name: 'Lambda test', + DestinationDefinition: { + ID: '2DTlHvPWOzBUksUQUvggRnalUkj', + Name: 'LAMBDA', + DisplayName: 'AWS Lambda', + Config: { + destConfig: { + defaultConfig: [ + 'region', + 'iamRoleARN', + 'externalID', + 'accessKeyId', + 'accessKey', + 'lambda', + 'enableBatchInput', + 'clientContext', + 'roleBasedAuth', + 'maxBatchSize', + ], + }, + excludeKeys: [], + includeKeys: [], + saveDestinationResponse: true, + secretKeys: ['accessKeyId', 'accessKey', 'iamRoleARN', 'externalID'], + supportedMessageTypes: [ + 'identify', + 'page', + 'screen', + 'track', + 'alias', + 'group', + ], + supportedSourceTypes: [ + 'amp', + 'android', + 'cordova', + 'cloud', + 'flutter', + 'ios', + 'reactnative', + 'unity', + 'warehouse', + 'web', + ], + transformAt: 'router', + transformAtV1: 'router', + }, + ResponseRules: {}, + }, + Config: { + accessKey: '', + accessKeyId: '', + clientContext: '', + enableBatchInput: true, + externalID: '', + iamRoleARN: '', + lambda: 'testFunction', + maxBatchSize: '2', + region: 'us-west-2', + roleBasedAuth: false, + }, + Enabled: true, + Transformations: [], + IsProcessorEnabled: true, + RevisionID: '2DVji2YjKiWRL0Qdx73xg9r8ReQ', + }, + }, + { + message: { + type: 'track', + event: 'Product Purchased new', + 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: '9f8fb785-c720-4381-a009-bf22a13f4ced', + timestamp: '2020-02-02T00:23:09.544Z', + properties: { + data: [ + { + id: 6104546, + url: 'https://api.github.com/repos/mralexgray/-REPONAME', + fork: false, + name: '-REPONAME', + size: 48, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/-REPONAME.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnk2MTA0NTQ2', + private: false, + ssh_url: 'git@github.com:mralexgray/-REPONAME.git', + svn_url: 'https://github.com/mralexgray/-REPONAME', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/-REPONAME', + keys_url: 'https://api.github.com/repos/mralexgray/-REPONAME/keys{/key_id}', + language: null, + tags_url: 'https://api.github.com/repos/mralexgray/-REPONAME/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/-REPONAME.git', + forks_url: 'https://api.github.com/repos/mralexgray/-REPONAME/forks', + full_name: 'mralexgray/-REPONAME', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/-REPONAME/hooks', + pulls_url: 'https://api.github.com/repos/mralexgray/-REPONAME/pulls{/number}', + pushed_at: '2012-10-06T16:37:39Z', + teams_url: 'https://api.github.com/repos/mralexgray/-REPONAME/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/git/trees{/sha}', + created_at: '2012-10-06T16:37:39Z', + events_url: 'https://api.github.com/repos/mralexgray/-REPONAME/events', + has_issues: true, + issues_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/issues{/number}', + labels_url: 'https://api.github.com/repos/mralexgray/-REPONAME/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/-REPONAME/merges', + mirror_url: null, + updated_at: '2013-01-12T13:39:30Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/compare/{base}...{head}', + description: null, + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/assignees{/user}', + downloads_url: 'https://api.github.com/repos/mralexgray/-REPONAME/downloads', + has_downloads: true, + languages_url: 'https://api.github.com/repos/mralexgray/-REPONAME/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 104510411, + url: 'https://api.github.com/repos/mralexgray/...', + fork: true, + name: '...', + size: 113, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/....git', + license: { + key: 'mit', + url: 'https://api.github.com/licenses/mit', + name: 'MIT License', + node_id: 'MDc6TGljZW5zZTEz', + spdx_id: 'MIT', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkxMDQ1MTA0MTE=', + private: false, + ssh_url: 'git@github.com:mralexgray/....git', + svn_url: 'https://github.com/mralexgray/...', + archived: false, + disabled: false, + has_wiki: false, + homepage: 'https://driesvints.com/blog/getting-started-with-dotfiles', + html_url: 'https://github.com/mralexgray/...', + keys_url: 'https://api.github.com/repos/mralexgray/.../keys{/key_id}', + language: 'Shell', + tags_url: 'https://api.github.com/repos/mralexgray/.../tags', + watchers: 0, + blobs_url: 'https://api.github.com/repos/mralexgray/.../git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/....git', + forks_url: 'https://api.github.com/repos/mralexgray/.../forks', + full_name: 'mralexgray/...', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/.../hooks', + pulls_url: 'https://api.github.com/repos/mralexgray/.../pulls{/number}', + pushed_at: '2017-09-15T08:27:32Z', + teams_url: 'https://api.github.com/repos/mralexgray/.../teams', + trees_url: 'https://api.github.com/repos/mralexgray/.../git/trees{/sha}', + created_at: '2017-09-22T19:19:42Z', + events_url: 'https://api.github.com/repos/mralexgray/.../events', + has_issues: false, + issues_url: 'https://api.github.com/repos/mralexgray/.../issues{/number}', + labels_url: 'https://api.github.com/repos/mralexgray/.../labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/.../merges', + mirror_url: null, + updated_at: '2017-09-22T19:20:22Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/.../{archive_format}{/ref}', + commits_url: 'https://api.github.com/repos/mralexgray/.../commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/.../compare/{base}...{head}', + description: ':computer: Public repo for my personal dotfiles.', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: 'https://api.github.com/repos/mralexgray/.../branches{/branch}', + comments_url: 'https://api.github.com/repos/mralexgray/.../comments{/number}', + contents_url: 'https://api.github.com/repos/mralexgray/.../contents/{+path}', + git_refs_url: 'https://api.github.com/repos/mralexgray/.../git/refs{/sha}', + git_tags_url: 'https://api.github.com/repos/mralexgray/.../git/tags{/sha}', + has_projects: true, + releases_url: 'https://api.github.com/repos/mralexgray/.../releases{/id}', + statuses_url: 'https://api.github.com/repos/mralexgray/.../statuses/{sha}', + allow_forking: true, + assignees_url: 'https://api.github.com/repos/mralexgray/.../assignees{/user}', + downloads_url: 'https://api.github.com/repos/mralexgray/.../downloads', + has_downloads: true, + languages_url: 'https://api.github.com/repos/mralexgray/.../languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/.../milestones{/number}', + stargazers_url: 'https://api.github.com/repos/mralexgray/.../stargazers', + watchers_count: 0, + deployments_url: 'https://api.github.com/repos/mralexgray/.../deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/.../git/commits{/sha}', + subscribers_url: 'https://api.github.com/repos/mralexgray/.../subscribers', + contributors_url: 'https://api.github.com/repos/mralexgray/.../contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/.../issues/events{/number}', + stargazers_count: 0, + subscription_url: 'https://api.github.com/repos/mralexgray/.../subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/.../collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/.../issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/.../notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 58656723, + url: 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol', + fork: true, + name: '2200087-Serial-Protocol', + size: 41, + forks: 1, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/2200087-Serial-Protocol.git', + license: { + key: 'gpl-2.0', + url: 'https://api.github.com/licenses/gpl-2.0', + name: 'GNU General Public License v2.0', + node_id: 'MDc6TGljZW5zZTg=', + spdx_id: 'GPL-2.0', + }, + node_id: 'MDEwOlJlcG9zaXRvcnk1ODY1NjcyMw==', + private: false, + ssh_url: 'git@github.com:mralexgray/2200087-Serial-Protocol.git', + svn_url: 'https://github.com/mralexgray/2200087-Serial-Protocol', + archived: false, + disabled: false, + has_wiki: true, + homepage: 'http://daviddworken.com', + html_url: 'https://github.com/mralexgray/2200087-Serial-Protocol', + keys_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/keys{/key_id}', + language: 'Python', + tags_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/2200087-Serial-Protocol.git', + forks_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/forks', + full_name: 'mralexgray/2200087-Serial-Protocol', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/pulls{/number}', + pushed_at: '2016-05-12T16:07:24Z', + teams_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/git/trees{/sha}', + created_at: '2016-05-12T16:05:28Z', + events_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/merges', + mirror_url: null, + updated_at: '2016-05-12T16:05:30Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/compare/{base}...{head}', + description: + "A reverse engineered protocol description and accompanying code for Radioshack's 2200087 multimeter", + forks_count: 1, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 13121042, + url: 'https://api.github.com/repos/mralexgray/ace', + fork: true, + name: 'ace', + size: 21080, + forks: 1, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/ace.git', + license: { + key: 'other', + url: null, + name: 'Other', + node_id: 'MDc6TGljZW5zZTA=', + spdx_id: 'NOASSERTION', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkxMzEyMTA0Mg==', + private: false, + ssh_url: 'git@github.com:mralexgray/ace.git', + svn_url: 'https://github.com/mralexgray/ace', + archived: false, + disabled: false, + has_wiki: true, + homepage: 'http://ace.c9.io', + html_url: 'https://github.com/mralexgray/ace', + keys_url: 'https://api.github.com/repos/mralexgray/ace/keys{/key_id}', + language: 'JavaScript', + tags_url: 'https://api.github.com/repos/mralexgray/ace/tags', + watchers: 0, + blobs_url: 'https://api.github.com/repos/mralexgray/ace/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/ace.git', + forks_url: 'https://api.github.com/repos/mralexgray/ace/forks', + full_name: 'mralexgray/ace', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/ace/hooks', + pulls_url: 'https://api.github.com/repos/mralexgray/ace/pulls{/number}', + pushed_at: '2013-10-26T12:34:48Z', + teams_url: 'https://api.github.com/repos/mralexgray/ace/teams', + trees_url: 'https://api.github.com/repos/mralexgray/ace/git/trees{/sha}', + created_at: '2013-09-26T11:58:10Z', + events_url: 'https://api.github.com/repos/mralexgray/ace/events', + has_issues: false, + issues_url: 'https://api.github.com/repos/mralexgray/ace/issues{/number}', + labels_url: 'https://api.github.com/repos/mralexgray/ace/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/ace/merges', + mirror_url: null, + updated_at: '2013-10-26T12:34:49Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/ace/{archive_format}{/ref}', + commits_url: 'https://api.github.com/repos/mralexgray/ace/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/ace/compare/{base}...{head}', + description: 'Ace (Ajax.org Cloud9 Editor)', + forks_count: 1, + is_template: false, + open_issues: 0, + branches_url: 'https://api.github.com/repos/mralexgray/ace/branches{/branch}', + comments_url: 'https://api.github.com/repos/mralexgray/ace/comments{/number}', + contents_url: 'https://api.github.com/repos/mralexgray/ace/contents/{+path}', + git_refs_url: 'https://api.github.com/repos/mralexgray/ace/git/refs{/sha}', + git_tags_url: 'https://api.github.com/repos/mralexgray/ace/git/tags{/sha}', + has_projects: true, + releases_url: 'https://api.github.com/repos/mralexgray/ace/releases{/id}', + statuses_url: 'https://api.github.com/repos/mralexgray/ace/statuses/{sha}', + allow_forking: true, + assignees_url: 'https://api.github.com/repos/mralexgray/ace/assignees{/user}', + downloads_url: 'https://api.github.com/repos/mralexgray/ace/downloads', + has_downloads: true, + languages_url: 'https://api.github.com/repos/mralexgray/ace/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/ace/milestones{/number}', + stargazers_url: 'https://api.github.com/repos/mralexgray/ace/stargazers', + watchers_count: 0, + deployments_url: 'https://api.github.com/repos/mralexgray/ace/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/ace/git/commits{/sha}', + subscribers_url: 'https://api.github.com/repos/mralexgray/ace/subscribers', + contributors_url: 'https://api.github.com/repos/mralexgray/ace/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/ace/issues/events{/number}', + stargazers_count: 0, + subscription_url: 'https://api.github.com/repos/mralexgray/ace/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/ace/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/ace/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/ace/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 10791045, + url: 'https://api.github.com/repos/mralexgray/ACEView', + fork: true, + name: 'ACEView', + size: 1733, + forks: 1, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/ACEView.git', + license: { + key: 'other', + url: null, + name: 'Other', + node_id: 'MDc6TGljZW5zZTA=', + spdx_id: 'NOASSERTION', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkxMDc5MTA0NQ==', + private: false, + ssh_url: 'git@github.com:mralexgray/ACEView.git', + svn_url: 'https://github.com/mralexgray/ACEView', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/ACEView', + keys_url: 'https://api.github.com/repos/mralexgray/ACEView/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/ACEView/tags', + watchers: 0, + blobs_url: 'https://api.github.com/repos/mralexgray/ACEView/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/ACEView.git', + forks_url: 'https://api.github.com/repos/mralexgray/ACEView/forks', + full_name: 'mralexgray/ACEView', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/ACEView/hooks', + pulls_url: 'https://api.github.com/repos/mralexgray/ACEView/pulls{/number}', + pushed_at: '2014-05-09T01:36:23Z', + teams_url: 'https://api.github.com/repos/mralexgray/ACEView/teams', + trees_url: 'https://api.github.com/repos/mralexgray/ACEView/git/trees{/sha}', + created_at: '2013-06-19T12:15:04Z', + events_url: 'https://api.github.com/repos/mralexgray/ACEView/events', + has_issues: false, + issues_url: 'https://api.github.com/repos/mralexgray/ACEView/issues{/number}', + labels_url: 'https://api.github.com/repos/mralexgray/ACEView/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/ACEView/merges', + mirror_url: null, + updated_at: '2015-11-24T01:14:10Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/ACEView/{archive_format}{/ref}', + commits_url: 'https://api.github.com/repos/mralexgray/ACEView/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/ACEView/compare/{base}...{head}', + description: 'Use the wonderful ACE editor in your Cocoa applications', + forks_count: 1, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/ACEView/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/ACEView/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/ACEView/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/ACEView/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/ACEView/git/tags{/sha}', + has_projects: true, + releases_url: 'https://api.github.com/repos/mralexgray/ACEView/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/ACEView/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/ACEView/assignees{/user}', + downloads_url: 'https://api.github.com/repos/mralexgray/ACEView/downloads', + has_downloads: true, + languages_url: 'https://api.github.com/repos/mralexgray/ACEView/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/ACEView/milestones{/number}', + stargazers_url: 'https://api.github.com/repos/mralexgray/ACEView/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/ACEView/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/ACEView/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/ACEView/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/ACEView/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/ACEView/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/ACEView/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/ACEView/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/ACEView/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/ACEView/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 13623648, + url: 'https://api.github.com/repos/mralexgray/ActiveLog', + fork: true, + name: 'ActiveLog', + size: 60, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/ActiveLog.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnkxMzYyMzY0OA==', + private: false, + ssh_url: 'git@github.com:mralexgray/ActiveLog.git', + svn_url: 'https://github.com/mralexgray/ActiveLog', + archived: false, + disabled: false, + has_wiki: true, + homepage: 'http://deepitpro.com/en/articles/ActiveLog/info/', + html_url: 'https://github.com/mralexgray/ActiveLog', + keys_url: 'https://api.github.com/repos/mralexgray/ActiveLog/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/ActiveLog/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/ActiveLog.git', + forks_url: 'https://api.github.com/repos/mralexgray/ActiveLog/forks', + full_name: 'mralexgray/ActiveLog', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/ActiveLog/hooks', + pulls_url: 'https://api.github.com/repos/mralexgray/ActiveLog/pulls{/number}', + pushed_at: '2011-07-03T06:28:59Z', + teams_url: 'https://api.github.com/repos/mralexgray/ActiveLog/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/git/trees{/sha}', + created_at: '2013-10-16T15:52:37Z', + events_url: 'https://api.github.com/repos/mralexgray/ActiveLog/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/issues{/number}', + labels_url: 'https://api.github.com/repos/mralexgray/ActiveLog/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/ActiveLog/merges', + mirror_url: null, + updated_at: '2013-10-16T15:52:37Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/compare/{base}...{head}', + description: 'Shut up all logs with active filter.', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/assignees{/user}', + downloads_url: 'https://api.github.com/repos/mralexgray/ActiveLog/downloads', + has_downloads: true, + languages_url: 'https://api.github.com/repos/mralexgray/ActiveLog/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 9716210, + url: 'https://api.github.com/repos/mralexgray/adium', + fork: false, + name: 'adium', + size: 277719, + forks: 37, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/adium.git', + license: { + key: 'other', + url: null, + name: 'Other', + node_id: 'MDc6TGljZW5zZTA=', + spdx_id: 'NOASSERTION', + }, + node_id: 'MDEwOlJlcG9zaXRvcnk5NzE2MjEw', + private: false, + ssh_url: 'git@github.com:mralexgray/adium.git', + svn_url: 'https://github.com/mralexgray/adium', + archived: false, + disabled: false, + has_wiki: false, + homepage: null, + html_url: 'https://github.com/mralexgray/adium', + keys_url: 'https://api.github.com/repos/mralexgray/adium/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/adium/tags', + watchers: 0, + blobs_url: 'https://api.github.com/repos/mralexgray/adium/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/adium.git', + forks_url: 'https://api.github.com/repos/mralexgray/adium/forks', + full_name: 'mralexgray/adium', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/adium/hooks', + pulls_url: 'https://api.github.com/repos/mralexgray/adium/pulls{/number}', + pushed_at: '2013-04-26T16:43:53Z', + teams_url: 'https://api.github.com/repos/mralexgray/adium/teams', + trees_url: 'https://api.github.com/repos/mralexgray/adium/git/trees{/sha}', + created_at: '2013-04-27T14:59:33Z', + events_url: 'https://api.github.com/repos/mralexgray/adium/events', + has_issues: false, + issues_url: 'https://api.github.com/repos/mralexgray/adium/issues{/number}', + labels_url: 'https://api.github.com/repos/mralexgray/adium/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/adium/merges', + mirror_url: null, + updated_at: '2019-12-11T06:51:45Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/adium/{archive_format}{/ref}', + commits_url: 'https://api.github.com/repos/mralexgray/adium/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/adium/compare/{base}...{head}', + description: 'Official mirror of hg.adium.im', + forks_count: 37, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/adium/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/adium/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/adium/contents/{+path}', + git_refs_url: 'https://api.github.com/repos/mralexgray/adium/git/refs{/sha}', + git_tags_url: 'https://api.github.com/repos/mralexgray/adium/git/tags{/sha}', + has_projects: true, + releases_url: 'https://api.github.com/repos/mralexgray/adium/releases{/id}', + statuses_url: 'https://api.github.com/repos/mralexgray/adium/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/adium/assignees{/user}', + downloads_url: 'https://api.github.com/repos/mralexgray/adium/downloads', + has_downloads: true, + languages_url: 'https://api.github.com/repos/mralexgray/adium/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/adium/milestones{/number}', + stargazers_url: 'https://api.github.com/repos/mralexgray/adium/stargazers', + watchers_count: 0, + deployments_url: 'https://api.github.com/repos/mralexgray/adium/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/adium/git/commits{/sha}', + subscribers_url: 'https://api.github.com/repos/mralexgray/adium/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/adium/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/adium/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/adium/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/adium/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/adium/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/adium/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 12752329, + url: 'https://api.github.com/repos/mralexgray/ADLivelyTableView', + fork: true, + name: 'ADLivelyTableView', + size: 73, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/ADLivelyTableView.git', + license: { + key: 'other', + url: null, + name: 'Other', + node_id: 'MDc6TGljZW5zZTA=', + spdx_id: 'NOASSERTION', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkxMjc1MjMyOQ==', + private: false, + ssh_url: 'git@github.com:mralexgray/ADLivelyTableView.git', + svn_url: 'https://github.com/mralexgray/ADLivelyTableView', + archived: false, + disabled: false, + has_wiki: true, + homepage: 'http://applidium.com/en/news/lively_uitableview/', + html_url: 'https://github.com/mralexgray/ADLivelyTableView', + keys_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/ADLivelyTableView/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/ADLivelyTableView.git', + forks_url: 'https://api.github.com/repos/mralexgray/ADLivelyTableView/forks', + full_name: 'mralexgray/ADLivelyTableView', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/ADLivelyTableView/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/pulls{/number}', + pushed_at: '2012-05-10T10:40:15Z', + teams_url: 'https://api.github.com/repos/mralexgray/ADLivelyTableView/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/git/trees{/sha}', + created_at: '2013-09-11T09:18:01Z', + events_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/merges', + mirror_url: null, + updated_at: '2013-09-11T09:18:03Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/compare/{base}...{head}', + description: 'Lively UITableView', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 5697379, + url: 'https://api.github.com/repos/mralexgray/AFIncrementalStore', + fork: true, + name: 'AFIncrementalStore', + size: 139, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/AFIncrementalStore.git', + license: { + key: 'mit', + url: 'https://api.github.com/licenses/mit', + name: 'MIT License', + node_id: 'MDc6TGljZW5zZTEz', + spdx_id: 'MIT', + }, + node_id: 'MDEwOlJlcG9zaXRvcnk1Njk3Mzc5', + private: false, + ssh_url: 'git@github.com:mralexgray/AFIncrementalStore.git', + svn_url: 'https://github.com/mralexgray/AFIncrementalStore', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/AFIncrementalStore', + keys_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/AFIncrementalStore/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/AFIncrementalStore.git', + forks_url: 'https://api.github.com/repos/mralexgray/AFIncrementalStore/forks', + full_name: 'mralexgray/AFIncrementalStore', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/AFIncrementalStore/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/pulls{/number}', + pushed_at: '2012-09-01T22:46:25Z', + teams_url: 'https://api.github.com/repos/mralexgray/AFIncrementalStore/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/git/trees{/sha}', + created_at: '2012-09-06T04:20:33Z', + events_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/merges', + mirror_url: null, + updated_at: '2013-01-12T03:15:29Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/compare/{base}...{head}', + description: 'Core Data Persistence with AFNetworking, Done Right', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 6969621, + url: 'https://api.github.com/repos/mralexgray/AFNetworking', + fork: true, + name: 'AFNetworking', + size: 4341, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/AFNetworking.git', + license: { + key: 'mit', + url: 'https://api.github.com/licenses/mit', + name: 'MIT License', + node_id: 'MDc6TGljZW5zZTEz', + spdx_id: 'MIT', + }, + node_id: 'MDEwOlJlcG9zaXRvcnk2OTY5NjIx', + private: false, + ssh_url: 'git@github.com:mralexgray/AFNetworking.git', + svn_url: 'https://github.com/mralexgray/AFNetworking', + archived: false, + disabled: false, + has_wiki: true, + homepage: 'http://afnetworking.com', + html_url: 'https://github.com/mralexgray/AFNetworking', + keys_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/AFNetworking/tags', + watchers: 2, + blobs_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/AFNetworking.git', + forks_url: 'https://api.github.com/repos/mralexgray/AFNetworking/forks', + full_name: 'mralexgray/AFNetworking', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/AFNetworking/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/pulls{/number}', + pushed_at: '2014-01-24T07:14:32Z', + teams_url: 'https://api.github.com/repos/mralexgray/AFNetworking/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/git/trees{/sha}', + created_at: '2012-12-02T17:00:04Z', + events_url: 'https://api.github.com/repos/mralexgray/AFNetworking/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/AFNetworking/merges', + mirror_url: null, + updated_at: '2014-01-24T07:14:33Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/compare/{base}...{head}', + description: 'A delightful iOS and OS X networking framework', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/stargazers', + watchers_count: 2, + deployments_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/issues/events{/number}', + stargazers_count: 2, + subscription_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 9485541, + url: 'https://api.github.com/repos/mralexgray/AGNSSplitView', + fork: true, + name: 'AGNSSplitView', + size: 68, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/AGNSSplitView.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnk5NDg1NTQx', + private: false, + ssh_url: 'git@github.com:mralexgray/AGNSSplitView.git', + svn_url: 'https://github.com/mralexgray/AGNSSplitView', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/AGNSSplitView', + keys_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/AGNSSplitView/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/AGNSSplitView.git', + forks_url: 'https://api.github.com/repos/mralexgray/AGNSSplitView/forks', + full_name: 'mralexgray/AGNSSplitView', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/AGNSSplitView/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/pulls{/number}', + pushed_at: '2013-02-26T00:32:32Z', + teams_url: 'https://api.github.com/repos/mralexgray/AGNSSplitView/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/git/trees{/sha}', + created_at: '2013-04-17T00:10:13Z', + events_url: 'https://api.github.com/repos/mralexgray/AGNSSplitView/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/AGNSSplitView/merges', + mirror_url: null, + updated_at: '2013-04-17T00:10:13Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/compare/{base}...{head}', + description: 'Simple NSSplitView additions.', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 12767784, + url: 'https://api.github.com/repos/mralexgray/AGScopeBar', + fork: true, + name: 'AGScopeBar', + size: 64, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/AGScopeBar.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnkxMjc2Nzc4NA==', + private: false, + ssh_url: 'git@github.com:mralexgray/AGScopeBar.git', + svn_url: 'https://github.com/mralexgray/AGScopeBar', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/AGScopeBar', + keys_url: 'https://api.github.com/repos/mralexgray/AGScopeBar/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/AGScopeBar/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/AGScopeBar.git', + forks_url: 'https://api.github.com/repos/mralexgray/AGScopeBar/forks', + full_name: 'mralexgray/AGScopeBar', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/AGScopeBar/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/pulls{/number}', + pushed_at: '2013-05-07T03:35:29Z', + teams_url: 'https://api.github.com/repos/mralexgray/AGScopeBar/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/git/trees{/sha}', + created_at: '2013-09-11T21:06:54Z', + events_url: 'https://api.github.com/repos/mralexgray/AGScopeBar/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/AGScopeBar/merges', + mirror_url: null, + updated_at: '2013-09-11T21:06:54Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/compare/{base}...{head}', + description: 'Custom scope bar implementation for Cocoa', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/assignees{/user}', + downloads_url: 'https://api.github.com/repos/mralexgray/AGScopeBar/downloads', + has_downloads: true, + languages_url: 'https://api.github.com/repos/mralexgray/AGScopeBar/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 31829499, + url: 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin', + fork: true, + name: 'agvtool-xcode-plugin', + size: 102, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/agvtool-xcode-plugin.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnkzMTgyOTQ5OQ==', + private: false, + ssh_url: 'git@github.com:mralexgray/agvtool-xcode-plugin.git', + svn_url: 'https://github.com/mralexgray/agvtool-xcode-plugin', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/agvtool-xcode-plugin', + keys_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/agvtool-xcode-plugin.git', + forks_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/forks', + full_name: 'mralexgray/agvtool-xcode-plugin', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/pulls{/number}', + pushed_at: '2015-03-08T00:04:31Z', + teams_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/git/trees{/sha}', + created_at: '2015-03-07T22:15:38Z', + events_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/merges', + mirror_url: null, + updated_at: '2015-03-07T22:15:41Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/compare/{base}...{head}', + description: 'this is a plugin wrapper for agvtool for xcode.', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 9227846, + url: 'https://api.github.com/repos/mralexgray/AHContentBrowser', + fork: true, + name: 'AHContentBrowser', + size: 223, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/AHContentBrowser.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnk5MjI3ODQ2', + private: false, + ssh_url: 'git@github.com:mralexgray/AHContentBrowser.git', + svn_url: 'https://github.com/mralexgray/AHContentBrowser', + archived: false, + disabled: false, + has_wiki: true, + homepage: '', + html_url: 'https://github.com/mralexgray/AHContentBrowser', + keys_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/AHContentBrowser/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/AHContentBrowser.git', + forks_url: 'https://api.github.com/repos/mralexgray/AHContentBrowser/forks', + full_name: 'mralexgray/AHContentBrowser', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/AHContentBrowser/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/pulls{/number}', + pushed_at: '2013-03-13T17:38:23Z', + teams_url: 'https://api.github.com/repos/mralexgray/AHContentBrowser/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/git/trees{/sha}', + created_at: '2013-04-04T20:56:16Z', + events_url: 'https://api.github.com/repos/mralexgray/AHContentBrowser/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/AHContentBrowser/merges', + mirror_url: null, + updated_at: '2015-10-22T05:00:24Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/compare/{base}...{head}', + description: + 'A Mac only webview that loads a fast readable version of the website if available.', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 37430328, + url: 'https://api.github.com/repos/mralexgray/AHLaunchCtl', + fork: true, + name: 'AHLaunchCtl', + size: 592, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/AHLaunchCtl.git', + license: { + key: 'mit', + url: 'https://api.github.com/licenses/mit', + name: 'MIT License', + node_id: 'MDc6TGljZW5zZTEz', + spdx_id: 'MIT', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkzNzQzMDMyOA==', + private: false, + ssh_url: 'git@github.com:mralexgray/AHLaunchCtl.git', + svn_url: 'https://github.com/mralexgray/AHLaunchCtl', + archived: false, + disabled: false, + has_wiki: true, + homepage: '', + html_url: 'https://github.com/mralexgray/AHLaunchCtl', + keys_url: 'https://api.github.com/repos/mralexgray/AHLaunchCtl/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/AHLaunchCtl/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/AHLaunchCtl.git', + forks_url: 'https://api.github.com/repos/mralexgray/AHLaunchCtl/forks', + full_name: 'mralexgray/AHLaunchCtl', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/AHLaunchCtl/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/pulls{/number}', + pushed_at: '2015-05-26T18:50:48Z', + teams_url: 'https://api.github.com/repos/mralexgray/AHLaunchCtl/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/git/trees{/sha}', + created_at: '2015-06-14T21:31:03Z', + events_url: 'https://api.github.com/repos/mralexgray/AHLaunchCtl/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/AHLaunchCtl/merges', + mirror_url: null, + updated_at: '2015-06-14T21:31:04Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/compare/{base}...{head}', + description: 'LaunchD Framework for Cocoa Apps', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 9167473, + url: 'https://api.github.com/repos/mralexgray/AHLayout', + fork: true, + name: 'AHLayout', + size: 359, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/AHLayout.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnk5MTY3NDcz', + private: false, + ssh_url: 'git@github.com:mralexgray/AHLayout.git', + svn_url: 'https://github.com/mralexgray/AHLayout', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/AHLayout', + keys_url: 'https://api.github.com/repos/mralexgray/AHLayout/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/AHLayout/tags', + watchers: 0, + blobs_url: 'https://api.github.com/repos/mralexgray/AHLayout/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/AHLayout.git', + forks_url: 'https://api.github.com/repos/mralexgray/AHLayout/forks', + full_name: 'mralexgray/AHLayout', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/AHLayout/hooks', + pulls_url: 'https://api.github.com/repos/mralexgray/AHLayout/pulls{/number}', + pushed_at: '2013-07-08T02:31:14Z', + teams_url: 'https://api.github.com/repos/mralexgray/AHLayout/teams', + trees_url: 'https://api.github.com/repos/mralexgray/AHLayout/git/trees{/sha}', + created_at: '2013-04-02T10:10:30Z', + events_url: 'https://api.github.com/repos/mralexgray/AHLayout/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/AHLayout/issues{/number}', + labels_url: 'https://api.github.com/repos/mralexgray/AHLayout/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/AHLayout/merges', + mirror_url: null, + updated_at: '2013-07-08T02:31:17Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/AHLayout/{archive_format}{/ref}', + commits_url: 'https://api.github.com/repos/mralexgray/AHLayout/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/AHLayout/compare/{base}...{head}', + description: 'AHLayout', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/AHLayout/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/AHLayout/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/AHLayout/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/AHLayout/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/AHLayout/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/AHLayout/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/AHLayout/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/AHLayout/assignees{/user}', + downloads_url: 'https://api.github.com/repos/mralexgray/AHLayout/downloads', + has_downloads: true, + languages_url: 'https://api.github.com/repos/mralexgray/AHLayout/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/AHLayout/milestones{/number}', + stargazers_url: 'https://api.github.com/repos/mralexgray/AHLayout/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/AHLayout/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/AHLayout/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/AHLayout/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/AHLayout/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/AHLayout/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/AHLayout/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/AHLayout/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/AHLayout/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/AHLayout/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 18450201, + url: 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework', + fork: true, + name: 'Airmail-Plug-In-Framework', + size: 888, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/Airmail-Plug-In-Framework.git', + license: { + key: 'gpl-2.0', + url: 'https://api.github.com/licenses/gpl-2.0', + name: 'GNU General Public License v2.0', + node_id: 'MDc6TGljZW5zZTg=', + spdx_id: 'GPL-2.0', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkxODQ1MDIwMQ==', + private: false, + ssh_url: 'git@github.com:mralexgray/Airmail-Plug-In-Framework.git', + svn_url: 'https://github.com/mralexgray/Airmail-Plug-In-Framework', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/Airmail-Plug-In-Framework', + keys_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/keys{/key_id}', + language: null, + tags_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/Airmail-Plug-In-Framework.git', + forks_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/forks', + full_name: 'mralexgray/Airmail-Plug-In-Framework', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/pulls{/number}', + pushed_at: '2014-03-27T15:42:19Z', + teams_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/git/trees{/sha}', + created_at: '2014-04-04T19:33:54Z', + events_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/merges', + mirror_url: null, + updated_at: '2014-11-23T19:31:04Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/compare/{base}...{head}', + description: null, + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 5203219, + url: 'https://api.github.com/repos/mralexgray/AJS-iTunes-API', + fork: true, + name: 'AJS-iTunes-API', + size: 103, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/AJS-iTunes-API.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnk1MjAzMjE5', + private: false, + ssh_url: 'git@github.com:mralexgray/AJS-iTunes-API.git', + svn_url: 'https://github.com/mralexgray/AJS-iTunes-API', + archived: false, + disabled: false, + has_wiki: true, + homepage: '', + html_url: 'https://github.com/mralexgray/AJS-iTunes-API', + keys_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/tags', + watchers: 2, + blobs_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/AJS-iTunes-API.git', + forks_url: 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/forks', + full_name: 'mralexgray/AJS-iTunes-API', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/pulls{/number}', + pushed_at: '2011-10-30T22:26:48Z', + teams_url: 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/git/trees{/sha}', + created_at: '2012-07-27T10:20:58Z', + events_url: 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/merges', + mirror_url: null, + updated_at: '2013-01-11T11:00:05Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/compare/{base}...{head}', + description: + 'Cocoa wrapper for the iTunes search API - for iOS and Mac OSX projects', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/stargazers', + watchers_count: 2, + deployments_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/issues/events{/number}', + stargazers_count: 2, + subscription_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 10093801, + url: 'https://api.github.com/repos/mralexgray/Alcatraz', + fork: true, + name: 'Alcatraz', + size: 3668, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/Alcatraz.git', + license: { + key: 'mit', + url: 'https://api.github.com/licenses/mit', + name: 'MIT License', + node_id: 'MDc6TGljZW5zZTEz', + spdx_id: 'MIT', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkxMDA5MzgwMQ==', + private: false, + ssh_url: 'git@github.com:mralexgray/Alcatraz.git', + svn_url: 'https://github.com/mralexgray/Alcatraz', + archived: false, + disabled: false, + has_wiki: false, + homepage: 'mneorr.github.com/Alcatraz', + html_url: 'https://github.com/mralexgray/Alcatraz', + keys_url: 'https://api.github.com/repos/mralexgray/Alcatraz/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/Alcatraz/tags', + watchers: 0, + blobs_url: 'https://api.github.com/repos/mralexgray/Alcatraz/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/Alcatraz.git', + forks_url: 'https://api.github.com/repos/mralexgray/Alcatraz/forks', + full_name: 'mralexgray/Alcatraz', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/Alcatraz/hooks', + pulls_url: 'https://api.github.com/repos/mralexgray/Alcatraz/pulls{/number}', + pushed_at: '2014-03-19T12:50:37Z', + teams_url: 'https://api.github.com/repos/mralexgray/Alcatraz/teams', + trees_url: 'https://api.github.com/repos/mralexgray/Alcatraz/git/trees{/sha}', + created_at: '2013-05-16T04:41:13Z', + events_url: 'https://api.github.com/repos/mralexgray/Alcatraz/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/issues{/number}', + labels_url: 'https://api.github.com/repos/mralexgray/Alcatraz/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/Alcatraz/merges', + mirror_url: null, + updated_at: '2014-03-19T20:38:35Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/{archive_format}{/ref}', + commits_url: 'https://api.github.com/repos/mralexgray/Alcatraz/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/compare/{base}...{head}', + description: 'The most awesome (and only) Xcode package manager!', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/assignees{/user}', + downloads_url: 'https://api.github.com/repos/mralexgray/Alcatraz/downloads', + has_downloads: true, + languages_url: 'https://api.github.com/repos/mralexgray/Alcatraz/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/milestones{/number}', + stargazers_url: 'https://api.github.com/repos/mralexgray/Alcatraz/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 12916552, + url: 'https://api.github.com/repos/mralexgray/alcatraz-packages', + fork: true, + name: 'alcatraz-packages', + size: 826, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/alcatraz-packages.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnkxMjkxNjU1Mg==', + private: false, + ssh_url: 'git@github.com:mralexgray/alcatraz-packages.git', + svn_url: 'https://github.com/mralexgray/alcatraz-packages', + archived: false, + disabled: false, + has_wiki: true, + homepage: 'mneorr.github.com/Alcatraz', + html_url: 'https://github.com/mralexgray/alcatraz-packages', + keys_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/keys{/key_id}', + language: 'Ruby', + tags_url: 'https://api.github.com/repos/mralexgray/alcatraz-packages/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/alcatraz-packages.git', + forks_url: 'https://api.github.com/repos/mralexgray/alcatraz-packages/forks', + full_name: 'mralexgray/alcatraz-packages', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/alcatraz-packages/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/pulls{/number}', + pushed_at: '2015-12-14T16:21:31Z', + teams_url: 'https://api.github.com/repos/mralexgray/alcatraz-packages/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/git/trees{/sha}', + created_at: '2013-09-18T07:15:24Z', + events_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/merges', + mirror_url: null, + updated_at: '2015-11-10T20:52:30Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/compare/{base}...{head}', + description: 'Package list repository for Alcatraz', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 44278362, + url: 'https://api.github.com/repos/mralexgray/alexicons', + fork: true, + name: 'alexicons', + size: 257, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/alexicons.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnk0NDI3ODM2Mg==', + private: false, + ssh_url: 'git@github.com:mralexgray/alexicons.git', + svn_url: 'https://github.com/mralexgray/alexicons', + archived: false, + disabled: false, + has_wiki: false, + homepage: null, + html_url: 'https://github.com/mralexgray/alexicons', + keys_url: 'https://api.github.com/repos/mralexgray/alexicons/keys{/key_id}', + language: 'CoffeeScript', + tags_url: 'https://api.github.com/repos/mralexgray/alexicons/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/alexicons/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/alexicons.git', + forks_url: 'https://api.github.com/repos/mralexgray/alexicons/forks', + full_name: 'mralexgray/alexicons', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/alexicons/hooks', + pulls_url: 'https://api.github.com/repos/mralexgray/alexicons/pulls{/number}', + pushed_at: '2015-10-16T03:57:51Z', + teams_url: 'https://api.github.com/repos/mralexgray/alexicons/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/alexicons/git/trees{/sha}', + created_at: '2015-10-14T21:49:39Z', + events_url: 'https://api.github.com/repos/mralexgray/alexicons/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/alexicons/issues{/number}', + labels_url: 'https://api.github.com/repos/mralexgray/alexicons/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/alexicons/merges', + mirror_url: null, + updated_at: '2015-10-15T06:20:08Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/alexicons/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/alexicons/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/alexicons/compare/{base}...{head}', + description: 'Get popular cat names', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/alexicons/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/alexicons/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/alexicons/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/alexicons/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/alexicons/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/alexicons/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/alexicons/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/alexicons/assignees{/user}', + downloads_url: 'https://api.github.com/repos/mralexgray/alexicons/downloads', + has_downloads: true, + languages_url: 'https://api.github.com/repos/mralexgray/alexicons/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/alexicons/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/alexicons/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/alexicons/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/alexicons/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/alexicons/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/alexicons/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/alexicons/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/alexicons/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/alexicons/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/alexicons/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/alexicons/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 10476467, + url: 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate', + fork: true, + name: 'Alfred-Google-Translate', + size: 103, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/Alfred-Google-Translate.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnkxMDQ3NjQ2Nw==', + private: false, + ssh_url: 'git@github.com:mralexgray/Alfred-Google-Translate.git', + svn_url: 'https://github.com/mralexgray/Alfred-Google-Translate', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/Alfred-Google-Translate', + keys_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/keys{/key_id}', + language: 'Shell', + tags_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/Alfred-Google-Translate.git', + forks_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/forks', + full_name: 'mralexgray/Alfred-Google-Translate', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/pulls{/number}', + pushed_at: '2013-01-12T19:39:03Z', + teams_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/git/trees{/sha}', + created_at: '2013-06-04T10:45:10Z', + events_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/merges', + mirror_url: null, + updated_at: '2013-06-04T10:45:10Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/compare/{base}...{head}', + description: 'Extension for Alfred that will do a Google translate for you', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 5524019, + url: 'https://api.github.com/repos/mralexgray/Amber', + fork: false, + name: 'Amber', + size: 48, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/Amber.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnk1NTI0MDE5', + private: false, + ssh_url: 'git@github.com:mralexgray/Amber.git', + svn_url: 'https://github.com/mralexgray/Amber', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/Amber', + keys_url: 'https://api.github.com/repos/mralexgray/Amber/keys{/key_id}', + language: null, + tags_url: 'https://api.github.com/repos/mralexgray/Amber/tags', + watchers: 0, + blobs_url: 'https://api.github.com/repos/mralexgray/Amber/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/Amber.git', + forks_url: 'https://api.github.com/repos/mralexgray/Amber/forks', + full_name: 'mralexgray/Amber', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/Amber/hooks', + pulls_url: 'https://api.github.com/repos/mralexgray/Amber/pulls{/number}', + pushed_at: '2012-08-23T10:38:25Z', + teams_url: 'https://api.github.com/repos/mralexgray/Amber/teams', + trees_url: 'https://api.github.com/repos/mralexgray/Amber/git/trees{/sha}', + created_at: '2012-08-23T10:38:24Z', + events_url: 'https://api.github.com/repos/mralexgray/Amber/events', + has_issues: true, + issues_url: 'https://api.github.com/repos/mralexgray/Amber/issues{/number}', + labels_url: 'https://api.github.com/repos/mralexgray/Amber/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/Amber/merges', + mirror_url: null, + updated_at: '2013-01-11T22:25:35Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/Amber/{archive_format}{/ref}', + commits_url: 'https://api.github.com/repos/mralexgray/Amber/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/Amber/compare/{base}...{head}', + description: 'Fork of the difficult-to-deal-with Amber.framework', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/Amber/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/Amber/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/Amber/contents/{+path}', + git_refs_url: 'https://api.github.com/repos/mralexgray/Amber/git/refs{/sha}', + git_tags_url: 'https://api.github.com/repos/mralexgray/Amber/git/tags{/sha}', + has_projects: true, + releases_url: 'https://api.github.com/repos/mralexgray/Amber/releases{/id}', + statuses_url: 'https://api.github.com/repos/mralexgray/Amber/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/Amber/assignees{/user}', + downloads_url: 'https://api.github.com/repos/mralexgray/Amber/downloads', + has_downloads: true, + languages_url: 'https://api.github.com/repos/mralexgray/Amber/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/Amber/milestones{/number}', + stargazers_url: 'https://api.github.com/repos/mralexgray/Amber/stargazers', + watchers_count: 0, + deployments_url: 'https://api.github.com/repos/mralexgray/Amber/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/Amber/git/commits{/sha}', + subscribers_url: 'https://api.github.com/repos/mralexgray/Amber/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/Amber/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/Amber/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/Amber/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/Amber/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/Amber/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/Amber/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 10809060, + url: 'https://api.github.com/repos/mralexgray/Amethyst', + fork: true, + name: 'Amethyst', + size: 12623, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/Amethyst.git', + license: { + key: 'mit', + url: 'https://api.github.com/licenses/mit', + name: 'MIT License', + node_id: 'MDc6TGljZW5zZTEz', + spdx_id: 'MIT', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkxMDgwOTA2MA==', + private: false, + ssh_url: 'git@github.com:mralexgray/Amethyst.git', + svn_url: 'https://github.com/mralexgray/Amethyst', + archived: false, + disabled: false, + has_wiki: true, + homepage: 'http://ianyh.github.io/Amethyst/', + html_url: 'https://github.com/mralexgray/Amethyst', + keys_url: 'https://api.github.com/repos/mralexgray/Amethyst/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/Amethyst/tags', + watchers: 0, + blobs_url: 'https://api.github.com/repos/mralexgray/Amethyst/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/Amethyst.git', + forks_url: 'https://api.github.com/repos/mralexgray/Amethyst/forks', + full_name: 'mralexgray/Amethyst', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/Amethyst/hooks', + pulls_url: 'https://api.github.com/repos/mralexgray/Amethyst/pulls{/number}', + pushed_at: '2013-06-18T02:54:11Z', + teams_url: 'https://api.github.com/repos/mralexgray/Amethyst/teams', + trees_url: 'https://api.github.com/repos/mralexgray/Amethyst/git/trees{/sha}', + created_at: '2013-06-20T00:34:22Z', + events_url: 'https://api.github.com/repos/mralexgray/Amethyst/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/Amethyst/issues{/number}', + labels_url: 'https://api.github.com/repos/mralexgray/Amethyst/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/Amethyst/merges', + mirror_url: null, + updated_at: '2013-06-20T00:34:22Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/Amethyst/{archive_format}{/ref}', + commits_url: 'https://api.github.com/repos/mralexgray/Amethyst/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/Amethyst/compare/{base}...{head}', + description: 'Tiling window manager for OS X.', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/Amethyst/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/Amethyst/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/Amethyst/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/Amethyst/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/Amethyst/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/Amethyst/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/Amethyst/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/Amethyst/assignees{/user}', + downloads_url: 'https://api.github.com/repos/mralexgray/Amethyst/downloads', + has_downloads: true, + languages_url: 'https://api.github.com/repos/mralexgray/Amethyst/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/Amethyst/milestones{/number}', + stargazers_url: 'https://api.github.com/repos/mralexgray/Amethyst/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/Amethyst/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/Amethyst/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/Amethyst/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/Amethyst/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/Amethyst/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/Amethyst/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/Amethyst/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/Amethyst/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/Amethyst/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 3684286, + url: 'https://api.github.com/repos/mralexgray/Animated-Paths', + fork: true, + name: 'Animated-Paths', + size: 411, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/Animated-Paths.git', + license: { + key: 'other', + url: null, + name: 'Other', + node_id: 'MDc6TGljZW5zZTA=', + spdx_id: 'NOASSERTION', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkzNjg0Mjg2', + private: false, + ssh_url: 'git@github.com:mralexgray/Animated-Paths.git', + svn_url: 'https://github.com/mralexgray/Animated-Paths', + archived: false, + disabled: false, + has_wiki: true, + homepage: + 'http://oleb.net/blog/2010/12/animating-drawing-of-cgpath-with-cashapelayer/', + html_url: 'https://github.com/mralexgray/Animated-Paths', + keys_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/Animated-Paths/tags', + watchers: 2, + blobs_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/Animated-Paths.git', + forks_url: 'https://api.github.com/repos/mralexgray/Animated-Paths/forks', + full_name: 'mralexgray/Animated-Paths', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/Animated-Paths/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/pulls{/number}', + pushed_at: '2010-12-30T20:56:51Z', + teams_url: 'https://api.github.com/repos/mralexgray/Animated-Paths/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/git/trees{/sha}', + created_at: '2012-03-11T02:56:38Z', + events_url: 'https://api.github.com/repos/mralexgray/Animated-Paths/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/Animated-Paths/merges', + mirror_url: null, + updated_at: '2013-01-08T04:12:21Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/compare/{base}...{head}', + description: + 'Demo project: Animating the drawing of a CGPath with CAShapeLayer.strokeEnd', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/stargazers', + watchers_count: 2, + deployments_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/issues/events{/number}', + stargazers_count: 2, + subscription_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 16662874, + url: 'https://api.github.com/repos/mralexgray/AnsiLove.framework', + fork: true, + name: 'AnsiLove.framework', + size: 3780, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/AnsiLove.framework.git', + license: { + key: 'other', + url: null, + name: 'Other', + node_id: 'MDc6TGljZW5zZTA=', + spdx_id: 'NOASSERTION', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkxNjY2Mjg3NA==', + private: false, + ssh_url: 'git@github.com:mralexgray/AnsiLove.framework.git', + svn_url: 'https://github.com/mralexgray/AnsiLove.framework', + archived: false, + disabled: false, + has_wiki: false, + homepage: 'http://byteproject.net', + html_url: 'https://github.com/mralexgray/AnsiLove.framework', + keys_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/keys{/key_id}', + language: 'M', + tags_url: 'https://api.github.com/repos/mralexgray/AnsiLove.framework/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/AnsiLove.framework.git', + forks_url: 'https://api.github.com/repos/mralexgray/AnsiLove.framework/forks', + full_name: 'mralexgray/AnsiLove.framework', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/AnsiLove.framework/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/pulls{/number}', + pushed_at: '2013-10-04T14:08:38Z', + teams_url: 'https://api.github.com/repos/mralexgray/AnsiLove.framework/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/git/trees{/sha}', + created_at: '2014-02-09T08:30:27Z', + events_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/merges', + mirror_url: null, + updated_at: '2015-01-13T20:41:46Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/compare/{base}...{head}', + description: 'Cocoa Framework for rendering ANSi / ASCII art', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 5189563, + url: 'https://api.github.com/repos/mralexgray/ANTrackBar', + fork: true, + name: 'ANTrackBar', + size: 94, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/ANTrackBar.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnk1MTg5NTYz', + private: false, + ssh_url: 'git@github.com:mralexgray/ANTrackBar.git', + svn_url: 'https://github.com/mralexgray/ANTrackBar', + archived: false, + disabled: false, + has_wiki: true, + homepage: '', + html_url: 'https://github.com/mralexgray/ANTrackBar', + keys_url: 'https://api.github.com/repos/mralexgray/ANTrackBar/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/ANTrackBar/tags', + watchers: 2, + blobs_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/ANTrackBar.git', + forks_url: 'https://api.github.com/repos/mralexgray/ANTrackBar/forks', + full_name: 'mralexgray/ANTrackBar', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/ANTrackBar/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/pulls{/number}', + pushed_at: '2012-03-09T01:40:02Z', + teams_url: 'https://api.github.com/repos/mralexgray/ANTrackBar/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/git/trees{/sha}', + created_at: '2012-07-26T08:17:22Z', + events_url: 'https://api.github.com/repos/mralexgray/ANTrackBar/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/ANTrackBar/merges', + mirror_url: null, + updated_at: '2013-01-11T10:29:56Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/compare/{base}...{head}', + description: 'An easy-to-use Cocoa seek bar with a pleasing appearance', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/assignees{/user}', + downloads_url: 'https://api.github.com/repos/mralexgray/ANTrackBar/downloads', + has_downloads: true, + languages_url: 'https://api.github.com/repos/mralexgray/ANTrackBar/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/stargazers', + watchers_count: 2, + deployments_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/issues/events{/number}', + stargazers_count: 2, + subscription_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 16240152, + url: 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C', + fork: true, + name: 'AOP-in-Objective-C', + size: 340, + forks: 1, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/AOP-in-Objective-C.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnkxNjI0MDE1Mg==', + private: false, + ssh_url: 'git@github.com:mralexgray/AOP-in-Objective-C.git', + svn_url: 'https://github.com/mralexgray/AOP-in-Objective-C', + archived: false, + disabled: false, + has_wiki: true, + homepage: 'http://innoli.hu/en/opensource/', + html_url: 'https://github.com/mralexgray/AOP-in-Objective-C', + keys_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/AOP-in-Objective-C.git', + forks_url: 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/forks', + full_name: 'mralexgray/AOP-in-Objective-C', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/pulls{/number}', + pushed_at: '2014-02-12T16:23:20Z', + teams_url: 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/git/trees{/sha}', + created_at: '2014-01-25T21:18:04Z', + events_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/merges', + mirror_url: null, + updated_at: '2014-06-19T19:38:12Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/compare/{base}...{head}', + description: + 'An NSProxy based library for easily enabling AOP like functionality in Objective-C.', + forks_count: 1, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/languages', + default_branch: 'travis-coveralls', + milestones_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 13141936, + url: 'https://api.github.com/repos/mralexgray/Apaxy', + fork: true, + name: 'Apaxy', + size: 113, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/Apaxy.git', + license: { + key: 'unlicense', + url: 'https://api.github.com/licenses/unlicense', + name: 'The Unlicense', + node_id: 'MDc6TGljZW5zZTE1', + spdx_id: 'Unlicense', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkxMzE0MTkzNg==', + private: false, + ssh_url: 'git@github.com:mralexgray/Apaxy.git', + svn_url: 'https://github.com/mralexgray/Apaxy', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/Apaxy', + keys_url: 'https://api.github.com/repos/mralexgray/Apaxy/keys{/key_id}', + language: 'CSS', + tags_url: 'https://api.github.com/repos/mralexgray/Apaxy/tags', + watchers: 0, + blobs_url: 'https://api.github.com/repos/mralexgray/Apaxy/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/Apaxy.git', + forks_url: 'https://api.github.com/repos/mralexgray/Apaxy/forks', + full_name: 'mralexgray/Apaxy', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/Apaxy/hooks', + pulls_url: 'https://api.github.com/repos/mralexgray/Apaxy/pulls{/number}', + pushed_at: '2013-08-02T16:01:32Z', + teams_url: 'https://api.github.com/repos/mralexgray/Apaxy/teams', + trees_url: 'https://api.github.com/repos/mralexgray/Apaxy/git/trees{/sha}', + created_at: '2013-09-27T05:05:35Z', + events_url: 'https://api.github.com/repos/mralexgray/Apaxy/events', + has_issues: false, + issues_url: 'https://api.github.com/repos/mralexgray/Apaxy/issues{/number}', + labels_url: 'https://api.github.com/repos/mralexgray/Apaxy/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/Apaxy/merges', + mirror_url: null, + updated_at: '2018-02-16T21:40:24Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/Apaxy/{archive_format}{/ref}', + commits_url: 'https://api.github.com/repos/mralexgray/Apaxy/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/Apaxy/compare/{base}...{head}', + description: + 'A simple, customisable theme for your Apache directory listing.', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/Apaxy/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/Apaxy/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/Apaxy/contents/{+path}', + git_refs_url: 'https://api.github.com/repos/mralexgray/Apaxy/git/refs{/sha}', + git_tags_url: 'https://api.github.com/repos/mralexgray/Apaxy/git/tags{/sha}', + has_projects: true, + releases_url: 'https://api.github.com/repos/mralexgray/Apaxy/releases{/id}', + statuses_url: 'https://api.github.com/repos/mralexgray/Apaxy/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/Apaxy/assignees{/user}', + downloads_url: 'https://api.github.com/repos/mralexgray/Apaxy/downloads', + has_downloads: true, + languages_url: 'https://api.github.com/repos/mralexgray/Apaxy/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/Apaxy/milestones{/number}', + stargazers_url: 'https://api.github.com/repos/mralexgray/Apaxy/stargazers', + watchers_count: 0, + deployments_url: 'https://api.github.com/repos/mralexgray/Apaxy/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/Apaxy/git/commits{/sha}', + subscribers_url: 'https://api.github.com/repos/mralexgray/Apaxy/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/Apaxy/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/Apaxy/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/Apaxy/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/Apaxy/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/Apaxy/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/Apaxy/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 20027360, + url: 'https://api.github.com/repos/mralexgray/app', + fork: true, + name: 'app', + size: 1890, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/app.git', + license: { + key: 'other', + url: null, + name: 'Other', + node_id: 'MDc6TGljZW5zZTA=', + spdx_id: 'NOASSERTION', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkyMDAyNzM2MA==', + private: false, + ssh_url: 'git@github.com:mralexgray/app.git', + svn_url: 'https://github.com/mralexgray/app', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/app', + keys_url: 'https://api.github.com/repos/mralexgray/app/keys{/key_id}', + language: 'JavaScript', + tags_url: 'https://api.github.com/repos/mralexgray/app/tags', + watchers: 0, + blobs_url: 'https://api.github.com/repos/mralexgray/app/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/app.git', + forks_url: 'https://api.github.com/repos/mralexgray/app/forks', + full_name: 'mralexgray/app', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/app/hooks', + pulls_url: 'https://api.github.com/repos/mralexgray/app/pulls{/number}', + pushed_at: '2014-05-20T19:51:38Z', + teams_url: 'https://api.github.com/repos/mralexgray/app/teams', + trees_url: 'https://api.github.com/repos/mralexgray/app/git/trees{/sha}', + created_at: '2014-05-21T15:54:20Z', + events_url: 'https://api.github.com/repos/mralexgray/app/events', + has_issues: false, + issues_url: 'https://api.github.com/repos/mralexgray/app/issues{/number}', + labels_url: 'https://api.github.com/repos/mralexgray/app/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/app/merges', + mirror_url: null, + updated_at: '2014-05-21T15:54:22Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/app/{archive_format}{/ref}', + commits_url: 'https://api.github.com/repos/mralexgray/app/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/app/compare/{base}...{head}', + description: 'Instant mobile web app creation', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: 'https://api.github.com/repos/mralexgray/app/branches{/branch}', + comments_url: 'https://api.github.com/repos/mralexgray/app/comments{/number}', + contents_url: 'https://api.github.com/repos/mralexgray/app/contents/{+path}', + git_refs_url: 'https://api.github.com/repos/mralexgray/app/git/refs{/sha}', + git_tags_url: 'https://api.github.com/repos/mralexgray/app/git/tags{/sha}', + has_projects: true, + releases_url: 'https://api.github.com/repos/mralexgray/app/releases{/id}', + statuses_url: 'https://api.github.com/repos/mralexgray/app/statuses/{sha}', + allow_forking: true, + assignees_url: 'https://api.github.com/repos/mralexgray/app/assignees{/user}', + downloads_url: 'https://api.github.com/repos/mralexgray/app/downloads', + has_downloads: true, + languages_url: 'https://api.github.com/repos/mralexgray/app/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/app/milestones{/number}', + stargazers_url: 'https://api.github.com/repos/mralexgray/app/stargazers', + watchers_count: 0, + deployments_url: 'https://api.github.com/repos/mralexgray/app/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/app/git/commits{/sha}', + subscribers_url: 'https://api.github.com/repos/mralexgray/app/subscribers', + contributors_url: 'https://api.github.com/repos/mralexgray/app/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/app/issues/events{/number}', + stargazers_count: 0, + subscription_url: 'https://api.github.com/repos/mralexgray/app/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/app/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/app/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/app/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + ], + name: 'Shirt', + revenue: 4.99, + }, + 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', + }, + metadata: { + userId: 'anon-id-new<<>>identified user id', + jobId: 32, + sourceId: '2DTlLPQxignYp4ag9sISgGN2uY7', + destinationId: '2DTozIMGtBwTGNJtuvdPByFSL2Z', + attemptNum: 0, + receivedAt: '2022-08-18T08:43:13.521+05:30', + createdAt: '2022-08-18T03:13:15.549Z', + firstAttemptedAt: '', + transformAt: 'router', + workspaceId: '2DTlBMipxWfJZzZ1SsjELQWvkwd', + secret: null, + jobsT: { + UUID: 'dc239cd1-bef4-4999-88e1-7332c64bf78c', + JobID: 32, + UserID: 'anon-id-new<<>>identified user id', + CreatedAt: '2022-08-18T03:13:15.549078Z', + ExpireAt: '2022-08-18T03:13:15.549078Z', + CustomVal: 'LAMBDA', + EventCount: 1, + EventPayload: { + type: 'track', + event: 'Product Purchased new', + 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: '9f8fb785-c720-4381-a009-bf22a13f4ced', + timestamp: '2020-02-02T00:23:09.544Z', + properties: { + data: [ + { + id: 6104546, + url: 'https://api.github.com/repos/mralexgray/-REPONAME', + fork: false, + name: '-REPONAME', + size: 48, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/-REPONAME.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnk2MTA0NTQ2', + private: false, + ssh_url: 'git@github.com:mralexgray/-REPONAME.git', + svn_url: 'https://github.com/mralexgray/-REPONAME', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/-REPONAME', + keys_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/keys{/key_id}', + language: null, + tags_url: 'https://api.github.com/repos/mralexgray/-REPONAME/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/-REPONAME.git', + forks_url: 'https://api.github.com/repos/mralexgray/-REPONAME/forks', + full_name: 'mralexgray/-REPONAME', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/-REPONAME/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/pulls{/number}', + pushed_at: '2012-10-06T16:37:39Z', + teams_url: 'https://api.github.com/repos/mralexgray/-REPONAME/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/git/trees{/sha}', + created_at: '2012-10-06T16:37:39Z', + events_url: 'https://api.github.com/repos/mralexgray/-REPONAME/events', + has_issues: true, + issues_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/-REPONAME/merges', + mirror_url: null, + updated_at: '2013-01-12T13:39:30Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/compare/{base}...{head}', + description: null, + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 104510411, + url: 'https://api.github.com/repos/mralexgray/...', + fork: true, + name: '...', + size: 113, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/....git', + license: { + key: 'mit', + url: 'https://api.github.com/licenses/mit', + name: 'MIT License', + node_id: 'MDc6TGljZW5zZTEz', + spdx_id: 'MIT', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkxMDQ1MTA0MTE=', + private: false, + ssh_url: 'git@github.com:mralexgray/....git', + svn_url: 'https://github.com/mralexgray/...', + archived: false, + disabled: false, + has_wiki: false, + homepage: 'https://driesvints.com/blog/getting-started-with-dotfiles', + html_url: 'https://github.com/mralexgray/...', + keys_url: 'https://api.github.com/repos/mralexgray/.../keys{/key_id}', + language: 'Shell', + tags_url: 'https://api.github.com/repos/mralexgray/.../tags', + watchers: 0, + blobs_url: 'https://api.github.com/repos/mralexgray/.../git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/....git', + forks_url: 'https://api.github.com/repos/mralexgray/.../forks', + full_name: 'mralexgray/...', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/.../hooks', + pulls_url: 'https://api.github.com/repos/mralexgray/.../pulls{/number}', + pushed_at: '2017-09-15T08:27:32Z', + teams_url: 'https://api.github.com/repos/mralexgray/.../teams', + trees_url: 'https://api.github.com/repos/mralexgray/.../git/trees{/sha}', + created_at: '2017-09-22T19:19:42Z', + events_url: 'https://api.github.com/repos/mralexgray/.../events', + has_issues: false, + issues_url: 'https://api.github.com/repos/mralexgray/.../issues{/number}', + labels_url: 'https://api.github.com/repos/mralexgray/.../labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/.../merges', + mirror_url: null, + updated_at: '2017-09-22T19:20:22Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/.../{archive_format}{/ref}', + commits_url: 'https://api.github.com/repos/mralexgray/.../commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/.../compare/{base}...{head}', + description: ':computer: Public repo for my personal dotfiles.', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/.../branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/.../comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/.../contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/.../git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/.../git/tags{/sha}', + has_projects: true, + releases_url: 'https://api.github.com/repos/mralexgray/.../releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/.../statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/.../assignees{/user}', + downloads_url: 'https://api.github.com/repos/mralexgray/.../downloads', + has_downloads: true, + languages_url: 'https://api.github.com/repos/mralexgray/.../languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/.../milestones{/number}', + stargazers_url: 'https://api.github.com/repos/mralexgray/.../stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/.../deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/.../git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/.../subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/.../contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/.../issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/.../subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/.../collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/.../issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/.../notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 58656723, + url: 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol', + fork: true, + name: '2200087-Serial-Protocol', + size: 41, + forks: 1, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/2200087-Serial-Protocol.git', + license: { + key: 'gpl-2.0', + url: 'https://api.github.com/licenses/gpl-2.0', + name: 'GNU General Public License v2.0', + node_id: 'MDc6TGljZW5zZTg=', + spdx_id: 'GPL-2.0', + }, + node_id: 'MDEwOlJlcG9zaXRvcnk1ODY1NjcyMw==', + private: false, + ssh_url: 'git@github.com:mralexgray/2200087-Serial-Protocol.git', + svn_url: 'https://github.com/mralexgray/2200087-Serial-Protocol', + archived: false, + disabled: false, + has_wiki: true, + homepage: 'http://daviddworken.com', + html_url: 'https://github.com/mralexgray/2200087-Serial-Protocol', + keys_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/keys{/key_id}', + language: 'Python', + tags_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/2200087-Serial-Protocol.git', + forks_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/forks', + full_name: 'mralexgray/2200087-Serial-Protocol', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/pulls{/number}', + pushed_at: '2016-05-12T16:07:24Z', + teams_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/git/trees{/sha}', + created_at: '2016-05-12T16:05:28Z', + events_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/merges', + mirror_url: null, + updated_at: '2016-05-12T16:05:30Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/compare/{base}...{head}', + description: + "A reverse engineered protocol description and accompanying code for Radioshack's 2200087 multimeter", + forks_count: 1, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 13121042, + url: 'https://api.github.com/repos/mralexgray/ace', + fork: true, + name: 'ace', + size: 21080, + forks: 1, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/ace.git', + license: { + key: 'other', + url: null, + name: 'Other', + node_id: 'MDc6TGljZW5zZTA=', + spdx_id: 'NOASSERTION', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkxMzEyMTA0Mg==', + private: false, + ssh_url: 'git@github.com:mralexgray/ace.git', + svn_url: 'https://github.com/mralexgray/ace', + archived: false, + disabled: false, + has_wiki: true, + homepage: 'http://ace.c9.io', + html_url: 'https://github.com/mralexgray/ace', + keys_url: 'https://api.github.com/repos/mralexgray/ace/keys{/key_id}', + language: 'JavaScript', + tags_url: 'https://api.github.com/repos/mralexgray/ace/tags', + watchers: 0, + blobs_url: 'https://api.github.com/repos/mralexgray/ace/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/ace.git', + forks_url: 'https://api.github.com/repos/mralexgray/ace/forks', + full_name: 'mralexgray/ace', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/ace/hooks', + pulls_url: 'https://api.github.com/repos/mralexgray/ace/pulls{/number}', + pushed_at: '2013-10-26T12:34:48Z', + teams_url: 'https://api.github.com/repos/mralexgray/ace/teams', + trees_url: 'https://api.github.com/repos/mralexgray/ace/git/trees{/sha}', + created_at: '2013-09-26T11:58:10Z', + events_url: 'https://api.github.com/repos/mralexgray/ace/events', + has_issues: false, + issues_url: 'https://api.github.com/repos/mralexgray/ace/issues{/number}', + labels_url: 'https://api.github.com/repos/mralexgray/ace/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/ace/merges', + mirror_url: null, + updated_at: '2013-10-26T12:34:49Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/ace/{archive_format}{/ref}', + commits_url: 'https://api.github.com/repos/mralexgray/ace/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/ace/compare/{base}...{head}', + description: 'Ace (Ajax.org Cloud9 Editor)', + forks_count: 1, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/ace/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/ace/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/ace/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/ace/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/ace/git/tags{/sha}', + has_projects: true, + releases_url: 'https://api.github.com/repos/mralexgray/ace/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/ace/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/ace/assignees{/user}', + downloads_url: 'https://api.github.com/repos/mralexgray/ace/downloads', + has_downloads: true, + languages_url: 'https://api.github.com/repos/mralexgray/ace/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/ace/milestones{/number}', + stargazers_url: 'https://api.github.com/repos/mralexgray/ace/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/ace/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/ace/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/ace/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/ace/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/ace/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/ace/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/ace/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/ace/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/ace/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 10791045, + url: 'https://api.github.com/repos/mralexgray/ACEView', + fork: true, + name: 'ACEView', + size: 1733, + forks: 1, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/ACEView.git', + license: { + key: 'other', + url: null, + name: 'Other', + node_id: 'MDc6TGljZW5zZTA=', + spdx_id: 'NOASSERTION', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkxMDc5MTA0NQ==', + private: false, + ssh_url: 'git@github.com:mralexgray/ACEView.git', + svn_url: 'https://github.com/mralexgray/ACEView', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/ACEView', + keys_url: 'https://api.github.com/repos/mralexgray/ACEView/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/ACEView/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/ACEView/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/ACEView.git', + forks_url: 'https://api.github.com/repos/mralexgray/ACEView/forks', + full_name: 'mralexgray/ACEView', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/ACEView/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/ACEView/pulls{/number}', + pushed_at: '2014-05-09T01:36:23Z', + teams_url: 'https://api.github.com/repos/mralexgray/ACEView/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/ACEView/git/trees{/sha}', + created_at: '2013-06-19T12:15:04Z', + events_url: 'https://api.github.com/repos/mralexgray/ACEView/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/ACEView/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/ACEView/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/ACEView/merges', + mirror_url: null, + updated_at: '2015-11-24T01:14:10Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/ACEView/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/ACEView/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/ACEView/compare/{base}...{head}', + description: 'Use the wonderful ACE editor in your Cocoa applications', + forks_count: 1, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/ACEView/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/ACEView/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/ACEView/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/ACEView/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/ACEView/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/ACEView/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/ACEView/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/ACEView/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/ACEView/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/ACEView/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/ACEView/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/ACEView/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/ACEView/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/ACEView/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/ACEView/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/ACEView/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/ACEView/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/ACEView/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/ACEView/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/ACEView/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/ACEView/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 13623648, + url: 'https://api.github.com/repos/mralexgray/ActiveLog', + fork: true, + name: 'ActiveLog', + size: 60, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/ActiveLog.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnkxMzYyMzY0OA==', + private: false, + ssh_url: 'git@github.com:mralexgray/ActiveLog.git', + svn_url: 'https://github.com/mralexgray/ActiveLog', + archived: false, + disabled: false, + has_wiki: true, + homepage: 'http://deepitpro.com/en/articles/ActiveLog/info/', + html_url: 'https://github.com/mralexgray/ActiveLog', + keys_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/ActiveLog/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/ActiveLog.git', + forks_url: 'https://api.github.com/repos/mralexgray/ActiveLog/forks', + full_name: 'mralexgray/ActiveLog', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/ActiveLog/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/pulls{/number}', + pushed_at: '2011-07-03T06:28:59Z', + teams_url: 'https://api.github.com/repos/mralexgray/ActiveLog/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/git/trees{/sha}', + created_at: '2013-10-16T15:52:37Z', + events_url: 'https://api.github.com/repos/mralexgray/ActiveLog/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/ActiveLog/merges', + mirror_url: null, + updated_at: '2013-10-16T15:52:37Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/compare/{base}...{head}', + description: 'Shut up all logs with active filter.', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 9716210, + url: 'https://api.github.com/repos/mralexgray/adium', + fork: false, + name: 'adium', + size: 277719, + forks: 37, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/adium.git', + license: { + key: 'other', + url: null, + name: 'Other', + node_id: 'MDc6TGljZW5zZTA=', + spdx_id: 'NOASSERTION', + }, + node_id: 'MDEwOlJlcG9zaXRvcnk5NzE2MjEw', + private: false, + ssh_url: 'git@github.com:mralexgray/adium.git', + svn_url: 'https://github.com/mralexgray/adium', + archived: false, + disabled: false, + has_wiki: false, + homepage: null, + html_url: 'https://github.com/mralexgray/adium', + keys_url: 'https://api.github.com/repos/mralexgray/adium/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/adium/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/adium/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/adium.git', + forks_url: 'https://api.github.com/repos/mralexgray/adium/forks', + full_name: 'mralexgray/adium', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/adium/hooks', + pulls_url: 'https://api.github.com/repos/mralexgray/adium/pulls{/number}', + pushed_at: '2013-04-26T16:43:53Z', + teams_url: 'https://api.github.com/repos/mralexgray/adium/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/adium/git/trees{/sha}', + created_at: '2013-04-27T14:59:33Z', + events_url: 'https://api.github.com/repos/mralexgray/adium/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/adium/issues{/number}', + labels_url: 'https://api.github.com/repos/mralexgray/adium/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/adium/merges', + mirror_url: null, + updated_at: '2019-12-11T06:51:45Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/adium/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/adium/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/adium/compare/{base}...{head}', + description: 'Official mirror of hg.adium.im', + forks_count: 37, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/adium/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/adium/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/adium/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/adium/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/adium/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/adium/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/adium/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/adium/assignees{/user}', + downloads_url: 'https://api.github.com/repos/mralexgray/adium/downloads', + has_downloads: true, + languages_url: 'https://api.github.com/repos/mralexgray/adium/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/adium/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/adium/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/adium/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/adium/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/adium/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/adium/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/adium/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/adium/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/adium/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/adium/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/adium/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 12752329, + url: 'https://api.github.com/repos/mralexgray/ADLivelyTableView', + fork: true, + name: 'ADLivelyTableView', + size: 73, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/ADLivelyTableView.git', + license: { + key: 'other', + url: null, + name: 'Other', + node_id: 'MDc6TGljZW5zZTA=', + spdx_id: 'NOASSERTION', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkxMjc1MjMyOQ==', + private: false, + ssh_url: 'git@github.com:mralexgray/ADLivelyTableView.git', + svn_url: 'https://github.com/mralexgray/ADLivelyTableView', + archived: false, + disabled: false, + has_wiki: true, + homepage: 'http://applidium.com/en/news/lively_uitableview/', + html_url: 'https://github.com/mralexgray/ADLivelyTableView', + keys_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/keys{/key_id}', + language: 'Objective-C', + tags_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/ADLivelyTableView.git', + forks_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/forks', + full_name: 'mralexgray/ADLivelyTableView', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/pulls{/number}', + pushed_at: '2012-05-10T10:40:15Z', + teams_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/git/trees{/sha}', + created_at: '2013-09-11T09:18:01Z', + events_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/merges', + mirror_url: null, + updated_at: '2013-09-11T09:18:03Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/compare/{base}...{head}', + description: 'Lively UITableView', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 5697379, + url: 'https://api.github.com/repos/mralexgray/AFIncrementalStore', + fork: true, + name: 'AFIncrementalStore', + size: 139, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/AFIncrementalStore.git', + license: { + key: 'mit', + url: 'https://api.github.com/licenses/mit', + name: 'MIT License', + node_id: 'MDc6TGljZW5zZTEz', + spdx_id: 'MIT', + }, + node_id: 'MDEwOlJlcG9zaXRvcnk1Njk3Mzc5', + private: false, + ssh_url: 'git@github.com:mralexgray/AFIncrementalStore.git', + svn_url: 'https://github.com/mralexgray/AFIncrementalStore', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/AFIncrementalStore', + keys_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/keys{/key_id}', + language: 'Objective-C', + tags_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/AFIncrementalStore.git', + forks_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/forks', + full_name: 'mralexgray/AFIncrementalStore', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/pulls{/number}', + pushed_at: '2012-09-01T22:46:25Z', + teams_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/git/trees{/sha}', + created_at: '2012-09-06T04:20:33Z', + events_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/merges', + mirror_url: null, + updated_at: '2013-01-12T03:15:29Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/compare/{base}...{head}', + description: 'Core Data Persistence with AFNetworking, Done Right', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 6969621, + url: 'https://api.github.com/repos/mralexgray/AFNetworking', + fork: true, + name: 'AFNetworking', + size: 4341, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/AFNetworking.git', + license: { + key: 'mit', + url: 'https://api.github.com/licenses/mit', + name: 'MIT License', + node_id: 'MDc6TGljZW5zZTEz', + spdx_id: 'MIT', + }, + node_id: 'MDEwOlJlcG9zaXRvcnk2OTY5NjIx', + private: false, + ssh_url: 'git@github.com:mralexgray/AFNetworking.git', + svn_url: 'https://github.com/mralexgray/AFNetworking', + archived: false, + disabled: false, + has_wiki: true, + homepage: 'http://afnetworking.com', + html_url: 'https://github.com/mralexgray/AFNetworking', + keys_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/AFNetworking/tags', + watchers: 2, + blobs_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/AFNetworking.git', + forks_url: 'https://api.github.com/repos/mralexgray/AFNetworking/forks', + full_name: 'mralexgray/AFNetworking', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/AFNetworking/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/pulls{/number}', + pushed_at: '2014-01-24T07:14:32Z', + teams_url: 'https://api.github.com/repos/mralexgray/AFNetworking/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/git/trees{/sha}', + created_at: '2012-12-02T17:00:04Z', + events_url: 'https://api.github.com/repos/mralexgray/AFNetworking/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/AFNetworking/merges', + mirror_url: null, + updated_at: '2014-01-24T07:14:33Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/compare/{base}...{head}', + description: 'A delightful iOS and OS X networking framework', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/stargazers', + watchers_count: 2, + deployments_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/issues/events{/number}', + stargazers_count: 2, + subscription_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 9485541, + url: 'https://api.github.com/repos/mralexgray/AGNSSplitView', + fork: true, + name: 'AGNSSplitView', + size: 68, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/AGNSSplitView.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnk5NDg1NTQx', + private: false, + ssh_url: 'git@github.com:mralexgray/AGNSSplitView.git', + svn_url: 'https://github.com/mralexgray/AGNSSplitView', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/AGNSSplitView', + keys_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/AGNSSplitView/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/AGNSSplitView.git', + forks_url: 'https://api.github.com/repos/mralexgray/AGNSSplitView/forks', + full_name: 'mralexgray/AGNSSplitView', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/AGNSSplitView/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/pulls{/number}', + pushed_at: '2013-02-26T00:32:32Z', + teams_url: 'https://api.github.com/repos/mralexgray/AGNSSplitView/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/git/trees{/sha}', + created_at: '2013-04-17T00:10:13Z', + events_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/merges', + mirror_url: null, + updated_at: '2013-04-17T00:10:13Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/compare/{base}...{head}', + description: 'Simple NSSplitView additions.', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 12767784, + url: 'https://api.github.com/repos/mralexgray/AGScopeBar', + fork: true, + name: 'AGScopeBar', + size: 64, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/AGScopeBar.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnkxMjc2Nzc4NA==', + private: false, + ssh_url: 'git@github.com:mralexgray/AGScopeBar.git', + svn_url: 'https://github.com/mralexgray/AGScopeBar', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/AGScopeBar', + keys_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/AGScopeBar/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/AGScopeBar.git', + forks_url: 'https://api.github.com/repos/mralexgray/AGScopeBar/forks', + full_name: 'mralexgray/AGScopeBar', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/AGScopeBar/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/pulls{/number}', + pushed_at: '2013-05-07T03:35:29Z', + teams_url: 'https://api.github.com/repos/mralexgray/AGScopeBar/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/git/trees{/sha}', + created_at: '2013-09-11T21:06:54Z', + events_url: 'https://api.github.com/repos/mralexgray/AGScopeBar/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/AGScopeBar/merges', + mirror_url: null, + updated_at: '2013-09-11T21:06:54Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/compare/{base}...{head}', + description: 'Custom scope bar implementation for Cocoa', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 31829499, + url: 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin', + fork: true, + name: 'agvtool-xcode-plugin', + size: 102, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/agvtool-xcode-plugin.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnkzMTgyOTQ5OQ==', + private: false, + ssh_url: 'git@github.com:mralexgray/agvtool-xcode-plugin.git', + svn_url: 'https://github.com/mralexgray/agvtool-xcode-plugin', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/agvtool-xcode-plugin', + keys_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/keys{/key_id}', + language: 'Objective-C', + tags_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/agvtool-xcode-plugin.git', + forks_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/forks', + full_name: 'mralexgray/agvtool-xcode-plugin', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/pulls{/number}', + pushed_at: '2015-03-08T00:04:31Z', + teams_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/git/trees{/sha}', + created_at: '2015-03-07T22:15:38Z', + events_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/merges', + mirror_url: null, + updated_at: '2015-03-07T22:15:41Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/compare/{base}...{head}', + description: 'this is a plugin wrapper for agvtool for xcode.', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 9227846, + url: 'https://api.github.com/repos/mralexgray/AHContentBrowser', + fork: true, + name: 'AHContentBrowser', + size: 223, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/AHContentBrowser.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnk5MjI3ODQ2', + private: false, + ssh_url: 'git@github.com:mralexgray/AHContentBrowser.git', + svn_url: 'https://github.com/mralexgray/AHContentBrowser', + archived: false, + disabled: false, + has_wiki: true, + homepage: '', + html_url: 'https://github.com/mralexgray/AHContentBrowser', + keys_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/AHContentBrowser/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/AHContentBrowser.git', + forks_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/forks', + full_name: 'mralexgray/AHContentBrowser', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/pulls{/number}', + pushed_at: '2013-03-13T17:38:23Z', + teams_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/git/trees{/sha}', + created_at: '2013-04-04T20:56:16Z', + events_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/merges', + mirror_url: null, + updated_at: '2015-10-22T05:00:24Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/compare/{base}...{head}', + description: + 'A Mac only webview that loads a fast readable version of the website if available.', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 37430328, + url: 'https://api.github.com/repos/mralexgray/AHLaunchCtl', + fork: true, + name: 'AHLaunchCtl', + size: 592, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/AHLaunchCtl.git', + license: { + key: 'mit', + url: 'https://api.github.com/licenses/mit', + name: 'MIT License', + node_id: 'MDc6TGljZW5zZTEz', + spdx_id: 'MIT', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkzNzQzMDMyOA==', + private: false, + ssh_url: 'git@github.com:mralexgray/AHLaunchCtl.git', + svn_url: 'https://github.com/mralexgray/AHLaunchCtl', + archived: false, + disabled: false, + has_wiki: true, + homepage: '', + html_url: 'https://github.com/mralexgray/AHLaunchCtl', + keys_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/AHLaunchCtl/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/AHLaunchCtl.git', + forks_url: 'https://api.github.com/repos/mralexgray/AHLaunchCtl/forks', + full_name: 'mralexgray/AHLaunchCtl', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/AHLaunchCtl/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/pulls{/number}', + pushed_at: '2015-05-26T18:50:48Z', + teams_url: 'https://api.github.com/repos/mralexgray/AHLaunchCtl/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/git/trees{/sha}', + created_at: '2015-06-14T21:31:03Z', + events_url: 'https://api.github.com/repos/mralexgray/AHLaunchCtl/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/AHLaunchCtl/merges', + mirror_url: null, + updated_at: '2015-06-14T21:31:04Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/compare/{base}...{head}', + description: 'LaunchD Framework for Cocoa Apps', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 9167473, + url: 'https://api.github.com/repos/mralexgray/AHLayout', + fork: true, + name: 'AHLayout', + size: 359, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/AHLayout.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnk5MTY3NDcz', + private: false, + ssh_url: 'git@github.com:mralexgray/AHLayout.git', + svn_url: 'https://github.com/mralexgray/AHLayout', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/AHLayout', + keys_url: + 'https://api.github.com/repos/mralexgray/AHLayout/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/AHLayout/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/AHLayout/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/AHLayout.git', + forks_url: 'https://api.github.com/repos/mralexgray/AHLayout/forks', + full_name: 'mralexgray/AHLayout', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/AHLayout/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/AHLayout/pulls{/number}', + pushed_at: '2013-07-08T02:31:14Z', + teams_url: 'https://api.github.com/repos/mralexgray/AHLayout/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/AHLayout/git/trees{/sha}', + created_at: '2013-04-02T10:10:30Z', + events_url: 'https://api.github.com/repos/mralexgray/AHLayout/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/AHLayout/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/AHLayout/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/AHLayout/merges', + mirror_url: null, + updated_at: '2013-07-08T02:31:17Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/AHLayout/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/AHLayout/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/AHLayout/compare/{base}...{head}', + description: 'AHLayout', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/AHLayout/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/AHLayout/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/AHLayout/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/AHLayout/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/AHLayout/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/AHLayout/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/AHLayout/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/AHLayout/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/AHLayout/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/AHLayout/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/AHLayout/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/AHLayout/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/AHLayout/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/AHLayout/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/AHLayout/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/AHLayout/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/AHLayout/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/AHLayout/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/AHLayout/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/AHLayout/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/AHLayout/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 18450201, + url: 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework', + fork: true, + name: 'Airmail-Plug-In-Framework', + size: 888, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/Airmail-Plug-In-Framework.git', + license: { + key: 'gpl-2.0', + url: 'https://api.github.com/licenses/gpl-2.0', + name: 'GNU General Public License v2.0', + node_id: 'MDc6TGljZW5zZTg=', + spdx_id: 'GPL-2.0', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkxODQ1MDIwMQ==', + private: false, + ssh_url: 'git@github.com:mralexgray/Airmail-Plug-In-Framework.git', + svn_url: 'https://github.com/mralexgray/Airmail-Plug-In-Framework', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/Airmail-Plug-In-Framework', + keys_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/keys{/key_id}', + language: null, + tags_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/Airmail-Plug-In-Framework.git', + forks_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/forks', + full_name: 'mralexgray/Airmail-Plug-In-Framework', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/pulls{/number}', + pushed_at: '2014-03-27T15:42:19Z', + teams_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/git/trees{/sha}', + created_at: '2014-04-04T19:33:54Z', + events_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/merges', + mirror_url: null, + updated_at: '2014-11-23T19:31:04Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/compare/{base}...{head}', + description: null, + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 5203219, + url: 'https://api.github.com/repos/mralexgray/AJS-iTunes-API', + fork: true, + name: 'AJS-iTunes-API', + size: 103, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/AJS-iTunes-API.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnk1MjAzMjE5', + private: false, + ssh_url: 'git@github.com:mralexgray/AJS-iTunes-API.git', + svn_url: 'https://github.com/mralexgray/AJS-iTunes-API', + archived: false, + disabled: false, + has_wiki: true, + homepage: '', + html_url: 'https://github.com/mralexgray/AJS-iTunes-API', + keys_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/tags', + watchers: 2, + blobs_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/AJS-iTunes-API.git', + forks_url: 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/forks', + full_name: 'mralexgray/AJS-iTunes-API', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/pulls{/number}', + pushed_at: '2011-10-30T22:26:48Z', + teams_url: 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/git/trees{/sha}', + created_at: '2012-07-27T10:20:58Z', + events_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/merges', + mirror_url: null, + updated_at: '2013-01-11T11:00:05Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/compare/{base}...{head}', + description: + 'Cocoa wrapper for the iTunes search API - for iOS and Mac OSX projects', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/stargazers', + watchers_count: 2, + deployments_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/issues/events{/number}', + stargazers_count: 2, + subscription_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 10093801, + url: 'https://api.github.com/repos/mralexgray/Alcatraz', + fork: true, + name: 'Alcatraz', + size: 3668, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/Alcatraz.git', + license: { + key: 'mit', + url: 'https://api.github.com/licenses/mit', + name: 'MIT License', + node_id: 'MDc6TGljZW5zZTEz', + spdx_id: 'MIT', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkxMDA5MzgwMQ==', + private: false, + ssh_url: 'git@github.com:mralexgray/Alcatraz.git', + svn_url: 'https://github.com/mralexgray/Alcatraz', + archived: false, + disabled: false, + has_wiki: false, + homepage: 'mneorr.github.com/Alcatraz', + html_url: 'https://github.com/mralexgray/Alcatraz', + keys_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/Alcatraz/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/Alcatraz.git', + forks_url: 'https://api.github.com/repos/mralexgray/Alcatraz/forks', + full_name: 'mralexgray/Alcatraz', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/Alcatraz/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/pulls{/number}', + pushed_at: '2014-03-19T12:50:37Z', + teams_url: 'https://api.github.com/repos/mralexgray/Alcatraz/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/git/trees{/sha}', + created_at: '2013-05-16T04:41:13Z', + events_url: 'https://api.github.com/repos/mralexgray/Alcatraz/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/Alcatraz/merges', + mirror_url: null, + updated_at: '2014-03-19T20:38:35Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/compare/{base}...{head}', + description: 'The most awesome (and only) Xcode package manager!', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 12916552, + url: 'https://api.github.com/repos/mralexgray/alcatraz-packages', + fork: true, + name: 'alcatraz-packages', + size: 826, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/alcatraz-packages.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnkxMjkxNjU1Mg==', + private: false, + ssh_url: 'git@github.com:mralexgray/alcatraz-packages.git', + svn_url: 'https://github.com/mralexgray/alcatraz-packages', + archived: false, + disabled: false, + has_wiki: true, + homepage: 'mneorr.github.com/Alcatraz', + html_url: 'https://github.com/mralexgray/alcatraz-packages', + keys_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/keys{/key_id}', + language: 'Ruby', + tags_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/alcatraz-packages.git', + forks_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/forks', + full_name: 'mralexgray/alcatraz-packages', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/pulls{/number}', + pushed_at: '2015-12-14T16:21:31Z', + teams_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/git/trees{/sha}', + created_at: '2013-09-18T07:15:24Z', + events_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/merges', + mirror_url: null, + updated_at: '2015-11-10T20:52:30Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/compare/{base}...{head}', + description: 'Package list repository for Alcatraz', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 44278362, + url: 'https://api.github.com/repos/mralexgray/alexicons', + fork: true, + name: 'alexicons', + size: 257, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/alexicons.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnk0NDI3ODM2Mg==', + private: false, + ssh_url: 'git@github.com:mralexgray/alexicons.git', + svn_url: 'https://github.com/mralexgray/alexicons', + archived: false, + disabled: false, + has_wiki: false, + homepage: null, + html_url: 'https://github.com/mralexgray/alexicons', + keys_url: + 'https://api.github.com/repos/mralexgray/alexicons/keys{/key_id}', + language: 'CoffeeScript', + tags_url: 'https://api.github.com/repos/mralexgray/alexicons/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/alexicons/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/alexicons.git', + forks_url: 'https://api.github.com/repos/mralexgray/alexicons/forks', + full_name: 'mralexgray/alexicons', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/alexicons/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/alexicons/pulls{/number}', + pushed_at: '2015-10-16T03:57:51Z', + teams_url: 'https://api.github.com/repos/mralexgray/alexicons/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/alexicons/git/trees{/sha}', + created_at: '2015-10-14T21:49:39Z', + events_url: 'https://api.github.com/repos/mralexgray/alexicons/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/alexicons/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/alexicons/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/alexicons/merges', + mirror_url: null, + updated_at: '2015-10-15T06:20:08Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/alexicons/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/alexicons/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/alexicons/compare/{base}...{head}', + description: 'Get popular cat names', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/alexicons/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/alexicons/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/alexicons/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/alexicons/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/alexicons/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/alexicons/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/alexicons/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/alexicons/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/alexicons/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/alexicons/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/alexicons/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/alexicons/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/alexicons/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/alexicons/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/alexicons/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/alexicons/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/alexicons/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/alexicons/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/alexicons/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/alexicons/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/alexicons/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 10476467, + url: 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate', + fork: true, + name: 'Alfred-Google-Translate', + size: 103, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/Alfred-Google-Translate.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnkxMDQ3NjQ2Nw==', + private: false, + ssh_url: 'git@github.com:mralexgray/Alfred-Google-Translate.git', + svn_url: 'https://github.com/mralexgray/Alfred-Google-Translate', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/Alfred-Google-Translate', + keys_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/keys{/key_id}', + language: 'Shell', + tags_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/Alfred-Google-Translate.git', + forks_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/forks', + full_name: 'mralexgray/Alfred-Google-Translate', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/pulls{/number}', + pushed_at: '2013-01-12T19:39:03Z', + teams_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/git/trees{/sha}', + created_at: '2013-06-04T10:45:10Z', + events_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/merges', + mirror_url: null, + updated_at: '2013-06-04T10:45:10Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/compare/{base}...{head}', + description: + 'Extension for Alfred that will do a Google translate for you', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 5524019, + url: 'https://api.github.com/repos/mralexgray/Amber', + fork: false, + name: 'Amber', + size: 48, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/Amber.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnk1NTI0MDE5', + private: false, + ssh_url: 'git@github.com:mralexgray/Amber.git', + svn_url: 'https://github.com/mralexgray/Amber', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/Amber', + keys_url: 'https://api.github.com/repos/mralexgray/Amber/keys{/key_id}', + language: null, + tags_url: 'https://api.github.com/repos/mralexgray/Amber/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/Amber/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/Amber.git', + forks_url: 'https://api.github.com/repos/mralexgray/Amber/forks', + full_name: 'mralexgray/Amber', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/Amber/hooks', + pulls_url: 'https://api.github.com/repos/mralexgray/Amber/pulls{/number}', + pushed_at: '2012-08-23T10:38:25Z', + teams_url: 'https://api.github.com/repos/mralexgray/Amber/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/Amber/git/trees{/sha}', + created_at: '2012-08-23T10:38:24Z', + events_url: 'https://api.github.com/repos/mralexgray/Amber/events', + has_issues: true, + issues_url: + 'https://api.github.com/repos/mralexgray/Amber/issues{/number}', + labels_url: 'https://api.github.com/repos/mralexgray/Amber/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/Amber/merges', + mirror_url: null, + updated_at: '2013-01-11T22:25:35Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/Amber/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/Amber/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/Amber/compare/{base}...{head}', + description: 'Fork of the difficult-to-deal-with Amber.framework', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/Amber/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/Amber/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/Amber/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/Amber/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/Amber/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/Amber/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/Amber/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/Amber/assignees{/user}', + downloads_url: 'https://api.github.com/repos/mralexgray/Amber/downloads', + has_downloads: true, + languages_url: 'https://api.github.com/repos/mralexgray/Amber/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/Amber/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/Amber/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/Amber/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/Amber/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/Amber/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/Amber/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/Amber/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/Amber/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/Amber/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/Amber/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/Amber/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 10809060, + url: 'https://api.github.com/repos/mralexgray/Amethyst', + fork: true, + name: 'Amethyst', + size: 12623, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/Amethyst.git', + license: { + key: 'mit', + url: 'https://api.github.com/licenses/mit', + name: 'MIT License', + node_id: 'MDc6TGljZW5zZTEz', + spdx_id: 'MIT', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkxMDgwOTA2MA==', + private: false, + ssh_url: 'git@github.com:mralexgray/Amethyst.git', + svn_url: 'https://github.com/mralexgray/Amethyst', + archived: false, + disabled: false, + has_wiki: true, + homepage: 'http://ianyh.github.io/Amethyst/', + html_url: 'https://github.com/mralexgray/Amethyst', + keys_url: + 'https://api.github.com/repos/mralexgray/Amethyst/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/Amethyst/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/Amethyst/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/Amethyst.git', + forks_url: 'https://api.github.com/repos/mralexgray/Amethyst/forks', + full_name: 'mralexgray/Amethyst', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/Amethyst/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/Amethyst/pulls{/number}', + pushed_at: '2013-06-18T02:54:11Z', + teams_url: 'https://api.github.com/repos/mralexgray/Amethyst/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/Amethyst/git/trees{/sha}', + created_at: '2013-06-20T00:34:22Z', + events_url: 'https://api.github.com/repos/mralexgray/Amethyst/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/Amethyst/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/Amethyst/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/Amethyst/merges', + mirror_url: null, + updated_at: '2013-06-20T00:34:22Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/Amethyst/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/Amethyst/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/Amethyst/compare/{base}...{head}', + description: 'Tiling window manager for OS X.', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/Amethyst/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/Amethyst/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/Amethyst/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/Amethyst/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/Amethyst/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/Amethyst/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/Amethyst/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/Amethyst/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/Amethyst/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/Amethyst/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/Amethyst/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/Amethyst/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/Amethyst/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/Amethyst/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/Amethyst/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/Amethyst/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/Amethyst/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/Amethyst/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/Amethyst/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/Amethyst/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/Amethyst/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 3684286, + url: 'https://api.github.com/repos/mralexgray/Animated-Paths', + fork: true, + name: 'Animated-Paths', + size: 411, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/Animated-Paths.git', + license: { + key: 'other', + url: null, + name: 'Other', + node_id: 'MDc6TGljZW5zZTA=', + spdx_id: 'NOASSERTION', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkzNjg0Mjg2', + private: false, + ssh_url: 'git@github.com:mralexgray/Animated-Paths.git', + svn_url: 'https://github.com/mralexgray/Animated-Paths', + archived: false, + disabled: false, + has_wiki: true, + homepage: + 'http://oleb.net/blog/2010/12/animating-drawing-of-cgpath-with-cashapelayer/', + html_url: 'https://github.com/mralexgray/Animated-Paths', + keys_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/Animated-Paths/tags', + watchers: 2, + blobs_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/Animated-Paths.git', + forks_url: 'https://api.github.com/repos/mralexgray/Animated-Paths/forks', + full_name: 'mralexgray/Animated-Paths', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/Animated-Paths/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/pulls{/number}', + pushed_at: '2010-12-30T20:56:51Z', + teams_url: 'https://api.github.com/repos/mralexgray/Animated-Paths/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/git/trees{/sha}', + created_at: '2012-03-11T02:56:38Z', + events_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/merges', + mirror_url: null, + updated_at: '2013-01-08T04:12:21Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/compare/{base}...{head}', + description: + 'Demo project: Animating the drawing of a CGPath with CAShapeLayer.strokeEnd', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/stargazers', + watchers_count: 2, + deployments_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/issues/events{/number}', + stargazers_count: 2, + subscription_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 16662874, + url: 'https://api.github.com/repos/mralexgray/AnsiLove.framework', + fork: true, + name: 'AnsiLove.framework', + size: 3780, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/AnsiLove.framework.git', + license: { + key: 'other', + url: null, + name: 'Other', + node_id: 'MDc6TGljZW5zZTA=', + spdx_id: 'NOASSERTION', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkxNjY2Mjg3NA==', + private: false, + ssh_url: 'git@github.com:mralexgray/AnsiLove.framework.git', + svn_url: 'https://github.com/mralexgray/AnsiLove.framework', + archived: false, + disabled: false, + has_wiki: false, + homepage: 'http://byteproject.net', + html_url: 'https://github.com/mralexgray/AnsiLove.framework', + keys_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/keys{/key_id}', + language: 'M', + tags_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/AnsiLove.framework.git', + forks_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/forks', + full_name: 'mralexgray/AnsiLove.framework', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/pulls{/number}', + pushed_at: '2013-10-04T14:08:38Z', + teams_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/git/trees{/sha}', + created_at: '2014-02-09T08:30:27Z', + events_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/merges', + mirror_url: null, + updated_at: '2015-01-13T20:41:46Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/compare/{base}...{head}', + description: 'Cocoa Framework for rendering ANSi / ASCII art', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 5189563, + url: 'https://api.github.com/repos/mralexgray/ANTrackBar', + fork: true, + name: 'ANTrackBar', + size: 94, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/ANTrackBar.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnk1MTg5NTYz', + private: false, + ssh_url: 'git@github.com:mralexgray/ANTrackBar.git', + svn_url: 'https://github.com/mralexgray/ANTrackBar', + archived: false, + disabled: false, + has_wiki: true, + homepage: '', + html_url: 'https://github.com/mralexgray/ANTrackBar', + keys_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/ANTrackBar/tags', + watchers: 2, + blobs_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/ANTrackBar.git', + forks_url: 'https://api.github.com/repos/mralexgray/ANTrackBar/forks', + full_name: 'mralexgray/ANTrackBar', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/ANTrackBar/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/pulls{/number}', + pushed_at: '2012-03-09T01:40:02Z', + teams_url: 'https://api.github.com/repos/mralexgray/ANTrackBar/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/git/trees{/sha}', + created_at: '2012-07-26T08:17:22Z', + events_url: 'https://api.github.com/repos/mralexgray/ANTrackBar/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/ANTrackBar/merges', + mirror_url: null, + updated_at: '2013-01-11T10:29:56Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/compare/{base}...{head}', + description: 'An easy-to-use Cocoa seek bar with a pleasing appearance', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/stargazers', + watchers_count: 2, + deployments_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/issues/events{/number}', + stargazers_count: 2, + subscription_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 16240152, + url: 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C', + fork: true, + name: 'AOP-in-Objective-C', + size: 340, + forks: 1, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/AOP-in-Objective-C.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnkxNjI0MDE1Mg==', + private: false, + ssh_url: 'git@github.com:mralexgray/AOP-in-Objective-C.git', + svn_url: 'https://github.com/mralexgray/AOP-in-Objective-C', + archived: false, + disabled: false, + has_wiki: true, + homepage: 'http://innoli.hu/en/opensource/', + html_url: 'https://github.com/mralexgray/AOP-in-Objective-C', + keys_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/keys{/key_id}', + language: 'Objective-C', + tags_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/AOP-in-Objective-C.git', + forks_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/forks', + full_name: 'mralexgray/AOP-in-Objective-C', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/pulls{/number}', + pushed_at: '2014-02-12T16:23:20Z', + teams_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/git/trees{/sha}', + created_at: '2014-01-25T21:18:04Z', + events_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/merges', + mirror_url: null, + updated_at: '2014-06-19T19:38:12Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/compare/{base}...{head}', + description: + 'An NSProxy based library for easily enabling AOP like functionality in Objective-C.', + forks_count: 1, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/languages', + default_branch: 'travis-coveralls', + milestones_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 13141936, + url: 'https://api.github.com/repos/mralexgray/Apaxy', + fork: true, + name: 'Apaxy', + size: 113, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/Apaxy.git', + license: { + key: 'unlicense', + url: 'https://api.github.com/licenses/unlicense', + name: 'The Unlicense', + node_id: 'MDc6TGljZW5zZTE1', + spdx_id: 'Unlicense', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkxMzE0MTkzNg==', + private: false, + ssh_url: 'git@github.com:mralexgray/Apaxy.git', + svn_url: 'https://github.com/mralexgray/Apaxy', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/Apaxy', + keys_url: 'https://api.github.com/repos/mralexgray/Apaxy/keys{/key_id}', + language: 'CSS', + tags_url: 'https://api.github.com/repos/mralexgray/Apaxy/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/Apaxy/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/Apaxy.git', + forks_url: 'https://api.github.com/repos/mralexgray/Apaxy/forks', + full_name: 'mralexgray/Apaxy', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/Apaxy/hooks', + pulls_url: 'https://api.github.com/repos/mralexgray/Apaxy/pulls{/number}', + pushed_at: '2013-08-02T16:01:32Z', + teams_url: 'https://api.github.com/repos/mralexgray/Apaxy/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/Apaxy/git/trees{/sha}', + created_at: '2013-09-27T05:05:35Z', + events_url: 'https://api.github.com/repos/mralexgray/Apaxy/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/Apaxy/issues{/number}', + labels_url: 'https://api.github.com/repos/mralexgray/Apaxy/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/Apaxy/merges', + mirror_url: null, + updated_at: '2018-02-16T21:40:24Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/Apaxy/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/Apaxy/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/Apaxy/compare/{base}...{head}', + description: + 'A simple, customisable theme for your Apache directory listing.', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/Apaxy/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/Apaxy/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/Apaxy/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/Apaxy/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/Apaxy/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/Apaxy/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/Apaxy/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/Apaxy/assignees{/user}', + downloads_url: 'https://api.github.com/repos/mralexgray/Apaxy/downloads', + has_downloads: true, + languages_url: 'https://api.github.com/repos/mralexgray/Apaxy/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/Apaxy/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/Apaxy/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/Apaxy/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/Apaxy/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/Apaxy/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/Apaxy/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/Apaxy/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/Apaxy/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/Apaxy/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/Apaxy/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/Apaxy/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 20027360, + url: 'https://api.github.com/repos/mralexgray/app', + fork: true, + name: 'app', + size: 1890, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/app.git', + license: { + key: 'other', + url: null, + name: 'Other', + node_id: 'MDc6TGljZW5zZTA=', + spdx_id: 'NOASSERTION', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkyMDAyNzM2MA==', + private: false, + ssh_url: 'git@github.com:mralexgray/app.git', + svn_url: 'https://github.com/mralexgray/app', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/app', + keys_url: 'https://api.github.com/repos/mralexgray/app/keys{/key_id}', + language: 'JavaScript', + tags_url: 'https://api.github.com/repos/mralexgray/app/tags', + watchers: 0, + blobs_url: 'https://api.github.com/repos/mralexgray/app/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/app.git', + forks_url: 'https://api.github.com/repos/mralexgray/app/forks', + full_name: 'mralexgray/app', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/app/hooks', + pulls_url: 'https://api.github.com/repos/mralexgray/app/pulls{/number}', + pushed_at: '2014-05-20T19:51:38Z', + teams_url: 'https://api.github.com/repos/mralexgray/app/teams', + trees_url: 'https://api.github.com/repos/mralexgray/app/git/trees{/sha}', + created_at: '2014-05-21T15:54:20Z', + events_url: 'https://api.github.com/repos/mralexgray/app/events', + has_issues: false, + issues_url: 'https://api.github.com/repos/mralexgray/app/issues{/number}', + labels_url: 'https://api.github.com/repos/mralexgray/app/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/app/merges', + mirror_url: null, + updated_at: '2014-05-21T15:54:22Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/app/{archive_format}{/ref}', + commits_url: 'https://api.github.com/repos/mralexgray/app/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/app/compare/{base}...{head}', + description: 'Instant mobile web app creation', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/app/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/app/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/app/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/app/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/app/git/tags{/sha}', + has_projects: true, + releases_url: 'https://api.github.com/repos/mralexgray/app/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/app/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/app/assignees{/user}', + downloads_url: 'https://api.github.com/repos/mralexgray/app/downloads', + has_downloads: true, + languages_url: 'https://api.github.com/repos/mralexgray/app/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/app/milestones{/number}', + stargazers_url: 'https://api.github.com/repos/mralexgray/app/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/app/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/app/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/app/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/app/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/app/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/app/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/app/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/app/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/app/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + ], + name: 'Shirt', + revenue: 4.99, + }, + 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', + }, + PayloadSize: 48375, + LastJobStatus: { + JobID: 0, + JobState: '', + AttemptNum: 0, + ExecTime: '0001-01-01T00:00:00Z', + RetryTime: '0001-01-01T00:00:00Z', + ErrorCode: '', + ErrorResponse: null, + Parameters: null, + WorkspaceId: '', + }, + Parameters: { + record_id: null, + source_id: '2DTlLPQxignYp4ag9sISgGN2uY7', + event_name: 'Product Purchased new', + event_type: 'track', + message_id: '9f8fb785-c720-4381-a009-bf22a13f4ced', + received_at: '2022-08-18T08:43:13.521+05:30', + workspaceId: '2DTlBMipxWfJZzZ1SsjELQWvkwd', + transform_at: 'router', + source_job_id: '', + destination_id: '2DTozIMGtBwTGNJtuvdPByFSL2Z', + gateway_job_id: 6, + source_task_id: '', + source_batch_id: '', + source_category: '', + source_job_run_id: '', + source_task_run_id: '', + source_definition_id: '2DTlJaW1jHhM8B27Et2CMTZoxZF', + destination_definition_id: '', + }, + WorkspaceId: '2DTlBMipxWfJZzZ1SsjELQWvkwd', + }, + workerAssignedTime: '2022-08-18T08:43:16.586825+05:30', + }, + destination: { + ID: '2DTozIMGtBwTGNJtuvdPByFSL2Z', + Name: 'Lambda test', + DestinationDefinition: { + ID: '2DTlHvPWOzBUksUQUvggRnalUkj', + Name: 'LAMBDA', + DisplayName: 'AWS Lambda', + Config: { + destConfig: { + defaultConfig: [ + 'region', + 'iamRoleARN', + 'externalID', + 'accessKeyId', + 'accessKey', + 'lambda', + 'enableBatchInput', + 'clientContext', + 'roleBasedAuth', + 'maxBatchSize', + ], + }, + excludeKeys: [], + includeKeys: [], + saveDestinationResponse: true, + secretKeys: ['accessKeyId', 'accessKey', 'iamRoleARN', 'externalID'], + supportedMessageTypes: [ + 'identify', + 'page', + 'screen', + 'track', + 'alias', + 'group', + ], + supportedSourceTypes: [ + 'amp', + 'android', + 'cordova', + 'cloud', + 'flutter', + 'ios', + 'reactnative', + 'unity', + 'warehouse', + 'web', + ], + transformAt: 'router', + transformAtV1: 'router', + }, + ResponseRules: {}, + }, + Config: { + accessKey: '', + accessKeyId: '', + clientContext: '', + enableBatchInput: true, + externalID: '', + iamRoleARN: '', + lambda: 'testFunction', + maxBatchSize: '2', + region: 'us-west-2', + roleBasedAuth: false, + }, + Enabled: true, + Transformations: [], + IsProcessorEnabled: true, + RevisionID: '2DVji2YjKiWRL0Qdx73xg9r8ReQ', + }, + }, + { + message: { + name: 'Page View', + type: 'page', + 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: '5f58d1f7-cbd6-4bff-8571-9933be7210b1', + timestamp: '2020-02-02T00:23:09.544Z', + properties: { + path: '/', + title: 'Home', + }, + 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', + }, + metadata: { + userId: 'anon-id-new<<>>identified user id', + jobId: 33, + sourceId: '2DTlLPQxignYp4ag9sISgGN2uY7', + destinationId: '2DTozIMGtBwTGNJtuvdPByFSL2Z', + attemptNum: 0, + receivedAt: '2022-08-18T08:43:13.521+05:30', + createdAt: '2022-08-18T03:13:15.549Z', + firstAttemptedAt: '', + transformAt: 'router', + workspaceId: '2DTlBMipxWfJZzZ1SsjELQWvkwd', + secret: null, + jobsT: { + UUID: 'bf616af4-2c6b-495f-8b2d-b522c93bdca2', + JobID: 33, + UserID: 'anon-id-new<<>>identified user id', + CreatedAt: '2022-08-18T03:13:15.549078Z', + ExpireAt: '2022-08-18T03:13:15.549078Z', + CustomVal: 'LAMBDA', + EventCount: 1, + EventPayload: { + name: 'Page View', + type: 'page', + 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: '5f58d1f7-cbd6-4bff-8571-9933be7210b1', + timestamp: '2020-02-02T00:23:09.544Z', + properties: { + path: '/', + title: 'Home', + }, + 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', + }, + PayloadSize: 548, + LastJobStatus: { + JobID: 0, + JobState: '', + AttemptNum: 0, + ExecTime: '0001-01-01T00:00:00Z', + RetryTime: '0001-01-01T00:00:00Z', + ErrorCode: '', + ErrorResponse: null, + Parameters: null, + WorkspaceId: '', + }, + Parameters: { + record_id: null, + source_id: '2DTlLPQxignYp4ag9sISgGN2uY7', + event_name: '', + event_type: 'page', + message_id: '5f58d1f7-cbd6-4bff-8571-9933be7210b1', + received_at: '2022-08-18T08:43:13.521+05:30', + workspaceId: '2DTlBMipxWfJZzZ1SsjELQWvkwd', + transform_at: 'router', + source_job_id: '', + destination_id: '2DTozIMGtBwTGNJtuvdPByFSL2Z', + gateway_job_id: 6, + source_task_id: '', + source_batch_id: '', + source_category: '', + source_job_run_id: '', + source_task_run_id: '', + source_definition_id: '2DTlJaW1jHhM8B27Et2CMTZoxZF', + destination_definition_id: '', + }, + WorkspaceId: '2DTlBMipxWfJZzZ1SsjELQWvkwd', + }, + workerAssignedTime: '2022-08-18T08:43:16.586825+05:30', + }, + destination: { + ID: '2DTozIMGtBwTGNJtuvdPByFSL2Z', + Name: 'Lambda test', + DestinationDefinition: { + ID: '2DTlHvPWOzBUksUQUvggRnalUkj', + Name: 'LAMBDA', + DisplayName: 'AWS Lambda', + Config: { + destConfig: { + defaultConfig: [ + 'region', + 'iamRoleARN', + 'externalID', + 'accessKeyId', + 'accessKey', + 'lambda', + 'enableBatchInput', + 'clientContext', + 'roleBasedAuth', + 'maxBatchSize', + ], + }, + excludeKeys: [], + includeKeys: [], + saveDestinationResponse: true, + secretKeys: ['accessKeyId', 'accessKey', 'iamRoleARN', 'externalID'], + supportedMessageTypes: [ + 'identify', + 'page', + 'screen', + 'track', + 'alias', + 'group', + ], + supportedSourceTypes: [ + 'amp', + 'android', + 'cordova', + 'cloud', + 'flutter', + 'ios', + 'reactnative', + 'unity', + 'warehouse', + 'web', + ], + transformAt: 'router', + transformAtV1: 'router', + }, + ResponseRules: {}, + }, + Config: { + accessKey: '', + accessKeyId: '', + clientContext: '', + enableBatchInput: true, + externalID: '', + iamRoleARN: '', + lambda: 'testFunction', + maxBatchSize: '2', + region: 'us-west-2', + roleBasedAuth: false, + }, + Enabled: true, + Transformations: [], + IsProcessorEnabled: true, + RevisionID: '2DVji2YjKiWRL0Qdx73xg9r8ReQ', + }, + }, + { + message: { + 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', + }, + metadata: { + userId: 'anon-id-new<<>>identified user id', + jobId: 34, + sourceId: '2DTlLPQxignYp4ag9sISgGN2uY7', + destinationId: '2DTozIMGtBwTGNJtuvdPByFSL2Z', + attemptNum: 0, + receivedAt: '2022-08-18T08:43:13.521+05:30', + createdAt: '2022-08-18T03:13:15.549Z', + firstAttemptedAt: '', + transformAt: 'router', + workspaceId: '2DTlBMipxWfJZzZ1SsjELQWvkwd', + secret: null, + jobsT: { + UUID: '8faa9d6d-d8a8-468c-bef4-c2db52f6101b', + JobID: 34, + UserID: 'anon-id-new<<>>identified user id', + CreatedAt: '2022-08-18T03:13:15.549078Z', + ExpireAt: '2022-08-18T03:13:15.549078Z', + CustomVal: 'LAMBDA', + EventCount: 1, + EventPayload: { + 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', + }, + PayloadSize: 536, + LastJobStatus: { + JobID: 0, + JobState: '', + AttemptNum: 0, + ExecTime: '0001-01-01T00:00:00Z', + RetryTime: '0001-01-01T00:00:00Z', + ErrorCode: '', + ErrorResponse: null, + Parameters: null, + WorkspaceId: '', + }, + Parameters: { + record_id: null, + source_id: '2DTlLPQxignYp4ag9sISgGN2uY7', + event_name: '', + event_type: 'screen', + message_id: '1b8ee4c3-ffad-4457-b453-31b32da1dfea', + received_at: '2022-08-18T08:43:13.521+05:30', + workspaceId: '2DTlBMipxWfJZzZ1SsjELQWvkwd', + transform_at: 'router', + source_job_id: '', + destination_id: '2DTozIMGtBwTGNJtuvdPByFSL2Z', + gateway_job_id: 6, + source_task_id: '', + source_batch_id: '', + source_category: '', + source_job_run_id: '', + source_task_run_id: '', + source_definition_id: '2DTlJaW1jHhM8B27Et2CMTZoxZF', + destination_definition_id: '', + }, + WorkspaceId: '2DTlBMipxWfJZzZ1SsjELQWvkwd', + }, + workerAssignedTime: '2022-08-18T08:43:16.586825+05:30', + }, + destination: { + ID: '2DTozIMGtBwTGNJtuvdPByFSL2Z', + Name: 'Lambda test', + DestinationDefinition: { + ID: '2DTlHvPWOzBUksUQUvggRnalUkj', + Name: 'LAMBDA', + DisplayName: 'AWS Lambda', + Config: { + destConfig: { + defaultConfig: [ + 'region', + 'iamRoleARN', + 'externalID', + 'accessKeyId', + 'accessKey', + 'lambda', + 'enableBatchInput', + 'clientContext', + 'roleBasedAuth', + 'maxBatchSize', + ], + }, + excludeKeys: [], + includeKeys: [], + saveDestinationResponse: true, + secretKeys: ['accessKeyId', 'accessKey', 'iamRoleARN', 'externalID'], + supportedMessageTypes: [ + 'identify', + 'page', + 'screen', + 'track', + 'alias', + 'group', + ], + supportedSourceTypes: [ + 'amp', + 'android', + 'cordova', + 'cloud', + 'flutter', + 'ios', + 'reactnative', + 'unity', + 'warehouse', + 'web', + ], + transformAt: 'router', + transformAtV1: 'router', + }, + ResponseRules: {}, + }, + Config: { + accessKey: '', + accessKeyId: '', + clientContext: '', + enableBatchInput: true, + externalID: '', + iamRoleARN: '', + lambda: 'testFunction', + maxBatchSize: '2', + region: 'us-west-2', + roleBasedAuth: false, + }, + Enabled: true, + Transformations: [], + IsProcessorEnabled: true, + RevisionID: '2DVji2YjKiWRL0Qdx73xg9r8ReQ', + }, + }, + { + message: { + 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', + }, + metadata: { + userId: 'anon-id-new<<>>identified user id', + jobId: 35, + sourceId: '2DTlLPQxignYp4ag9sISgGN2uY7', + destinationId: '2DTozIMGtBwTGNJtuvdPByFSL2Z', + attemptNum: 0, + receivedAt: '2022-08-18T08:43:13.521+05:30', + createdAt: '2022-08-18T03:13:15.549Z', + firstAttemptedAt: '', + transformAt: 'router', + workspaceId: '2DTlBMipxWfJZzZ1SsjELQWvkwd', + secret: null, + jobsT: { + UUID: '73cea314-998a-4b72-8004-34b0618093a3', + JobID: 35, + UserID: 'anon-id-new<<>>identified user id', + CreatedAt: '2022-08-18T03:13:15.549078Z', + ExpireAt: '2022-08-18T03:13:15.549078Z', + CustomVal: 'LAMBDA', + EventCount: 1, + EventPayload: { + 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', + }, + PayloadSize: 589, + LastJobStatus: { + JobID: 0, + JobState: '', + AttemptNum: 0, + ExecTime: '0001-01-01T00:00:00Z', + RetryTime: '0001-01-01T00:00:00Z', + ErrorCode: '', + ErrorResponse: null, + Parameters: null, + WorkspaceId: '', + }, + Parameters: { + record_id: null, + source_id: '2DTlLPQxignYp4ag9sISgGN2uY7', + event_name: '', + event_type: 'group', + message_id: '2c59b527-3235-4fc2-9680-f41ec52ebb51', + received_at: '2022-08-18T08:43:13.521+05:30', + workspaceId: '2DTlBMipxWfJZzZ1SsjELQWvkwd', + transform_at: 'router', + source_job_id: '', + destination_id: '2DTozIMGtBwTGNJtuvdPByFSL2Z', + gateway_job_id: 6, + source_task_id: '', + source_batch_id: '', + source_category: '', + source_job_run_id: '', + source_task_run_id: '', + source_definition_id: '2DTlJaW1jHhM8B27Et2CMTZoxZF', + destination_definition_id: '', + }, + WorkspaceId: '2DTlBMipxWfJZzZ1SsjELQWvkwd', + }, + workerAssignedTime: '2022-08-18T08:43:16.586825+05:30', + }, + destination: { + ID: '2DTozIMGtBwTGNJtuvdPByFSL2Z', + Name: 'Lambda test', + DestinationDefinition: { + ID: '2DTlHvPWOzBUksUQUvggRnalUkj', + Name: 'LAMBDA', + DisplayName: 'AWS Lambda', + Config: { + destConfig: { + defaultConfig: [ + 'region', + 'iamRoleARN', + 'externalID', + 'accessKeyId', + 'accessKey', + 'lambda', + 'enableBatchInput', + 'clientContext', + 'roleBasedAuth', + 'maxBatchSize', + ], + }, + excludeKeys: [], + includeKeys: [], + saveDestinationResponse: true, + secretKeys: ['accessKeyId', 'accessKey', 'iamRoleARN', 'externalID'], + supportedMessageTypes: [ + 'identify', + 'page', + 'screen', + 'track', + 'alias', + 'group', + ], + supportedSourceTypes: [ + 'amp', + 'android', + 'cordova', + 'cloud', + 'flutter', + 'ios', + 'reactnative', + 'unity', + 'warehouse', + 'web', + ], + transformAt: 'router', + transformAtV1: 'router', + }, + ResponseRules: {}, + }, + Config: { + accessKey: '', + accessKeyId: '', + clientContext: '', + enableBatchInput: true, + externalID: '', + iamRoleARN: '', + lambda: 'testFunction', + maxBatchSize: '2', + region: 'us-west-2', + roleBasedAuth: false, + }, + Enabled: true, + Transformations: [], + IsProcessorEnabled: true, + RevisionID: '2DVji2YjKiWRL0Qdx73xg9r8ReQ', + }, + }, + { + message: { + 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', + }, + metadata: { + userId: 'anon-id-new<<>>identified user id', + jobId: 36, + sourceId: '2DTlLPQxignYp4ag9sISgGN2uY7', + destinationId: '2DTozIMGtBwTGNJtuvdPByFSL2Z', + attemptNum: 0, + receivedAt: '2022-08-18T08:43:13.521+05:30', + createdAt: '2022-08-18T03:13:15.549Z', + firstAttemptedAt: '', + transformAt: 'router', + workspaceId: '2DTlBMipxWfJZzZ1SsjELQWvkwd', + secret: null, + jobsT: { + UUID: 'ac80629c-9eb6-4e92-bee8-4647e88f7fc0', + JobID: 36, + UserID: 'anon-id-new<<>>identified user id', + CreatedAt: '2022-08-18T03:13:15.549078Z', + ExpireAt: '2022-08-18T03:13:15.549078Z', + CustomVal: 'LAMBDA', + EventCount: 1, + EventPayload: { + 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', + }, + PayloadSize: 506, + LastJobStatus: { + JobID: 0, + JobState: '', + AttemptNum: 0, + ExecTime: '0001-01-01T00:00:00Z', + RetryTime: '0001-01-01T00:00:00Z', + ErrorCode: '', + ErrorResponse: null, + Parameters: null, + WorkspaceId: '', + }, + Parameters: { + record_id: null, + source_id: '2DTlLPQxignYp4ag9sISgGN2uY7', + event_name: '', + event_type: 'alias', + message_id: '3ff8d400-b6d4-43a4-a0ff-1bc7ae8b5f7d', + received_at: '2022-08-18T08:43:13.521+05:30', + workspaceId: '2DTlBMipxWfJZzZ1SsjELQWvkwd', + transform_at: 'router', + source_job_id: '', + destination_id: '2DTozIMGtBwTGNJtuvdPByFSL2Z', + gateway_job_id: 6, + source_task_id: '', + source_batch_id: '', + source_category: '', + source_job_run_id: '', + source_task_run_id: '', + source_definition_id: '2DTlJaW1jHhM8B27Et2CMTZoxZF', + destination_definition_id: '', + }, + WorkspaceId: '2DTlBMipxWfJZzZ1SsjELQWvkwd', + }, + workerAssignedTime: '2022-08-18T08:43:16.586825+05:30', + }, + destination: { + ID: '2DTozIMGtBwTGNJtuvdPByFSL2Z', + Name: 'Lambda test', + DestinationDefinition: { + ID: '2DTlHvPWOzBUksUQUvggRnalUkj', + Name: 'LAMBDA', + DisplayName: 'AWS Lambda', + Config: { + destConfig: { + defaultConfig: [ + 'region', + 'iamRoleARN', + 'externalID', + 'accessKeyId', + 'accessKey', + 'lambda', + 'enableBatchInput', + 'clientContext', + 'roleBasedAuth', + 'maxBatchSize', + ], + }, + excludeKeys: [], + includeKeys: [], + saveDestinationResponse: true, + secretKeys: ['accessKeyId', 'accessKey', 'iamRoleARN', 'externalID'], + supportedMessageTypes: [ + 'identify', + 'page', + 'screen', + 'track', + 'alias', + 'group', + ], + supportedSourceTypes: [ + 'amp', + 'android', + 'cordova', + 'cloud', + 'flutter', + 'ios', + 'reactnative', + 'unity', + 'warehouse', + 'web', + ], + transformAt: 'router', + transformAtV1: 'router', + }, + ResponseRules: {}, + }, + Config: { + accessKey: '', + accessKeyId: '', + clientContext: '', + enableBatchInput: true, + externalID: '', + iamRoleARN: '', + lambda: 'testFunction', + maxBatchSize: '2', + region: 'us-west-2', + roleBasedAuth: false, + }, + Enabled: true, + Transformations: [], + IsProcessorEnabled: true, + RevisionID: '2DVji2YjKiWRL0Qdx73xg9r8ReQ', + }, + }, + ], + destType: 'lambda', + }, + method: 'POST', + }, + }, + output: { + response: { + status: 200, + body: { + output: [ + { + batchedRequest: { + payload: + '[{"type":"track","event":"Product Purchased new","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":"9f8fb785-c720-4381-a009-bf22a13f4ced","timestamp":"2020-02-02T00:23:09.544Z","properties":{"data":[{"id":6104546,"url":"https://api.github.com/repos/mralexgray/-REPONAME","fork":false,"name":"-REPONAME","size":48,"forks":0,"owner":{"id":262517,"url":"https://api.github.com/users/mralexgray","type":"User","login":"mralexgray","node_id":"MDQ6VXNlcjI2MjUxNw==","html_url":"https://github.com/mralexgray","gists_url":"https://api.github.com/users/mralexgray/gists{/gist_id}","repos_url":"https://api.github.com/users/mralexgray/repos","avatar_url":"https://avatars.githubusercontent.com/u/262517?v=4","events_url":"https://api.github.com/users/mralexgray/events{/privacy}","site_admin":false,"gravatar_id":"","starred_url":"https://api.github.com/users/mralexgray/starred{/owner}{/repo}","followers_url":"https://api.github.com/users/mralexgray/followers","following_url":"https://api.github.com/users/mralexgray/following{/other_user}","organizations_url":"https://api.github.com/users/mralexgray/orgs","subscriptions_url":"https://api.github.com/users/mralexgray/subscriptions","received_events_url":"https://api.github.com/users/mralexgray/received_events"},"topics":[],"git_url":"git://github.com/mralexgray/-REPONAME.git","license":null,"node_id":"MDEwOlJlcG9zaXRvcnk2MTA0NTQ2","private":false,"ssh_url":"git@github.com:mralexgray/-REPONAME.git","svn_url":"https://github.com/mralexgray/-REPONAME","archived":false,"disabled":false,"has_wiki":true,"homepage":null,"html_url":"https://github.com/mralexgray/-REPONAME","keys_url":"https://api.github.com/repos/mralexgray/-REPONAME/keys{/key_id}","language":null,"tags_url":"https://api.github.com/repos/mralexgray/-REPONAME/tags","watchers":0,"blobs_url":"https://api.github.com/repos/mralexgray/-REPONAME/git/blobs{/sha}","clone_url":"https://github.com/mralexgray/-REPONAME.git","forks_url":"https://api.github.com/repos/mralexgray/-REPONAME/forks","full_name":"mralexgray/-REPONAME","has_pages":false,"hooks_url":"https://api.github.com/repos/mralexgray/-REPONAME/hooks","pulls_url":"https://api.github.com/repos/mralexgray/-REPONAME/pulls{/number}","pushed_at":"2012-10-06T16:37:39Z","teams_url":"https://api.github.com/repos/mralexgray/-REPONAME/teams","trees_url":"https://api.github.com/repos/mralexgray/-REPONAME/git/trees{/sha}","created_at":"2012-10-06T16:37:39Z","events_url":"https://api.github.com/repos/mralexgray/-REPONAME/events","has_issues":true,"issues_url":"https://api.github.com/repos/mralexgray/-REPONAME/issues{/number}","labels_url":"https://api.github.com/repos/mralexgray/-REPONAME/labels{/name}","merges_url":"https://api.github.com/repos/mralexgray/-REPONAME/merges","mirror_url":null,"updated_at":"2013-01-12T13:39:30Z","visibility":"public","archive_url":"https://api.github.com/repos/mralexgray/-REPONAME/{archive_format}{/ref}","commits_url":"https://api.github.com/repos/mralexgray/-REPONAME/commits{/sha}","compare_url":"https://api.github.com/repos/mralexgray/-REPONAME/compare/{base}...{head}","description":null,"forks_count":0,"is_template":false,"open_issues":0,"branches_url":"https://api.github.com/repos/mralexgray/-REPONAME/branches{/branch}","comments_url":"https://api.github.com/repos/mralexgray/-REPONAME/comments{/number}","contents_url":"https://api.github.com/repos/mralexgray/-REPONAME/contents/{+path}","git_refs_url":"https://api.github.com/repos/mralexgray/-REPONAME/git/refs{/sha}","git_tags_url":"https://api.github.com/repos/mralexgray/-REPONAME/git/tags{/sha}","has_projects":true,"releases_url":"https://api.github.com/repos/mralexgray/-REPONAME/releases{/id}","statuses_url":"https://api.github.com/repos/mralexgray/-REPONAME/statuses/{sha}","allow_forking":true,"assignees_url":"https://api.github.com/repos/mralexgray/-REPONAME/assignees{/user}","downloads_url":"https://api.github.com/repos/mralexgray/-REPONAME/downloads","has_downloads":true,"languages_url":"https://api.github.com/repos/mralexgray/-REPONAME/languages","default_branch":"master","milestones_url":"https://api.github.com/repos/mralexgray/-REPONAME/milestones{/number}","stargazers_url":"https://api.github.com/repos/mralexgray/-REPONAME/stargazers","watchers_count":0,"deployments_url":"https://api.github.com/repos/mralexgray/-REPONAME/deployments","git_commits_url":"https://api.github.com/repos/mralexgray/-REPONAME/git/commits{/sha}","subscribers_url":"https://api.github.com/repos/mralexgray/-REPONAME/subscribers","contributors_url":"https://api.github.com/repos/mralexgray/-REPONAME/contributors","issue_events_url":"https://api.github.com/repos/mralexgray/-REPONAME/issues/events{/number}","stargazers_count":0,"subscription_url":"https://api.github.com/repos/mralexgray/-REPONAME/subscription","collaborators_url":"https://api.github.com/repos/mralexgray/-REPONAME/collaborators{/collaborator}","issue_comment_url":"https://api.github.com/repos/mralexgray/-REPONAME/issues/comments{/number}","notifications_url":"https://api.github.com/repos/mralexgray/-REPONAME/notifications{?since,all,participating}","open_issues_count":0,"web_commit_signoff_required":false},{"id":104510411,"url":"https://api.github.com/repos/mralexgray/...","fork":true,"name":"...","size":113,"forks":0,"owner":{"id":262517,"url":"https://api.github.com/users/mralexgray","type":"User","login":"mralexgray","node_id":"MDQ6VXNlcjI2MjUxNw==","html_url":"https://github.com/mralexgray","gists_url":"https://api.github.com/users/mralexgray/gists{/gist_id}","repos_url":"https://api.github.com/users/mralexgray/repos","avatar_url":"https://avatars.githubusercontent.com/u/262517?v=4","events_url":"https://api.github.com/users/mralexgray/events{/privacy}","site_admin":false,"gravatar_id":"","starred_url":"https://api.github.com/users/mralexgray/starred{/owner}{/repo}","followers_url":"https://api.github.com/users/mralexgray/followers","following_url":"https://api.github.com/users/mralexgray/following{/other_user}","organizations_url":"https://api.github.com/users/mralexgray/orgs","subscriptions_url":"https://api.github.com/users/mralexgray/subscriptions","received_events_url":"https://api.github.com/users/mralexgray/received_events"},"topics":[],"git_url":"git://github.com/mralexgray/....git","license":{"key":"mit","url":"https://api.github.com/licenses/mit","name":"MIT License","node_id":"MDc6TGljZW5zZTEz","spdx_id":"MIT"},"node_id":"MDEwOlJlcG9zaXRvcnkxMDQ1MTA0MTE=","private":false,"ssh_url":"git@github.com:mralexgray/....git","svn_url":"https://github.com/mralexgray/...","archived":false,"disabled":false,"has_wiki":false,"homepage":"https://driesvints.com/blog/getting-started-with-dotfiles","html_url":"https://github.com/mralexgray/...","keys_url":"https://api.github.com/repos/mralexgray/.../keys{/key_id}","language":"Shell","tags_url":"https://api.github.com/repos/mralexgray/.../tags","watchers":0,"blobs_url":"https://api.github.com/repos/mralexgray/.../git/blobs{/sha}","clone_url":"https://github.com/mralexgray/....git","forks_url":"https://api.github.com/repos/mralexgray/.../forks","full_name":"mralexgray/...","has_pages":false,"hooks_url":"https://api.github.com/repos/mralexgray/.../hooks","pulls_url":"https://api.github.com/repos/mralexgray/.../pulls{/number}","pushed_at":"2017-09-15T08:27:32Z","teams_url":"https://api.github.com/repos/mralexgray/.../teams","trees_url":"https://api.github.com/repos/mralexgray/.../git/trees{/sha}","created_at":"2017-09-22T19:19:42Z","events_url":"https://api.github.com/repos/mralexgray/.../events","has_issues":false,"issues_url":"https://api.github.com/repos/mralexgray/.../issues{/number}","labels_url":"https://api.github.com/repos/mralexgray/.../labels{/name}","merges_url":"https://api.github.com/repos/mralexgray/.../merges","mirror_url":null,"updated_at":"2017-09-22T19:20:22Z","visibility":"public","archive_url":"https://api.github.com/repos/mralexgray/.../{archive_format}{/ref}","commits_url":"https://api.github.com/repos/mralexgray/.../commits{/sha}","compare_url":"https://api.github.com/repos/mralexgray/.../compare/{base}...{head}","description":":computer: Public repo for my personal dotfiles.","forks_count":0,"is_template":false,"open_issues":0,"branches_url":"https://api.github.com/repos/mralexgray/.../branches{/branch}","comments_url":"https://api.github.com/repos/mralexgray/.../comments{/number}","contents_url":"https://api.github.com/repos/mralexgray/.../contents/{+path}","git_refs_url":"https://api.github.com/repos/mralexgray/.../git/refs{/sha}","git_tags_url":"https://api.github.com/repos/mralexgray/.../git/tags{/sha}","has_projects":true,"releases_url":"https://api.github.com/repos/mralexgray/.../releases{/id}","statuses_url":"https://api.github.com/repos/mralexgray/.../statuses/{sha}","allow_forking":true,"assignees_url":"https://api.github.com/repos/mralexgray/.../assignees{/user}","downloads_url":"https://api.github.com/repos/mralexgray/.../downloads","has_downloads":true,"languages_url":"https://api.github.com/repos/mralexgray/.../languages","default_branch":"master","milestones_url":"https://api.github.com/repos/mralexgray/.../milestones{/number}","stargazers_url":"https://api.github.com/repos/mralexgray/.../stargazers","watchers_count":0,"deployments_url":"https://api.github.com/repos/mralexgray/.../deployments","git_commits_url":"https://api.github.com/repos/mralexgray/.../git/commits{/sha}","subscribers_url":"https://api.github.com/repos/mralexgray/.../subscribers","contributors_url":"https://api.github.com/repos/mralexgray/.../contributors","issue_events_url":"https://api.github.com/repos/mralexgray/.../issues/events{/number}","stargazers_count":0,"subscription_url":"https://api.github.com/repos/mralexgray/.../subscription","collaborators_url":"https://api.github.com/repos/mralexgray/.../collaborators{/collaborator}","issue_comment_url":"https://api.github.com/repos/mralexgray/.../issues/comments{/number}","notifications_url":"https://api.github.com/repos/mralexgray/.../notifications{?since,all,participating}","open_issues_count":0,"web_commit_signoff_required":false},{"id":58656723,"url":"https://api.github.com/repos/mralexgray/2200087-Serial-Protocol","fork":true,"name":"2200087-Serial-Protocol","size":41,"forks":1,"owner":{"id":262517,"url":"https://api.github.com/users/mralexgray","type":"User","login":"mralexgray","node_id":"MDQ6VXNlcjI2MjUxNw==","html_url":"https://github.com/mralexgray","gists_url":"https://api.github.com/users/mralexgray/gists{/gist_id}","repos_url":"https://api.github.com/users/mralexgray/repos","avatar_url":"https://avatars.githubusercontent.com/u/262517?v=4","events_url":"https://api.github.com/users/mralexgray/events{/privacy}","site_admin":false,"gravatar_id":"","starred_url":"https://api.github.com/users/mralexgray/starred{/owner}{/repo}","followers_url":"https://api.github.com/users/mralexgray/followers","following_url":"https://api.github.com/users/mralexgray/following{/other_user}","organizations_url":"https://api.github.com/users/mralexgray/orgs","subscriptions_url":"https://api.github.com/users/mralexgray/subscriptions","received_events_url":"https://api.github.com/users/mralexgray/received_events"},"topics":[],"git_url":"git://github.com/mralexgray/2200087-Serial-Protocol.git","license":{"key":"gpl-2.0","url":"https://api.github.com/licenses/gpl-2.0","name":"GNU General Public License v2.0","node_id":"MDc6TGljZW5zZTg=","spdx_id":"GPL-2.0"},"node_id":"MDEwOlJlcG9zaXRvcnk1ODY1NjcyMw==","private":false,"ssh_url":"git@github.com:mralexgray/2200087-Serial-Protocol.git","svn_url":"https://github.com/mralexgray/2200087-Serial-Protocol","archived":false,"disabled":false,"has_wiki":true,"homepage":"http://daviddworken.com","html_url":"https://github.com/mralexgray/2200087-Serial-Protocol","keys_url":"https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/keys{/key_id}","language":"Python","tags_url":"https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/tags","watchers":0,"blobs_url":"https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/git/blobs{/sha}","clone_url":"https://github.com/mralexgray/2200087-Serial-Protocol.git","forks_url":"https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/forks","full_name":"mralexgray/2200087-Serial-Protocol","has_pages":false,"hooks_url":"https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/hooks","pulls_url":"https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/pulls{/number}","pushed_at":"2016-05-12T16:07:24Z","teams_url":"https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/teams","trees_url":"https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/git/trees{/sha}","created_at":"2016-05-12T16:05:28Z","events_url":"https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/events","has_issues":false,"issues_url":"https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/issues{/number}","labels_url":"https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/labels{/name}","merges_url":"https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/merges","mirror_url":null,"updated_at":"2016-05-12T16:05:30Z","visibility":"public","archive_url":"https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/{archive_format}{/ref}","commits_url":"https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/commits{/sha}","compare_url":"https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/compare/{base}...{head}","description":"A reverse engineered protocol description and accompanying code for Radioshack\'s 2200087 multimeter","forks_count":1,"is_template":false,"open_issues":0,"branches_url":"https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/branches{/branch}","comments_url":"https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/comments{/number}","contents_url":"https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/contents/{+path}","git_refs_url":"https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/git/refs{/sha}","git_tags_url":"https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/git/tags{/sha}","has_projects":true,"releases_url":"https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/releases{/id}","statuses_url":"https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/statuses/{sha}","allow_forking":true,"assignees_url":"https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/assignees{/user}","downloads_url":"https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/downloads","has_downloads":true,"languages_url":"https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/languages","default_branch":"master","milestones_url":"https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/milestones{/number}","stargazers_url":"https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/stargazers","watchers_count":0,"deployments_url":"https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/deployments","git_commits_url":"https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/git/commits{/sha}","subscribers_url":"https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/subscribers","contributors_url":"https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/contributors","issue_events_url":"https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/issues/events{/number}","stargazers_count":0,"subscription_url":"https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/subscription","collaborators_url":"https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/collaborators{/collaborator}","issue_comment_url":"https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/issues/comments{/number}","notifications_url":"https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/notifications{?since,all,participating}","open_issues_count":0,"web_commit_signoff_required":false},{"id":13121042,"url":"https://api.github.com/repos/mralexgray/ace","fork":true,"name":"ace","size":21080,"forks":1,"owner":{"id":262517,"url":"https://api.github.com/users/mralexgray","type":"User","login":"mralexgray","node_id":"MDQ6VXNlcjI2MjUxNw==","html_url":"https://github.com/mralexgray","gists_url":"https://api.github.com/users/mralexgray/gists{/gist_id}","repos_url":"https://api.github.com/users/mralexgray/repos","avatar_url":"https://avatars.githubusercontent.com/u/262517?v=4","events_url":"https://api.github.com/users/mralexgray/events{/privacy}","site_admin":false,"gravatar_id":"","starred_url":"https://api.github.com/users/mralexgray/starred{/owner}{/repo}","followers_url":"https://api.github.com/users/mralexgray/followers","following_url":"https://api.github.com/users/mralexgray/following{/other_user}","organizations_url":"https://api.github.com/users/mralexgray/orgs","subscriptions_url":"https://api.github.com/users/mralexgray/subscriptions","received_events_url":"https://api.github.com/users/mralexgray/received_events"},"topics":[],"git_url":"git://github.com/mralexgray/ace.git","license":{"key":"other","url":null,"name":"Other","node_id":"MDc6TGljZW5zZTA=","spdx_id":"NOASSERTION"},"node_id":"MDEwOlJlcG9zaXRvcnkxMzEyMTA0Mg==","private":false,"ssh_url":"git@github.com:mralexgray/ace.git","svn_url":"https://github.com/mralexgray/ace","archived":false,"disabled":false,"has_wiki":true,"homepage":"http://ace.c9.io","html_url":"https://github.com/mralexgray/ace","keys_url":"https://api.github.com/repos/mralexgray/ace/keys{/key_id}","language":"JavaScript","tags_url":"https://api.github.com/repos/mralexgray/ace/tags","watchers":0,"blobs_url":"https://api.github.com/repos/mralexgray/ace/git/blobs{/sha}","clone_url":"https://github.com/mralexgray/ace.git","forks_url":"https://api.github.com/repos/mralexgray/ace/forks","full_name":"mralexgray/ace","has_pages":false,"hooks_url":"https://api.github.com/repos/mralexgray/ace/hooks","pulls_url":"https://api.github.com/repos/mralexgray/ace/pulls{/number}","pushed_at":"2013-10-26T12:34:48Z","teams_url":"https://api.github.com/repos/mralexgray/ace/teams","trees_url":"https://api.github.com/repos/mralexgray/ace/git/trees{/sha}","created_at":"2013-09-26T11:58:10Z","events_url":"https://api.github.com/repos/mralexgray/ace/events","has_issues":false,"issues_url":"https://api.github.com/repos/mralexgray/ace/issues{/number}","labels_url":"https://api.github.com/repos/mralexgray/ace/labels{/name}","merges_url":"https://api.github.com/repos/mralexgray/ace/merges","mirror_url":null,"updated_at":"2013-10-26T12:34:49Z","visibility":"public","archive_url":"https://api.github.com/repos/mralexgray/ace/{archive_format}{/ref}","commits_url":"https://api.github.com/repos/mralexgray/ace/commits{/sha}","compare_url":"https://api.github.com/repos/mralexgray/ace/compare/{base}...{head}","description":"Ace (Ajax.org Cloud9 Editor)","forks_count":1,"is_template":false,"open_issues":0,"branches_url":"https://api.github.com/repos/mralexgray/ace/branches{/branch}","comments_url":"https://api.github.com/repos/mralexgray/ace/comments{/number}","contents_url":"https://api.github.com/repos/mralexgray/ace/contents/{+path}","git_refs_url":"https://api.github.com/repos/mralexgray/ace/git/refs{/sha}","git_tags_url":"https://api.github.com/repos/mralexgray/ace/git/tags{/sha}","has_projects":true,"releases_url":"https://api.github.com/repos/mralexgray/ace/releases{/id}","statuses_url":"https://api.github.com/repos/mralexgray/ace/statuses/{sha}","allow_forking":true,"assignees_url":"https://api.github.com/repos/mralexgray/ace/assignees{/user}","downloads_url":"https://api.github.com/repos/mralexgray/ace/downloads","has_downloads":true,"languages_url":"https://api.github.com/repos/mralexgray/ace/languages","default_branch":"master","milestones_url":"https://api.github.com/repos/mralexgray/ace/milestones{/number}","stargazers_url":"https://api.github.com/repos/mralexgray/ace/stargazers","watchers_count":0,"deployments_url":"https://api.github.com/repos/mralexgray/ace/deployments","git_commits_url":"https://api.github.com/repos/mralexgray/ace/git/commits{/sha}","subscribers_url":"https://api.github.com/repos/mralexgray/ace/subscribers","contributors_url":"https://api.github.com/repos/mralexgray/ace/contributors","issue_events_url":"https://api.github.com/repos/mralexgray/ace/issues/events{/number}","stargazers_count":0,"subscription_url":"https://api.github.com/repos/mralexgray/ace/subscription","collaborators_url":"https://api.github.com/repos/mralexgray/ace/collaborators{/collaborator}","issue_comment_url":"https://api.github.com/repos/mralexgray/ace/issues/comments{/number}","notifications_url":"https://api.github.com/repos/mralexgray/ace/notifications{?since,all,participating}","open_issues_count":0,"web_commit_signoff_required":false},{"id":10791045,"url":"https://api.github.com/repos/mralexgray/ACEView","fork":true,"name":"ACEView","size":1733,"forks":1,"owner":{"id":262517,"url":"https://api.github.com/users/mralexgray","type":"User","login":"mralexgray","node_id":"MDQ6VXNlcjI2MjUxNw==","html_url":"https://github.com/mralexgray","gists_url":"https://api.github.com/users/mralexgray/gists{/gist_id}","repos_url":"https://api.github.com/users/mralexgray/repos","avatar_url":"https://avatars.githubusercontent.com/u/262517?v=4","events_url":"https://api.github.com/users/mralexgray/events{/privacy}","site_admin":false,"gravatar_id":"","starred_url":"https://api.github.com/users/mralexgray/starred{/owner}{/repo}","followers_url":"https://api.github.com/users/mralexgray/followers","following_url":"https://api.github.com/users/mralexgray/following{/other_user}","organizations_url":"https://api.github.com/users/mralexgray/orgs","subscriptions_url":"https://api.github.com/users/mralexgray/subscriptions","received_events_url":"https://api.github.com/users/mralexgray/received_events"},"topics":[],"git_url":"git://github.com/mralexgray/ACEView.git","license":{"key":"other","url":null,"name":"Other","node_id":"MDc6TGljZW5zZTA=","spdx_id":"NOASSERTION"},"node_id":"MDEwOlJlcG9zaXRvcnkxMDc5MTA0NQ==","private":false,"ssh_url":"git@github.com:mralexgray/ACEView.git","svn_url":"https://github.com/mralexgray/ACEView","archived":false,"disabled":false,"has_wiki":true,"homepage":null,"html_url":"https://github.com/mralexgray/ACEView","keys_url":"https://api.github.com/repos/mralexgray/ACEView/keys{/key_id}","language":"Objective-C","tags_url":"https://api.github.com/repos/mralexgray/ACEView/tags","watchers":0,"blobs_url":"https://api.github.com/repos/mralexgray/ACEView/git/blobs{/sha}","clone_url":"https://github.com/mralexgray/ACEView.git","forks_url":"https://api.github.com/repos/mralexgray/ACEView/forks","full_name":"mralexgray/ACEView","has_pages":false,"hooks_url":"https://api.github.com/repos/mralexgray/ACEView/hooks","pulls_url":"https://api.github.com/repos/mralexgray/ACEView/pulls{/number}","pushed_at":"2014-05-09T01:36:23Z","teams_url":"https://api.github.com/repos/mralexgray/ACEView/teams","trees_url":"https://api.github.com/repos/mralexgray/ACEView/git/trees{/sha}","created_at":"2013-06-19T12:15:04Z","events_url":"https://api.github.com/repos/mralexgray/ACEView/events","has_issues":false,"issues_url":"https://api.github.com/repos/mralexgray/ACEView/issues{/number}","labels_url":"https://api.github.com/repos/mralexgray/ACEView/labels{/name}","merges_url":"https://api.github.com/repos/mralexgray/ACEView/merges","mirror_url":null,"updated_at":"2015-11-24T01:14:10Z","visibility":"public","archive_url":"https://api.github.com/repos/mralexgray/ACEView/{archive_format}{/ref}","commits_url":"https://api.github.com/repos/mralexgray/ACEView/commits{/sha}","compare_url":"https://api.github.com/repos/mralexgray/ACEView/compare/{base}...{head}","description":"Use the wonderful ACE editor in your Cocoa applications","forks_count":1,"is_template":false,"open_issues":0,"branches_url":"https://api.github.com/repos/mralexgray/ACEView/branches{/branch}","comments_url":"https://api.github.com/repos/mralexgray/ACEView/comments{/number}","contents_url":"https://api.github.com/repos/mralexgray/ACEView/contents/{+path}","git_refs_url":"https://api.github.com/repos/mralexgray/ACEView/git/refs{/sha}","git_tags_url":"https://api.github.com/repos/mralexgray/ACEView/git/tags{/sha}","has_projects":true,"releases_url":"https://api.github.com/repos/mralexgray/ACEView/releases{/id}","statuses_url":"https://api.github.com/repos/mralexgray/ACEView/statuses/{sha}","allow_forking":true,"assignees_url":"https://api.github.com/repos/mralexgray/ACEView/assignees{/user}","downloads_url":"https://api.github.com/repos/mralexgray/ACEView/downloads","has_downloads":true,"languages_url":"https://api.github.com/repos/mralexgray/ACEView/languages","default_branch":"master","milestones_url":"https://api.github.com/repos/mralexgray/ACEView/milestones{/number}","stargazers_url":"https://api.github.com/repos/mralexgray/ACEView/stargazers","watchers_count":0,"deployments_url":"https://api.github.com/repos/mralexgray/ACEView/deployments","git_commits_url":"https://api.github.com/repos/mralexgray/ACEView/git/commits{/sha}","subscribers_url":"https://api.github.com/repos/mralexgray/ACEView/subscribers","contributors_url":"https://api.github.com/repos/mralexgray/ACEView/contributors","issue_events_url":"https://api.github.com/repos/mralexgray/ACEView/issues/events{/number}","stargazers_count":0,"subscription_url":"https://api.github.com/repos/mralexgray/ACEView/subscription","collaborators_url":"https://api.github.com/repos/mralexgray/ACEView/collaborators{/collaborator}","issue_comment_url":"https://api.github.com/repos/mralexgray/ACEView/issues/comments{/number}","notifications_url":"https://api.github.com/repos/mralexgray/ACEView/notifications{?since,all,participating}","open_issues_count":0,"web_commit_signoff_required":false},{"id":13623648,"url":"https://api.github.com/repos/mralexgray/ActiveLog","fork":true,"name":"ActiveLog","size":60,"forks":0,"owner":{"id":262517,"url":"https://api.github.com/users/mralexgray","type":"User","login":"mralexgray","node_id":"MDQ6VXNlcjI2MjUxNw==","html_url":"https://github.com/mralexgray","gists_url":"https://api.github.com/users/mralexgray/gists{/gist_id}","repos_url":"https://api.github.com/users/mralexgray/repos","avatar_url":"https://avatars.githubusercontent.com/u/262517?v=4","events_url":"https://api.github.com/users/mralexgray/events{/privacy}","site_admin":false,"gravatar_id":"","starred_url":"https://api.github.com/users/mralexgray/starred{/owner}{/repo}","followers_url":"https://api.github.com/users/mralexgray/followers","following_url":"https://api.github.com/users/mralexgray/following{/other_user}","organizations_url":"https://api.github.com/users/mralexgray/orgs","subscriptions_url":"https://api.github.com/users/mralexgray/subscriptions","received_events_url":"https://api.github.com/users/mralexgray/received_events"},"topics":[],"git_url":"git://github.com/mralexgray/ActiveLog.git","license":null,"node_id":"MDEwOlJlcG9zaXRvcnkxMzYyMzY0OA==","private":false,"ssh_url":"git@github.com:mralexgray/ActiveLog.git","svn_url":"https://github.com/mralexgray/ActiveLog","archived":false,"disabled":false,"has_wiki":true,"homepage":"http://deepitpro.com/en/articles/ActiveLog/info/","html_url":"https://github.com/mralexgray/ActiveLog","keys_url":"https://api.github.com/repos/mralexgray/ActiveLog/keys{/key_id}","language":"Objective-C","tags_url":"https://api.github.com/repos/mralexgray/ActiveLog/tags","watchers":0,"blobs_url":"https://api.github.com/repos/mralexgray/ActiveLog/git/blobs{/sha}","clone_url":"https://github.com/mralexgray/ActiveLog.git","forks_url":"https://api.github.com/repos/mralexgray/ActiveLog/forks","full_name":"mralexgray/ActiveLog","has_pages":false,"hooks_url":"https://api.github.com/repos/mralexgray/ActiveLog/hooks","pulls_url":"https://api.github.com/repos/mralexgray/ActiveLog/pulls{/number}","pushed_at":"2011-07-03T06:28:59Z","teams_url":"https://api.github.com/repos/mralexgray/ActiveLog/teams","trees_url":"https://api.github.com/repos/mralexgray/ActiveLog/git/trees{/sha}","created_at":"2013-10-16T15:52:37Z","events_url":"https://api.github.com/repos/mralexgray/ActiveLog/events","has_issues":false,"issues_url":"https://api.github.com/repos/mralexgray/ActiveLog/issues{/number}","labels_url":"https://api.github.com/repos/mralexgray/ActiveLog/labels{/name}","merges_url":"https://api.github.com/repos/mralexgray/ActiveLog/merges","mirror_url":null,"updated_at":"2013-10-16T15:52:37Z","visibility":"public","archive_url":"https://api.github.com/repos/mralexgray/ActiveLog/{archive_format}{/ref}","commits_url":"https://api.github.com/repos/mralexgray/ActiveLog/commits{/sha}","compare_url":"https://api.github.com/repos/mralexgray/ActiveLog/compare/{base}...{head}","description":"Shut up all logs with active filter.","forks_count":0,"is_template":false,"open_issues":0,"branches_url":"https://api.github.com/repos/mralexgray/ActiveLog/branches{/branch}","comments_url":"https://api.github.com/repos/mralexgray/ActiveLog/comments{/number}","contents_url":"https://api.github.com/repos/mralexgray/ActiveLog/contents/{+path}","git_refs_url":"https://api.github.com/repos/mralexgray/ActiveLog/git/refs{/sha}","git_tags_url":"https://api.github.com/repos/mralexgray/ActiveLog/git/tags{/sha}","has_projects":true,"releases_url":"https://api.github.com/repos/mralexgray/ActiveLog/releases{/id}","statuses_url":"https://api.github.com/repos/mralexgray/ActiveLog/statuses/{sha}","allow_forking":true,"assignees_url":"https://api.github.com/repos/mralexgray/ActiveLog/assignees{/user}","downloads_url":"https://api.github.com/repos/mralexgray/ActiveLog/downloads","has_downloads":true,"languages_url":"https://api.github.com/repos/mralexgray/ActiveLog/languages","default_branch":"master","milestones_url":"https://api.github.com/repos/mralexgray/ActiveLog/milestones{/number}","stargazers_url":"https://api.github.com/repos/mralexgray/ActiveLog/stargazers","watchers_count":0,"deployments_url":"https://api.github.com/repos/mralexgray/ActiveLog/deployments","git_commits_url":"https://api.github.com/repos/mralexgray/ActiveLog/git/commits{/sha}","subscribers_url":"https://api.github.com/repos/mralexgray/ActiveLog/subscribers","contributors_url":"https://api.github.com/repos/mralexgray/ActiveLog/contributors","issue_events_url":"https://api.github.com/repos/mralexgray/ActiveLog/issues/events{/number}","stargazers_count":0,"subscription_url":"https://api.github.com/repos/mralexgray/ActiveLog/subscription","collaborators_url":"https://api.github.com/repos/mralexgray/ActiveLog/collaborators{/collaborator}","issue_comment_url":"https://api.github.com/repos/mralexgray/ActiveLog/issues/comments{/number}","notifications_url":"https://api.github.com/repos/mralexgray/ActiveLog/notifications{?since,all,participating}","open_issues_count":0,"web_commit_signoff_required":false},{"id":9716210,"url":"https://api.github.com/repos/mralexgray/adium","fork":false,"name":"adium","size":277719,"forks":37,"owner":{"id":262517,"url":"https://api.github.com/users/mralexgray","type":"User","login":"mralexgray","node_id":"MDQ6VXNlcjI2MjUxNw==","html_url":"https://github.com/mralexgray","gists_url":"https://api.github.com/users/mralexgray/gists{/gist_id}","repos_url":"https://api.github.com/users/mralexgray/repos","avatar_url":"https://avatars.githubusercontent.com/u/262517?v=4","events_url":"https://api.github.com/users/mralexgray/events{/privacy}","site_admin":false,"gravatar_id":"","starred_url":"https://api.github.com/users/mralexgray/starred{/owner}{/repo}","followers_url":"https://api.github.com/users/mralexgray/followers","following_url":"https://api.github.com/users/mralexgray/following{/other_user}","organizations_url":"https://api.github.com/users/mralexgray/orgs","subscriptions_url":"https://api.github.com/users/mralexgray/subscriptions","received_events_url":"https://api.github.com/users/mralexgray/received_events"},"topics":[],"git_url":"git://github.com/mralexgray/adium.git","license":{"key":"other","url":null,"name":"Other","node_id":"MDc6TGljZW5zZTA=","spdx_id":"NOASSERTION"},"node_id":"MDEwOlJlcG9zaXRvcnk5NzE2MjEw","private":false,"ssh_url":"git@github.com:mralexgray/adium.git","svn_url":"https://github.com/mralexgray/adium","archived":false,"disabled":false,"has_wiki":false,"homepage":null,"html_url":"https://github.com/mralexgray/adium","keys_url":"https://api.github.com/repos/mralexgray/adium/keys{/key_id}","language":"Objective-C","tags_url":"https://api.github.com/repos/mralexgray/adium/tags","watchers":0,"blobs_url":"https://api.github.com/repos/mralexgray/adium/git/blobs{/sha}","clone_url":"https://github.com/mralexgray/adium.git","forks_url":"https://api.github.com/repos/mralexgray/adium/forks","full_name":"mralexgray/adium","has_pages":false,"hooks_url":"https://api.github.com/repos/mralexgray/adium/hooks","pulls_url":"https://api.github.com/repos/mralexgray/adium/pulls{/number}","pushed_at":"2013-04-26T16:43:53Z","teams_url":"https://api.github.com/repos/mralexgray/adium/teams","trees_url":"https://api.github.com/repos/mralexgray/adium/git/trees{/sha}","created_at":"2013-04-27T14:59:33Z","events_url":"https://api.github.com/repos/mralexgray/adium/events","has_issues":false,"issues_url":"https://api.github.com/repos/mralexgray/adium/issues{/number}","labels_url":"https://api.github.com/repos/mralexgray/adium/labels{/name}","merges_url":"https://api.github.com/repos/mralexgray/adium/merges","mirror_url":null,"updated_at":"2019-12-11T06:51:45Z","visibility":"public","archive_url":"https://api.github.com/repos/mralexgray/adium/{archive_format}{/ref}","commits_url":"https://api.github.com/repos/mralexgray/adium/commits{/sha}","compare_url":"https://api.github.com/repos/mralexgray/adium/compare/{base}...{head}","description":"Official mirror of hg.adium.im","forks_count":37,"is_template":false,"open_issues":0,"branches_url":"https://api.github.com/repos/mralexgray/adium/branches{/branch}","comments_url":"https://api.github.com/repos/mralexgray/adium/comments{/number}","contents_url":"https://api.github.com/repos/mralexgray/adium/contents/{+path}","git_refs_url":"https://api.github.com/repos/mralexgray/adium/git/refs{/sha}","git_tags_url":"https://api.github.com/repos/mralexgray/adium/git/tags{/sha}","has_projects":true,"releases_url":"https://api.github.com/repos/mralexgray/adium/releases{/id}","statuses_url":"https://api.github.com/repos/mralexgray/adium/statuses/{sha}","allow_forking":true,"assignees_url":"https://api.github.com/repos/mralexgray/adium/assignees{/user}","downloads_url":"https://api.github.com/repos/mralexgray/adium/downloads","has_downloads":true,"languages_url":"https://api.github.com/repos/mralexgray/adium/languages","default_branch":"master","milestones_url":"https://api.github.com/repos/mralexgray/adium/milestones{/number}","stargazers_url":"https://api.github.com/repos/mralexgray/adium/stargazers","watchers_count":0,"deployments_url":"https://api.github.com/repos/mralexgray/adium/deployments","git_commits_url":"https://api.github.com/repos/mralexgray/adium/git/commits{/sha}","subscribers_url":"https://api.github.com/repos/mralexgray/adium/subscribers","contributors_url":"https://api.github.com/repos/mralexgray/adium/contributors","issue_events_url":"https://api.github.com/repos/mralexgray/adium/issues/events{/number}","stargazers_count":0,"subscription_url":"https://api.github.com/repos/mralexgray/adium/subscription","collaborators_url":"https://api.github.com/repos/mralexgray/adium/collaborators{/collaborator}","issue_comment_url":"https://api.github.com/repos/mralexgray/adium/issues/comments{/number}","notifications_url":"https://api.github.com/repos/mralexgray/adium/notifications{?since,all,participating}","open_issues_count":0,"web_commit_signoff_required":false},{"id":12752329,"url":"https://api.github.com/repos/mralexgray/ADLivelyTableView","fork":true,"name":"ADLivelyTableView","size":73,"forks":0,"owner":{"id":262517,"url":"https://api.github.com/users/mralexgray","type":"User","login":"mralexgray","node_id":"MDQ6VXNlcjI2MjUxNw==","html_url":"https://github.com/mralexgray","gists_url":"https://api.github.com/users/mralexgray/gists{/gist_id}","repos_url":"https://api.github.com/users/mralexgray/repos","avatar_url":"https://avatars.githubusercontent.com/u/262517?v=4","events_url":"https://api.github.com/users/mralexgray/events{/privacy}","site_admin":false,"gravatar_id":"","starred_url":"https://api.github.com/users/mralexgray/starred{/owner}{/repo}","followers_url":"https://api.github.com/users/mralexgray/followers","following_url":"https://api.github.com/users/mralexgray/following{/other_user}","organizations_url":"https://api.github.com/users/mralexgray/orgs","subscriptions_url":"https://api.github.com/users/mralexgray/subscriptions","received_events_url":"https://api.github.com/users/mralexgray/received_events"},"topics":[],"git_url":"git://github.com/mralexgray/ADLivelyTableView.git","license":{"key":"other","url":null,"name":"Other","node_id":"MDc6TGljZW5zZTA=","spdx_id":"NOASSERTION"},"node_id":"MDEwOlJlcG9zaXRvcnkxMjc1MjMyOQ==","private":false,"ssh_url":"git@github.com:mralexgray/ADLivelyTableView.git","svn_url":"https://github.com/mralexgray/ADLivelyTableView","archived":false,"disabled":false,"has_wiki":true,"homepage":"http://applidium.com/en/news/lively_uitableview/","html_url":"https://github.com/mralexgray/ADLivelyTableView","keys_url":"https://api.github.com/repos/mralexgray/ADLivelyTableView/keys{/key_id}","language":"Objective-C","tags_url":"https://api.github.com/repos/mralexgray/ADLivelyTableView/tags","watchers":0,"blobs_url":"https://api.github.com/repos/mralexgray/ADLivelyTableView/git/blobs{/sha}","clone_url":"https://github.com/mralexgray/ADLivelyTableView.git","forks_url":"https://api.github.com/repos/mralexgray/ADLivelyTableView/forks","full_name":"mralexgray/ADLivelyTableView","has_pages":false,"hooks_url":"https://api.github.com/repos/mralexgray/ADLivelyTableView/hooks","pulls_url":"https://api.github.com/repos/mralexgray/ADLivelyTableView/pulls{/number}","pushed_at":"2012-05-10T10:40:15Z","teams_url":"https://api.github.com/repos/mralexgray/ADLivelyTableView/teams","trees_url":"https://api.github.com/repos/mralexgray/ADLivelyTableView/git/trees{/sha}","created_at":"2013-09-11T09:18:01Z","events_url":"https://api.github.com/repos/mralexgray/ADLivelyTableView/events","has_issues":false,"issues_url":"https://api.github.com/repos/mralexgray/ADLivelyTableView/issues{/number}","labels_url":"https://api.github.com/repos/mralexgray/ADLivelyTableView/labels{/name}","merges_url":"https://api.github.com/repos/mralexgray/ADLivelyTableView/merges","mirror_url":null,"updated_at":"2013-09-11T09:18:03Z","visibility":"public","archive_url":"https://api.github.com/repos/mralexgray/ADLivelyTableView/{archive_format}{/ref}","commits_url":"https://api.github.com/repos/mralexgray/ADLivelyTableView/commits{/sha}","compare_url":"https://api.github.com/repos/mralexgray/ADLivelyTableView/compare/{base}...{head}","description":"Lively UITableView","forks_count":0,"is_template":false,"open_issues":0,"branches_url":"https://api.github.com/repos/mralexgray/ADLivelyTableView/branches{/branch}","comments_url":"https://api.github.com/repos/mralexgray/ADLivelyTableView/comments{/number}","contents_url":"https://api.github.com/repos/mralexgray/ADLivelyTableView/contents/{+path}","git_refs_url":"https://api.github.com/repos/mralexgray/ADLivelyTableView/git/refs{/sha}","git_tags_url":"https://api.github.com/repos/mralexgray/ADLivelyTableView/git/tags{/sha}","has_projects":true,"releases_url":"https://api.github.com/repos/mralexgray/ADLivelyTableView/releases{/id}","statuses_url":"https://api.github.com/repos/mralexgray/ADLivelyTableView/statuses/{sha}","allow_forking":true,"assignees_url":"https://api.github.com/repos/mralexgray/ADLivelyTableView/assignees{/user}","downloads_url":"https://api.github.com/repos/mralexgray/ADLivelyTableView/downloads","has_downloads":true,"languages_url":"https://api.github.com/repos/mralexgray/ADLivelyTableView/languages","default_branch":"master","milestones_url":"https://api.github.com/repos/mralexgray/ADLivelyTableView/milestones{/number}","stargazers_url":"https://api.github.com/repos/mralexgray/ADLivelyTableView/stargazers","watchers_count":0,"deployments_url":"https://api.github.com/repos/mralexgray/ADLivelyTableView/deployments","git_commits_url":"https://api.github.com/repos/mralexgray/ADLivelyTableView/git/commits{/sha}","subscribers_url":"https://api.github.com/repos/mralexgray/ADLivelyTableView/subscribers","contributors_url":"https://api.github.com/repos/mralexgray/ADLivelyTableView/contributors","issue_events_url":"https://api.github.com/repos/mralexgray/ADLivelyTableView/issues/events{/number}","stargazers_count":0,"subscription_url":"https://api.github.com/repos/mralexgray/ADLivelyTableView/subscription","collaborators_url":"https://api.github.com/repos/mralexgray/ADLivelyTableView/collaborators{/collaborator}","issue_comment_url":"https://api.github.com/repos/mralexgray/ADLivelyTableView/issues/comments{/number}","notifications_url":"https://api.github.com/repos/mralexgray/ADLivelyTableView/notifications{?since,all,participating}","open_issues_count":0,"web_commit_signoff_required":false},{"id":5697379,"url":"https://api.github.com/repos/mralexgray/AFIncrementalStore","fork":true,"name":"AFIncrementalStore","size":139,"forks":0,"owner":{"id":262517,"url":"https://api.github.com/users/mralexgray","type":"User","login":"mralexgray","node_id":"MDQ6VXNlcjI2MjUxNw==","html_url":"https://github.com/mralexgray","gists_url":"https://api.github.com/users/mralexgray/gists{/gist_id}","repos_url":"https://api.github.com/users/mralexgray/repos","avatar_url":"https://avatars.githubusercontent.com/u/262517?v=4","events_url":"https://api.github.com/users/mralexgray/events{/privacy}","site_admin":false,"gravatar_id":"","starred_url":"https://api.github.com/users/mralexgray/starred{/owner}{/repo}","followers_url":"https://api.github.com/users/mralexgray/followers","following_url":"https://api.github.com/users/mralexgray/following{/other_user}","organizations_url":"https://api.github.com/users/mralexgray/orgs","subscriptions_url":"https://api.github.com/users/mralexgray/subscriptions","received_events_url":"https://api.github.com/users/mralexgray/received_events"},"topics":[],"git_url":"git://github.com/mralexgray/AFIncrementalStore.git","license":{"key":"mit","url":"https://api.github.com/licenses/mit","name":"MIT License","node_id":"MDc6TGljZW5zZTEz","spdx_id":"MIT"},"node_id":"MDEwOlJlcG9zaXRvcnk1Njk3Mzc5","private":false,"ssh_url":"git@github.com:mralexgray/AFIncrementalStore.git","svn_url":"https://github.com/mralexgray/AFIncrementalStore","archived":false,"disabled":false,"has_wiki":true,"homepage":null,"html_url":"https://github.com/mralexgray/AFIncrementalStore","keys_url":"https://api.github.com/repos/mralexgray/AFIncrementalStore/keys{/key_id}","language":"Objective-C","tags_url":"https://api.github.com/repos/mralexgray/AFIncrementalStore/tags","watchers":0,"blobs_url":"https://api.github.com/repos/mralexgray/AFIncrementalStore/git/blobs{/sha}","clone_url":"https://github.com/mralexgray/AFIncrementalStore.git","forks_url":"https://api.github.com/repos/mralexgray/AFIncrementalStore/forks","full_name":"mralexgray/AFIncrementalStore","has_pages":false,"hooks_url":"https://api.github.com/repos/mralexgray/AFIncrementalStore/hooks","pulls_url":"https://api.github.com/repos/mralexgray/AFIncrementalStore/pulls{/number}","pushed_at":"2012-09-01T22:46:25Z","teams_url":"https://api.github.com/repos/mralexgray/AFIncrementalStore/teams","trees_url":"https://api.github.com/repos/mralexgray/AFIncrementalStore/git/trees{/sha}","created_at":"2012-09-06T04:20:33Z","events_url":"https://api.github.com/repos/mralexgray/AFIncrementalStore/events","has_issues":false,"issues_url":"https://api.github.com/repos/mralexgray/AFIncrementalStore/issues{/number}","labels_url":"https://api.github.com/repos/mralexgray/AFIncrementalStore/labels{/name}","merges_url":"https://api.github.com/repos/mralexgray/AFIncrementalStore/merges","mirror_url":null,"updated_at":"2013-01-12T03:15:29Z","visibility":"public","archive_url":"https://api.github.com/repos/mralexgray/AFIncrementalStore/{archive_format}{/ref}","commits_url":"https://api.github.com/repos/mralexgray/AFIncrementalStore/commits{/sha}","compare_url":"https://api.github.com/repos/mralexgray/AFIncrementalStore/compare/{base}...{head}","description":"Core Data Persistence with AFNetworking, Done Right","forks_count":0,"is_template":false,"open_issues":0,"branches_url":"https://api.github.com/repos/mralexgray/AFIncrementalStore/branches{/branch}","comments_url":"https://api.github.com/repos/mralexgray/AFIncrementalStore/comments{/number}","contents_url":"https://api.github.com/repos/mralexgray/AFIncrementalStore/contents/{+path}","git_refs_url":"https://api.github.com/repos/mralexgray/AFIncrementalStore/git/refs{/sha}","git_tags_url":"https://api.github.com/repos/mralexgray/AFIncrementalStore/git/tags{/sha}","has_projects":true,"releases_url":"https://api.github.com/repos/mralexgray/AFIncrementalStore/releases{/id}","statuses_url":"https://api.github.com/repos/mralexgray/AFIncrementalStore/statuses/{sha}","allow_forking":true,"assignees_url":"https://api.github.com/repos/mralexgray/AFIncrementalStore/assignees{/user}","downloads_url":"https://api.github.com/repos/mralexgray/AFIncrementalStore/downloads","has_downloads":true,"languages_url":"https://api.github.com/repos/mralexgray/AFIncrementalStore/languages","default_branch":"master","milestones_url":"https://api.github.com/repos/mralexgray/AFIncrementalStore/milestones{/number}","stargazers_url":"https://api.github.com/repos/mralexgray/AFIncrementalStore/stargazers","watchers_count":0,"deployments_url":"https://api.github.com/repos/mralexgray/AFIncrementalStore/deployments","git_commits_url":"https://api.github.com/repos/mralexgray/AFIncrementalStore/git/commits{/sha}","subscribers_url":"https://api.github.com/repos/mralexgray/AFIncrementalStore/subscribers","contributors_url":"https://api.github.com/repos/mralexgray/AFIncrementalStore/contributors","issue_events_url":"https://api.github.com/repos/mralexgray/AFIncrementalStore/issues/events{/number}","stargazers_count":0,"subscription_url":"https://api.github.com/repos/mralexgray/AFIncrementalStore/subscription","collaborators_url":"https://api.github.com/repos/mralexgray/AFIncrementalStore/collaborators{/collaborator}","issue_comment_url":"https://api.github.com/repos/mralexgray/AFIncrementalStore/issues/comments{/number}","notifications_url":"https://api.github.com/repos/mralexgray/AFIncrementalStore/notifications{?since,all,participating}","open_issues_count":0,"web_commit_signoff_required":false},{"id":6969621,"url":"https://api.github.com/repos/mralexgray/AFNetworking","fork":true,"name":"AFNetworking","size":4341,"forks":0,"owner":{"id":262517,"url":"https://api.github.com/users/mralexgray","type":"User","login":"mralexgray","node_id":"MDQ6VXNlcjI2MjUxNw==","html_url":"https://github.com/mralexgray","gists_url":"https://api.github.com/users/mralexgray/gists{/gist_id}","repos_url":"https://api.github.com/users/mralexgray/repos","avatar_url":"https://avatars.githubusercontent.com/u/262517?v=4","events_url":"https://api.github.com/users/mralexgray/events{/privacy}","site_admin":false,"gravatar_id":"","starred_url":"https://api.github.com/users/mralexgray/starred{/owner}{/repo}","followers_url":"https://api.github.com/users/mralexgray/followers","following_url":"https://api.github.com/users/mralexgray/following{/other_user}","organizations_url":"https://api.github.com/users/mralexgray/orgs","subscriptions_url":"https://api.github.com/users/mralexgray/subscriptions","received_events_url":"https://api.github.com/users/mralexgray/received_events"},"topics":[],"git_url":"git://github.com/mralexgray/AFNetworking.git","license":{"key":"mit","url":"https://api.github.com/licenses/mit","name":"MIT License","node_id":"MDc6TGljZW5zZTEz","spdx_id":"MIT"},"node_id":"MDEwOlJlcG9zaXRvcnk2OTY5NjIx","private":false,"ssh_url":"git@github.com:mralexgray/AFNetworking.git","svn_url":"https://github.com/mralexgray/AFNetworking","archived":false,"disabled":false,"has_wiki":true,"homepage":"http://afnetworking.com","html_url":"https://github.com/mralexgray/AFNetworking","keys_url":"https://api.github.com/repos/mralexgray/AFNetworking/keys{/key_id}","language":"Objective-C","tags_url":"https://api.github.com/repos/mralexgray/AFNetworking/tags","watchers":2,"blobs_url":"https://api.github.com/repos/mralexgray/AFNetworking/git/blobs{/sha}","clone_url":"https://github.com/mralexgray/AFNetworking.git","forks_url":"https://api.github.com/repos/mralexgray/AFNetworking/forks","full_name":"mralexgray/AFNetworking","has_pages":false,"hooks_url":"https://api.github.com/repos/mralexgray/AFNetworking/hooks","pulls_url":"https://api.github.com/repos/mralexgray/AFNetworking/pulls{/number}","pushed_at":"2014-01-24T07:14:32Z","teams_url":"https://api.github.com/repos/mralexgray/AFNetworking/teams","trees_url":"https://api.github.com/repos/mralexgray/AFNetworking/git/trees{/sha}","created_at":"2012-12-02T17:00:04Z","events_url":"https://api.github.com/repos/mralexgray/AFNetworking/events","has_issues":false,"issues_url":"https://api.github.com/repos/mralexgray/AFNetworking/issues{/number}","labels_url":"https://api.github.com/repos/mralexgray/AFNetworking/labels{/name}","merges_url":"https://api.github.com/repos/mralexgray/AFNetworking/merges","mirror_url":null,"updated_at":"2014-01-24T07:14:33Z","visibility":"public","archive_url":"https://api.github.com/repos/mralexgray/AFNetworking/{archive_format}{/ref}","commits_url":"https://api.github.com/repos/mralexgray/AFNetworking/commits{/sha}","compare_url":"https://api.github.com/repos/mralexgray/AFNetworking/compare/{base}...{head}","description":"A delightful iOS and OS X networking framework","forks_count":0,"is_template":false,"open_issues":0,"branches_url":"https://api.github.com/repos/mralexgray/AFNetworking/branches{/branch}","comments_url":"https://api.github.com/repos/mralexgray/AFNetworking/comments{/number}","contents_url":"https://api.github.com/repos/mralexgray/AFNetworking/contents/{+path}","git_refs_url":"https://api.github.com/repos/mralexgray/AFNetworking/git/refs{/sha}","git_tags_url":"https://api.github.com/repos/mralexgray/AFNetworking/git/tags{/sha}","has_projects":true,"releases_url":"https://api.github.com/repos/mralexgray/AFNetworking/releases{/id}","statuses_url":"https://api.github.com/repos/mralexgray/AFNetworking/statuses/{sha}","allow_forking":true,"assignees_url":"https://api.github.com/repos/mralexgray/AFNetworking/assignees{/user}","downloads_url":"https://api.github.com/repos/mralexgray/AFNetworking/downloads","has_downloads":true,"languages_url":"https://api.github.com/repos/mralexgray/AFNetworking/languages","default_branch":"master","milestones_url":"https://api.github.com/repos/mralexgray/AFNetworking/milestones{/number}","stargazers_url":"https://api.github.com/repos/mralexgray/AFNetworking/stargazers","watchers_count":2,"deployments_url":"https://api.github.com/repos/mralexgray/AFNetworking/deployments","git_commits_url":"https://api.github.com/repos/mralexgray/AFNetworking/git/commits{/sha}","subscribers_url":"https://api.github.com/repos/mralexgray/AFNetworking/subscribers","contributors_url":"https://api.github.com/repos/mralexgray/AFNetworking/contributors","issue_events_url":"https://api.github.com/repos/mralexgray/AFNetworking/issues/events{/number}","stargazers_count":2,"subscription_url":"https://api.github.com/repos/mralexgray/AFNetworking/subscription","collaborators_url":"https://api.github.com/repos/mralexgray/AFNetworking/collaborators{/collaborator}","issue_comment_url":"https://api.github.com/repos/mralexgray/AFNetworking/issues/comments{/number}","notifications_url":"https://api.github.com/repos/mralexgray/AFNetworking/notifications{?since,all,participating}","open_issues_count":0,"web_commit_signoff_required":false},{"id":9485541,"url":"https://api.github.com/repos/mralexgray/AGNSSplitView","fork":true,"name":"AGNSSplitView","size":68,"forks":0,"owner":{"id":262517,"url":"https://api.github.com/users/mralexgray","type":"User","login":"mralexgray","node_id":"MDQ6VXNlcjI2MjUxNw==","html_url":"https://github.com/mralexgray","gists_url":"https://api.github.com/users/mralexgray/gists{/gist_id}","repos_url":"https://api.github.com/users/mralexgray/repos","avatar_url":"https://avatars.githubusercontent.com/u/262517?v=4","events_url":"https://api.github.com/users/mralexgray/events{/privacy}","site_admin":false,"gravatar_id":"","starred_url":"https://api.github.com/users/mralexgray/starred{/owner}{/repo}","followers_url":"https://api.github.com/users/mralexgray/followers","following_url":"https://api.github.com/users/mralexgray/following{/other_user}","organizations_url":"https://api.github.com/users/mralexgray/orgs","subscriptions_url":"https://api.github.com/users/mralexgray/subscriptions","received_events_url":"https://api.github.com/users/mralexgray/received_events"},"topics":[],"git_url":"git://github.com/mralexgray/AGNSSplitView.git","license":null,"node_id":"MDEwOlJlcG9zaXRvcnk5NDg1NTQx","private":false,"ssh_url":"git@github.com:mralexgray/AGNSSplitView.git","svn_url":"https://github.com/mralexgray/AGNSSplitView","archived":false,"disabled":false,"has_wiki":true,"homepage":null,"html_url":"https://github.com/mralexgray/AGNSSplitView","keys_url":"https://api.github.com/repos/mralexgray/AGNSSplitView/keys{/key_id}","language":"Objective-C","tags_url":"https://api.github.com/repos/mralexgray/AGNSSplitView/tags","watchers":0,"blobs_url":"https://api.github.com/repos/mralexgray/AGNSSplitView/git/blobs{/sha}","clone_url":"https://github.com/mralexgray/AGNSSplitView.git","forks_url":"https://api.github.com/repos/mralexgray/AGNSSplitView/forks","full_name":"mralexgray/AGNSSplitView","has_pages":false,"hooks_url":"https://api.github.com/repos/mralexgray/AGNSSplitView/hooks","pulls_url":"https://api.github.com/repos/mralexgray/AGNSSplitView/pulls{/number}","pushed_at":"2013-02-26T00:32:32Z","teams_url":"https://api.github.com/repos/mralexgray/AGNSSplitView/teams","trees_url":"https://api.github.com/repos/mralexgray/AGNSSplitView/git/trees{/sha}","created_at":"2013-04-17T00:10:13Z","events_url":"https://api.github.com/repos/mralexgray/AGNSSplitView/events","has_issues":false,"issues_url":"https://api.github.com/repos/mralexgray/AGNSSplitView/issues{/number}","labels_url":"https://api.github.com/repos/mralexgray/AGNSSplitView/labels{/name}","merges_url":"https://api.github.com/repos/mralexgray/AGNSSplitView/merges","mirror_url":null,"updated_at":"2013-04-17T00:10:13Z","visibility":"public","archive_url":"https://api.github.com/repos/mralexgray/AGNSSplitView/{archive_format}{/ref}","commits_url":"https://api.github.com/repos/mralexgray/AGNSSplitView/commits{/sha}","compare_url":"https://api.github.com/repos/mralexgray/AGNSSplitView/compare/{base}...{head}","description":"Simple NSSplitView additions.","forks_count":0,"is_template":false,"open_issues":0,"branches_url":"https://api.github.com/repos/mralexgray/AGNSSplitView/branches{/branch}","comments_url":"https://api.github.com/repos/mralexgray/AGNSSplitView/comments{/number}","contents_url":"https://api.github.com/repos/mralexgray/AGNSSplitView/contents/{+path}","git_refs_url":"https://api.github.com/repos/mralexgray/AGNSSplitView/git/refs{/sha}","git_tags_url":"https://api.github.com/repos/mralexgray/AGNSSplitView/git/tags{/sha}","has_projects":true,"releases_url":"https://api.github.com/repos/mralexgray/AGNSSplitView/releases{/id}","statuses_url":"https://api.github.com/repos/mralexgray/AGNSSplitView/statuses/{sha}","allow_forking":true,"assignees_url":"https://api.github.com/repos/mralexgray/AGNSSplitView/assignees{/user}","downloads_url":"https://api.github.com/repos/mralexgray/AGNSSplitView/downloads","has_downloads":true,"languages_url":"https://api.github.com/repos/mralexgray/AGNSSplitView/languages","default_branch":"master","milestones_url":"https://api.github.com/repos/mralexgray/AGNSSplitView/milestones{/number}","stargazers_url":"https://api.github.com/repos/mralexgray/AGNSSplitView/stargazers","watchers_count":0,"deployments_url":"https://api.github.com/repos/mralexgray/AGNSSplitView/deployments","git_commits_url":"https://api.github.com/repos/mralexgray/AGNSSplitView/git/commits{/sha}","subscribers_url":"https://api.github.com/repos/mralexgray/AGNSSplitView/subscribers","contributors_url":"https://api.github.com/repos/mralexgray/AGNSSplitView/contributors","issue_events_url":"https://api.github.com/repos/mralexgray/AGNSSplitView/issues/events{/number}","stargazers_count":0,"subscription_url":"https://api.github.com/repos/mralexgray/AGNSSplitView/subscription","collaborators_url":"https://api.github.com/repos/mralexgray/AGNSSplitView/collaborators{/collaborator}","issue_comment_url":"https://api.github.com/repos/mralexgray/AGNSSplitView/issues/comments{/number}","notifications_url":"https://api.github.com/repos/mralexgray/AGNSSplitView/notifications{?since,all,participating}","open_issues_count":0,"web_commit_signoff_required":false},{"id":12767784,"url":"https://api.github.com/repos/mralexgray/AGScopeBar","fork":true,"name":"AGScopeBar","size":64,"forks":0,"owner":{"id":262517,"url":"https://api.github.com/users/mralexgray","type":"User","login":"mralexgray","node_id":"MDQ6VXNlcjI2MjUxNw==","html_url":"https://github.com/mralexgray","gists_url":"https://api.github.com/users/mralexgray/gists{/gist_id}","repos_url":"https://api.github.com/users/mralexgray/repos","avatar_url":"https://avatars.githubusercontent.com/u/262517?v=4","events_url":"https://api.github.com/users/mralexgray/events{/privacy}","site_admin":false,"gravatar_id":"","starred_url":"https://api.github.com/users/mralexgray/starred{/owner}{/repo}","followers_url":"https://api.github.com/users/mralexgray/followers","following_url":"https://api.github.com/users/mralexgray/following{/other_user}","organizations_url":"https://api.github.com/users/mralexgray/orgs","subscriptions_url":"https://api.github.com/users/mralexgray/subscriptions","received_events_url":"https://api.github.com/users/mralexgray/received_events"},"topics":[],"git_url":"git://github.com/mralexgray/AGScopeBar.git","license":null,"node_id":"MDEwOlJlcG9zaXRvcnkxMjc2Nzc4NA==","private":false,"ssh_url":"git@github.com:mralexgray/AGScopeBar.git","svn_url":"https://github.com/mralexgray/AGScopeBar","archived":false,"disabled":false,"has_wiki":true,"homepage":null,"html_url":"https://github.com/mralexgray/AGScopeBar","keys_url":"https://api.github.com/repos/mralexgray/AGScopeBar/keys{/key_id}","language":"Objective-C","tags_url":"https://api.github.com/repos/mralexgray/AGScopeBar/tags","watchers":0,"blobs_url":"https://api.github.com/repos/mralexgray/AGScopeBar/git/blobs{/sha}","clone_url":"https://github.com/mralexgray/AGScopeBar.git","forks_url":"https://api.github.com/repos/mralexgray/AGScopeBar/forks","full_name":"mralexgray/AGScopeBar","has_pages":false,"hooks_url":"https://api.github.com/repos/mralexgray/AGScopeBar/hooks","pulls_url":"https://api.github.com/repos/mralexgray/AGScopeBar/pulls{/number}","pushed_at":"2013-05-07T03:35:29Z","teams_url":"https://api.github.com/repos/mralexgray/AGScopeBar/teams","trees_url":"https://api.github.com/repos/mralexgray/AGScopeBar/git/trees{/sha}","created_at":"2013-09-11T21:06:54Z","events_url":"https://api.github.com/repos/mralexgray/AGScopeBar/events","has_issues":false,"issues_url":"https://api.github.com/repos/mralexgray/AGScopeBar/issues{/number}","labels_url":"https://api.github.com/repos/mralexgray/AGScopeBar/labels{/name}","merges_url":"https://api.github.com/repos/mralexgray/AGScopeBar/merges","mirror_url":null,"updated_at":"2013-09-11T21:06:54Z","visibility":"public","archive_url":"https://api.github.com/repos/mralexgray/AGScopeBar/{archive_format}{/ref}","commits_url":"https://api.github.com/repos/mralexgray/AGScopeBar/commits{/sha}","compare_url":"https://api.github.com/repos/mralexgray/AGScopeBar/compare/{base}...{head}","description":"Custom scope bar implementation for Cocoa","forks_count":0,"is_template":false,"open_issues":0,"branches_url":"https://api.github.com/repos/mralexgray/AGScopeBar/branches{/branch}","comments_url":"https://api.github.com/repos/mralexgray/AGScopeBar/comments{/number}","contents_url":"https://api.github.com/repos/mralexgray/AGScopeBar/contents/{+path}","git_refs_url":"https://api.github.com/repos/mralexgray/AGScopeBar/git/refs{/sha}","git_tags_url":"https://api.github.com/repos/mralexgray/AGScopeBar/git/tags{/sha}","has_projects":true,"releases_url":"https://api.github.com/repos/mralexgray/AGScopeBar/releases{/id}","statuses_url":"https://api.github.com/repos/mralexgray/AGScopeBar/statuses/{sha}","allow_forking":true,"assignees_url":"https://api.github.com/repos/mralexgray/AGScopeBar/assignees{/user}","downloads_url":"https://api.github.com/repos/mralexgray/AGScopeBar/downloads","has_downloads":true,"languages_url":"https://api.github.com/repos/mralexgray/AGScopeBar/languages","default_branch":"master","milestones_url":"https://api.github.com/repos/mralexgray/AGScopeBar/milestones{/number}","stargazers_url":"https://api.github.com/repos/mralexgray/AGScopeBar/stargazers","watchers_count":0,"deployments_url":"https://api.github.com/repos/mralexgray/AGScopeBar/deployments","git_commits_url":"https://api.github.com/repos/mralexgray/AGScopeBar/git/commits{/sha}","subscribers_url":"https://api.github.com/repos/mralexgray/AGScopeBar/subscribers","contributors_url":"https://api.github.com/repos/mralexgray/AGScopeBar/contributors","issue_events_url":"https://api.github.com/repos/mralexgray/AGScopeBar/issues/events{/number}","stargazers_count":0,"subscription_url":"https://api.github.com/repos/mralexgray/AGScopeBar/subscription","collaborators_url":"https://api.github.com/repos/mralexgray/AGScopeBar/collaborators{/collaborator}","issue_comment_url":"https://api.github.com/repos/mralexgray/AGScopeBar/issues/comments{/number}","notifications_url":"https://api.github.com/repos/mralexgray/AGScopeBar/notifications{?since,all,participating}","open_issues_count":0,"web_commit_signoff_required":false},{"id":31829499,"url":"https://api.github.com/repos/mralexgray/agvtool-xcode-plugin","fork":true,"name":"agvtool-xcode-plugin","size":102,"forks":0,"owner":{"id":262517,"url":"https://api.github.com/users/mralexgray","type":"User","login":"mralexgray","node_id":"MDQ6VXNlcjI2MjUxNw==","html_url":"https://github.com/mralexgray","gists_url":"https://api.github.com/users/mralexgray/gists{/gist_id}","repos_url":"https://api.github.com/users/mralexgray/repos","avatar_url":"https://avatars.githubusercontent.com/u/262517?v=4","events_url":"https://api.github.com/users/mralexgray/events{/privacy}","site_admin":false,"gravatar_id":"","starred_url":"https://api.github.com/users/mralexgray/starred{/owner}{/repo}","followers_url":"https://api.github.com/users/mralexgray/followers","following_url":"https://api.github.com/users/mralexgray/following{/other_user}","organizations_url":"https://api.github.com/users/mralexgray/orgs","subscriptions_url":"https://api.github.com/users/mralexgray/subscriptions","received_events_url":"https://api.github.com/users/mralexgray/received_events"},"topics":[],"git_url":"git://github.com/mralexgray/agvtool-xcode-plugin.git","license":null,"node_id":"MDEwOlJlcG9zaXRvcnkzMTgyOTQ5OQ==","private":false,"ssh_url":"git@github.com:mralexgray/agvtool-xcode-plugin.git","svn_url":"https://github.com/mralexgray/agvtool-xcode-plugin","archived":false,"disabled":false,"has_wiki":true,"homepage":null,"html_url":"https://github.com/mralexgray/agvtool-xcode-plugin","keys_url":"https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/keys{/key_id}","language":"Objective-C","tags_url":"https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/tags","watchers":0,"blobs_url":"https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/git/blobs{/sha}","clone_url":"https://github.com/mralexgray/agvtool-xcode-plugin.git","forks_url":"https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/forks","full_name":"mralexgray/agvtool-xcode-plugin","has_pages":false,"hooks_url":"https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/hooks","pulls_url":"https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/pulls{/number}","pushed_at":"2015-03-08T00:04:31Z","teams_url":"https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/teams","trees_url":"https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/git/trees{/sha}","created_at":"2015-03-07T22:15:38Z","events_url":"https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/events","has_issues":false,"issues_url":"https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/issues{/number}","labels_url":"https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/labels{/name}","merges_url":"https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/merges","mirror_url":null,"updated_at":"2015-03-07T22:15:41Z","visibility":"public","archive_url":"https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/{archive_format}{/ref}","commits_url":"https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/commits{/sha}","compare_url":"https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/compare/{base}...{head}","description":"this is a plugin wrapper for agvtool for xcode.","forks_count":0,"is_template":false,"open_issues":0,"branches_url":"https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/branches{/branch}","comments_url":"https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/comments{/number}","contents_url":"https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/contents/{+path}","git_refs_url":"https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/git/refs{/sha}","git_tags_url":"https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/git/tags{/sha}","has_projects":true,"releases_url":"https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/releases{/id}","statuses_url":"https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/statuses/{sha}","allow_forking":true,"assignees_url":"https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/assignees{/user}","downloads_url":"https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/downloads","has_downloads":true,"languages_url":"https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/languages","default_branch":"master","milestones_url":"https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/milestones{/number}","stargazers_url":"https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/stargazers","watchers_count":0,"deployments_url":"https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/deployments","git_commits_url":"https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/git/commits{/sha}","subscribers_url":"https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/subscribers","contributors_url":"https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/contributors","issue_events_url":"https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/issues/events{/number}","stargazers_count":0,"subscription_url":"https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/subscription","collaborators_url":"https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/collaborators{/collaborator}","issue_comment_url":"https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/issues/comments{/number}","notifications_url":"https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/notifications{?since,all,participating}","open_issues_count":0,"web_commit_signoff_required":false},{"id":9227846,"url":"https://api.github.com/repos/mralexgray/AHContentBrowser","fork":true,"name":"AHContentBrowser","size":223,"forks":0,"owner":{"id":262517,"url":"https://api.github.com/users/mralexgray","type":"User","login":"mralexgray","node_id":"MDQ6VXNlcjI2MjUxNw==","html_url":"https://github.com/mralexgray","gists_url":"https://api.github.com/users/mralexgray/gists{/gist_id}","repos_url":"https://api.github.com/users/mralexgray/repos","avatar_url":"https://avatars.githubusercontent.com/u/262517?v=4","events_url":"https://api.github.com/users/mralexgray/events{/privacy}","site_admin":false,"gravatar_id":"","starred_url":"https://api.github.com/users/mralexgray/starred{/owner}{/repo}","followers_url":"https://api.github.com/users/mralexgray/followers","following_url":"https://api.github.com/users/mralexgray/following{/other_user}","organizations_url":"https://api.github.com/users/mralexgray/orgs","subscriptions_url":"https://api.github.com/users/mralexgray/subscriptions","received_events_url":"https://api.github.com/users/mralexgray/received_events"},"topics":[],"git_url":"git://github.com/mralexgray/AHContentBrowser.git","license":null,"node_id":"MDEwOlJlcG9zaXRvcnk5MjI3ODQ2","private":false,"ssh_url":"git@github.com:mralexgray/AHContentBrowser.git","svn_url":"https://github.com/mralexgray/AHContentBrowser","archived":false,"disabled":false,"has_wiki":true,"homepage":"","html_url":"https://github.com/mralexgray/AHContentBrowser","keys_url":"https://api.github.com/repos/mralexgray/AHContentBrowser/keys{/key_id}","language":"Objective-C","tags_url":"https://api.github.com/repos/mralexgray/AHContentBrowser/tags","watchers":0,"blobs_url":"https://api.github.com/repos/mralexgray/AHContentBrowser/git/blobs{/sha}","clone_url":"https://github.com/mralexgray/AHContentBrowser.git","forks_url":"https://api.github.com/repos/mralexgray/AHContentBrowser/forks","full_name":"mralexgray/AHContentBrowser","has_pages":false,"hooks_url":"https://api.github.com/repos/mralexgray/AHContentBrowser/hooks","pulls_url":"https://api.github.com/repos/mralexgray/AHContentBrowser/pulls{/number}","pushed_at":"2013-03-13T17:38:23Z","teams_url":"https://api.github.com/repos/mralexgray/AHContentBrowser/teams","trees_url":"https://api.github.com/repos/mralexgray/AHContentBrowser/git/trees{/sha}","created_at":"2013-04-04T20:56:16Z","events_url":"https://api.github.com/repos/mralexgray/AHContentBrowser/events","has_issues":false,"issues_url":"https://api.github.com/repos/mralexgray/AHContentBrowser/issues{/number}","labels_url":"https://api.github.com/repos/mralexgray/AHContentBrowser/labels{/name}","merges_url":"https://api.github.com/repos/mralexgray/AHContentBrowser/merges","mirror_url":null,"updated_at":"2015-10-22T05:00:24Z","visibility":"public","archive_url":"https://api.github.com/repos/mralexgray/AHContentBrowser/{archive_format}{/ref}","commits_url":"https://api.github.com/repos/mralexgray/AHContentBrowser/commits{/sha}","compare_url":"https://api.github.com/repos/mralexgray/AHContentBrowser/compare/{base}...{head}","description":"A Mac only webview that loads a fast readable version of the website if available.","forks_count":0,"is_template":false,"open_issues":0,"branches_url":"https://api.github.com/repos/mralexgray/AHContentBrowser/branches{/branch}","comments_url":"https://api.github.com/repos/mralexgray/AHContentBrowser/comments{/number}","contents_url":"https://api.github.com/repos/mralexgray/AHContentBrowser/contents/{+path}","git_refs_url":"https://api.github.com/repos/mralexgray/AHContentBrowser/git/refs{/sha}","git_tags_url":"https://api.github.com/repos/mralexgray/AHContentBrowser/git/tags{/sha}","has_projects":true,"releases_url":"https://api.github.com/repos/mralexgray/AHContentBrowser/releases{/id}","statuses_url":"https://api.github.com/repos/mralexgray/AHContentBrowser/statuses/{sha}","allow_forking":true,"assignees_url":"https://api.github.com/repos/mralexgray/AHContentBrowser/assignees{/user}","downloads_url":"https://api.github.com/repos/mralexgray/AHContentBrowser/downloads","has_downloads":true,"languages_url":"https://api.github.com/repos/mralexgray/AHContentBrowser/languages","default_branch":"master","milestones_url":"https://api.github.com/repos/mralexgray/AHContentBrowser/milestones{/number}","stargazers_url":"https://api.github.com/repos/mralexgray/AHContentBrowser/stargazers","watchers_count":0,"deployments_url":"https://api.github.com/repos/mralexgray/AHContentBrowser/deployments","git_commits_url":"https://api.github.com/repos/mralexgray/AHContentBrowser/git/commits{/sha}","subscribers_url":"https://api.github.com/repos/mralexgray/AHContentBrowser/subscribers","contributors_url":"https://api.github.com/repos/mralexgray/AHContentBrowser/contributors","issue_events_url":"https://api.github.com/repos/mralexgray/AHContentBrowser/issues/events{/number}","stargazers_count":0,"subscription_url":"https://api.github.com/repos/mralexgray/AHContentBrowser/subscription","collaborators_url":"https://api.github.com/repos/mralexgray/AHContentBrowser/collaborators{/collaborator}","issue_comment_url":"https://api.github.com/repos/mralexgray/AHContentBrowser/issues/comments{/number}","notifications_url":"https://api.github.com/repos/mralexgray/AHContentBrowser/notifications{?since,all,participating}","open_issues_count":0,"web_commit_signoff_required":false},{"id":37430328,"url":"https://api.github.com/repos/mralexgray/AHLaunchCtl","fork":true,"name":"AHLaunchCtl","size":592,"forks":0,"owner":{"id":262517,"url":"https://api.github.com/users/mralexgray","type":"User","login":"mralexgray","node_id":"MDQ6VXNlcjI2MjUxNw==","html_url":"https://github.com/mralexgray","gists_url":"https://api.github.com/users/mralexgray/gists{/gist_id}","repos_url":"https://api.github.com/users/mralexgray/repos","avatar_url":"https://avatars.githubusercontent.com/u/262517?v=4","events_url":"https://api.github.com/users/mralexgray/events{/privacy}","site_admin":false,"gravatar_id":"","starred_url":"https://api.github.com/users/mralexgray/starred{/owner}{/repo}","followers_url":"https://api.github.com/users/mralexgray/followers","following_url":"https://api.github.com/users/mralexgray/following{/other_user}","organizations_url":"https://api.github.com/users/mralexgray/orgs","subscriptions_url":"https://api.github.com/users/mralexgray/subscriptions","received_events_url":"https://api.github.com/users/mralexgray/received_events"},"topics":[],"git_url":"git://github.com/mralexgray/AHLaunchCtl.git","license":{"key":"mit","url":"https://api.github.com/licenses/mit","name":"MIT License","node_id":"MDc6TGljZW5zZTEz","spdx_id":"MIT"},"node_id":"MDEwOlJlcG9zaXRvcnkzNzQzMDMyOA==","private":false,"ssh_url":"git@github.com:mralexgray/AHLaunchCtl.git","svn_url":"https://github.com/mralexgray/AHLaunchCtl","archived":false,"disabled":false,"has_wiki":true,"homepage":"","html_url":"https://github.com/mralexgray/AHLaunchCtl","keys_url":"https://api.github.com/repos/mralexgray/AHLaunchCtl/keys{/key_id}","language":"Objective-C","tags_url":"https://api.github.com/repos/mralexgray/AHLaunchCtl/tags","watchers":0,"blobs_url":"https://api.github.com/repos/mralexgray/AHLaunchCtl/git/blobs{/sha}","clone_url":"https://github.com/mralexgray/AHLaunchCtl.git","forks_url":"https://api.github.com/repos/mralexgray/AHLaunchCtl/forks","full_name":"mralexgray/AHLaunchCtl","has_pages":false,"hooks_url":"https://api.github.com/repos/mralexgray/AHLaunchCtl/hooks","pulls_url":"https://api.github.com/repos/mralexgray/AHLaunchCtl/pulls{/number}","pushed_at":"2015-05-26T18:50:48Z","teams_url":"https://api.github.com/repos/mralexgray/AHLaunchCtl/teams","trees_url":"https://api.github.com/repos/mralexgray/AHLaunchCtl/git/trees{/sha}","created_at":"2015-06-14T21:31:03Z","events_url":"https://api.github.com/repos/mralexgray/AHLaunchCtl/events","has_issues":false,"issues_url":"https://api.github.com/repos/mralexgray/AHLaunchCtl/issues{/number}","labels_url":"https://api.github.com/repos/mralexgray/AHLaunchCtl/labels{/name}","merges_url":"https://api.github.com/repos/mralexgray/AHLaunchCtl/merges","mirror_url":null,"updated_at":"2015-06-14T21:31:04Z","visibility":"public","archive_url":"https://api.github.com/repos/mralexgray/AHLaunchCtl/{archive_format}{/ref}","commits_url":"https://api.github.com/repos/mralexgray/AHLaunchCtl/commits{/sha}","compare_url":"https://api.github.com/repos/mralexgray/AHLaunchCtl/compare/{base}...{head}","description":"LaunchD Framework for Cocoa Apps","forks_count":0,"is_template":false,"open_issues":0,"branches_url":"https://api.github.com/repos/mralexgray/AHLaunchCtl/branches{/branch}","comments_url":"https://api.github.com/repos/mralexgray/AHLaunchCtl/comments{/number}","contents_url":"https://api.github.com/repos/mralexgray/AHLaunchCtl/contents/{+path}","git_refs_url":"https://api.github.com/repos/mralexgray/AHLaunchCtl/git/refs{/sha}","git_tags_url":"https://api.github.com/repos/mralexgray/AHLaunchCtl/git/tags{/sha}","has_projects":true,"releases_url":"https://api.github.com/repos/mralexgray/AHLaunchCtl/releases{/id}","statuses_url":"https://api.github.com/repos/mralexgray/AHLaunchCtl/statuses/{sha}","allow_forking":true,"assignees_url":"https://api.github.com/repos/mralexgray/AHLaunchCtl/assignees{/user}","downloads_url":"https://api.github.com/repos/mralexgray/AHLaunchCtl/downloads","has_downloads":true,"languages_url":"https://api.github.com/repos/mralexgray/AHLaunchCtl/languages","default_branch":"master","milestones_url":"https://api.github.com/repos/mralexgray/AHLaunchCtl/milestones{/number}","stargazers_url":"https://api.github.com/repos/mralexgray/AHLaunchCtl/stargazers","watchers_count":0,"deployments_url":"https://api.github.com/repos/mralexgray/AHLaunchCtl/deployments","git_commits_url":"https://api.github.com/repos/mralexgray/AHLaunchCtl/git/commits{/sha}","subscribers_url":"https://api.github.com/repos/mralexgray/AHLaunchCtl/subscribers","contributors_url":"https://api.github.com/repos/mralexgray/AHLaunchCtl/contributors","issue_events_url":"https://api.github.com/repos/mralexgray/AHLaunchCtl/issues/events{/number}","stargazers_count":0,"subscription_url":"https://api.github.com/repos/mralexgray/AHLaunchCtl/subscription","collaborators_url":"https://api.github.com/repos/mralexgray/AHLaunchCtl/collaborators{/collaborator}","issue_comment_url":"https://api.github.com/repos/mralexgray/AHLaunchCtl/issues/comments{/number}","notifications_url":"https://api.github.com/repos/mralexgray/AHLaunchCtl/notifications{?since,all,participating}","open_issues_count":0,"web_commit_signoff_required":false},{"id":9167473,"url":"https://api.github.com/repos/mralexgray/AHLayout","fork":true,"name":"AHLayout","size":359,"forks":0,"owner":{"id":262517,"url":"https://api.github.com/users/mralexgray","type":"User","login":"mralexgray","node_id":"MDQ6VXNlcjI2MjUxNw==","html_url":"https://github.com/mralexgray","gists_url":"https://api.github.com/users/mralexgray/gists{/gist_id}","repos_url":"https://api.github.com/users/mralexgray/repos","avatar_url":"https://avatars.githubusercontent.com/u/262517?v=4","events_url":"https://api.github.com/users/mralexgray/events{/privacy}","site_admin":false,"gravatar_id":"","starred_url":"https://api.github.com/users/mralexgray/starred{/owner}{/repo}","followers_url":"https://api.github.com/users/mralexgray/followers","following_url":"https://api.github.com/users/mralexgray/following{/other_user}","organizations_url":"https://api.github.com/users/mralexgray/orgs","subscriptions_url":"https://api.github.com/users/mralexgray/subscriptions","received_events_url":"https://api.github.com/users/mralexgray/received_events"},"topics":[],"git_url":"git://github.com/mralexgray/AHLayout.git","license":null,"node_id":"MDEwOlJlcG9zaXRvcnk5MTY3NDcz","private":false,"ssh_url":"git@github.com:mralexgray/AHLayout.git","svn_url":"https://github.com/mralexgray/AHLayout","archived":false,"disabled":false,"has_wiki":true,"homepage":null,"html_url":"https://github.com/mralexgray/AHLayout","keys_url":"https://api.github.com/repos/mralexgray/AHLayout/keys{/key_id}","language":"Objective-C","tags_url":"https://api.github.com/repos/mralexgray/AHLayout/tags","watchers":0,"blobs_url":"https://api.github.com/repos/mralexgray/AHLayout/git/blobs{/sha}","clone_url":"https://github.com/mralexgray/AHLayout.git","forks_url":"https://api.github.com/repos/mralexgray/AHLayout/forks","full_name":"mralexgray/AHLayout","has_pages":false,"hooks_url":"https://api.github.com/repos/mralexgray/AHLayout/hooks","pulls_url":"https://api.github.com/repos/mralexgray/AHLayout/pulls{/number}","pushed_at":"2013-07-08T02:31:14Z","teams_url":"https://api.github.com/repos/mralexgray/AHLayout/teams","trees_url":"https://api.github.com/repos/mralexgray/AHLayout/git/trees{/sha}","created_at":"2013-04-02T10:10:30Z","events_url":"https://api.github.com/repos/mralexgray/AHLayout/events","has_issues":false,"issues_url":"https://api.github.com/repos/mralexgray/AHLayout/issues{/number}","labels_url":"https://api.github.com/repos/mralexgray/AHLayout/labels{/name}","merges_url":"https://api.github.com/repos/mralexgray/AHLayout/merges","mirror_url":null,"updated_at":"2013-07-08T02:31:17Z","visibility":"public","archive_url":"https://api.github.com/repos/mralexgray/AHLayout/{archive_format}{/ref}","commits_url":"https://api.github.com/repos/mralexgray/AHLayout/commits{/sha}","compare_url":"https://api.github.com/repos/mralexgray/AHLayout/compare/{base}...{head}","description":"AHLayout","forks_count":0,"is_template":false,"open_issues":0,"branches_url":"https://api.github.com/repos/mralexgray/AHLayout/branches{/branch}","comments_url":"https://api.github.com/repos/mralexgray/AHLayout/comments{/number}","contents_url":"https://api.github.com/repos/mralexgray/AHLayout/contents/{+path}","git_refs_url":"https://api.github.com/repos/mralexgray/AHLayout/git/refs{/sha}","git_tags_url":"https://api.github.com/repos/mralexgray/AHLayout/git/tags{/sha}","has_projects":true,"releases_url":"https://api.github.com/repos/mralexgray/AHLayout/releases{/id}","statuses_url":"https://api.github.com/repos/mralexgray/AHLayout/statuses/{sha}","allow_forking":true,"assignees_url":"https://api.github.com/repos/mralexgray/AHLayout/assignees{/user}","downloads_url":"https://api.github.com/repos/mralexgray/AHLayout/downloads","has_downloads":true,"languages_url":"https://api.github.com/repos/mralexgray/AHLayout/languages","default_branch":"master","milestones_url":"https://api.github.com/repos/mralexgray/AHLayout/milestones{/number}","stargazers_url":"https://api.github.com/repos/mralexgray/AHLayout/stargazers","watchers_count":0,"deployments_url":"https://api.github.com/repos/mralexgray/AHLayout/deployments","git_commits_url":"https://api.github.com/repos/mralexgray/AHLayout/git/commits{/sha}","subscribers_url":"https://api.github.com/repos/mralexgray/AHLayout/subscribers","contributors_url":"https://api.github.com/repos/mralexgray/AHLayout/contributors","issue_events_url":"https://api.github.com/repos/mralexgray/AHLayout/issues/events{/number}","stargazers_count":0,"subscription_url":"https://api.github.com/repos/mralexgray/AHLayout/subscription","collaborators_url":"https://api.github.com/repos/mralexgray/AHLayout/collaborators{/collaborator}","issue_comment_url":"https://api.github.com/repos/mralexgray/AHLayout/issues/comments{/number}","notifications_url":"https://api.github.com/repos/mralexgray/AHLayout/notifications{?since,all,participating}","open_issues_count":0,"web_commit_signoff_required":false},{"id":18450201,"url":"https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework","fork":true,"name":"Airmail-Plug-In-Framework","size":888,"forks":0,"owner":{"id":262517,"url":"https://api.github.com/users/mralexgray","type":"User","login":"mralexgray","node_id":"MDQ6VXNlcjI2MjUxNw==","html_url":"https://github.com/mralexgray","gists_url":"https://api.github.com/users/mralexgray/gists{/gist_id}","repos_url":"https://api.github.com/users/mralexgray/repos","avatar_url":"https://avatars.githubusercontent.com/u/262517?v=4","events_url":"https://api.github.com/users/mralexgray/events{/privacy}","site_admin":false,"gravatar_id":"","starred_url":"https://api.github.com/users/mralexgray/starred{/owner}{/repo}","followers_url":"https://api.github.com/users/mralexgray/followers","following_url":"https://api.github.com/users/mralexgray/following{/other_user}","organizations_url":"https://api.github.com/users/mralexgray/orgs","subscriptions_url":"https://api.github.com/users/mralexgray/subscriptions","received_events_url":"https://api.github.com/users/mralexgray/received_events"},"topics":[],"git_url":"git://github.com/mralexgray/Airmail-Plug-In-Framework.git","license":{"key":"gpl-2.0","url":"https://api.github.com/licenses/gpl-2.0","name":"GNU General Public License v2.0","node_id":"MDc6TGljZW5zZTg=","spdx_id":"GPL-2.0"},"node_id":"MDEwOlJlcG9zaXRvcnkxODQ1MDIwMQ==","private":false,"ssh_url":"git@github.com:mralexgray/Airmail-Plug-In-Framework.git","svn_url":"https://github.com/mralexgray/Airmail-Plug-In-Framework","archived":false,"disabled":false,"has_wiki":true,"homepage":null,"html_url":"https://github.com/mralexgray/Airmail-Plug-In-Framework","keys_url":"https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/keys{/key_id}","language":null,"tags_url":"https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/tags","watchers":0,"blobs_url":"https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/git/blobs{/sha}","clone_url":"https://github.com/mralexgray/Airmail-Plug-In-Framework.git","forks_url":"https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/forks","full_name":"mralexgray/Airmail-Plug-In-Framework","has_pages":false,"hooks_url":"https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/hooks","pulls_url":"https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/pulls{/number}","pushed_at":"2014-03-27T15:42:19Z","teams_url":"https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/teams","trees_url":"https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/git/trees{/sha}","created_at":"2014-04-04T19:33:54Z","events_url":"https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/events","has_issues":false,"issues_url":"https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/issues{/number}","labels_url":"https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/labels{/name}","merges_url":"https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/merges","mirror_url":null,"updated_at":"2014-11-23T19:31:04Z","visibility":"public","archive_url":"https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/{archive_format}{/ref}","commits_url":"https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/commits{/sha}","compare_url":"https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/compare/{base}...{head}","description":null,"forks_count":0,"is_template":false,"open_issues":0,"branches_url":"https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/branches{/branch}","comments_url":"https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/comments{/number}","contents_url":"https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/contents/{+path}","git_refs_url":"https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/git/refs{/sha}","git_tags_url":"https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/git/tags{/sha}","has_projects":true,"releases_url":"https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/releases{/id}","statuses_url":"https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/statuses/{sha}","allow_forking":true,"assignees_url":"https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/assignees{/user}","downloads_url":"https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/downloads","has_downloads":true,"languages_url":"https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/languages","default_branch":"master","milestones_url":"https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/milestones{/number}","stargazers_url":"https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/stargazers","watchers_count":0,"deployments_url":"https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/deployments","git_commits_url":"https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/git/commits{/sha}","subscribers_url":"https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/subscribers","contributors_url":"https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/contributors","issue_events_url":"https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/issues/events{/number}","stargazers_count":0,"subscription_url":"https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/subscription","collaborators_url":"https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/collaborators{/collaborator}","issue_comment_url":"https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/issues/comments{/number}","notifications_url":"https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/notifications{?since,all,participating}","open_issues_count":0,"web_commit_signoff_required":false},{"id":5203219,"url":"https://api.github.com/repos/mralexgray/AJS-iTunes-API","fork":true,"name":"AJS-iTunes-API","size":103,"forks":0,"owner":{"id":262517,"url":"https://api.github.com/users/mralexgray","type":"User","login":"mralexgray","node_id":"MDQ6VXNlcjI2MjUxNw==","html_url":"https://github.com/mralexgray","gists_url":"https://api.github.com/users/mralexgray/gists{/gist_id}","repos_url":"https://api.github.com/users/mralexgray/repos","avatar_url":"https://avatars.githubusercontent.com/u/262517?v=4","events_url":"https://api.github.com/users/mralexgray/events{/privacy}","site_admin":false,"gravatar_id":"","starred_url":"https://api.github.com/users/mralexgray/starred{/owner}{/repo}","followers_url":"https://api.github.com/users/mralexgray/followers","following_url":"https://api.github.com/users/mralexgray/following{/other_user}","organizations_url":"https://api.github.com/users/mralexgray/orgs","subscriptions_url":"https://api.github.com/users/mralexgray/subscriptions","received_events_url":"https://api.github.com/users/mralexgray/received_events"},"topics":[],"git_url":"git://github.com/mralexgray/AJS-iTunes-API.git","license":null,"node_id":"MDEwOlJlcG9zaXRvcnk1MjAzMjE5","private":false,"ssh_url":"git@github.com:mralexgray/AJS-iTunes-API.git","svn_url":"https://github.com/mralexgray/AJS-iTunes-API","archived":false,"disabled":false,"has_wiki":true,"homepage":"","html_url":"https://github.com/mralexgray/AJS-iTunes-API","keys_url":"https://api.github.com/repos/mralexgray/AJS-iTunes-API/keys{/key_id}","language":"Objective-C","tags_url":"https://api.github.com/repos/mralexgray/AJS-iTunes-API/tags","watchers":2,"blobs_url":"https://api.github.com/repos/mralexgray/AJS-iTunes-API/git/blobs{/sha}","clone_url":"https://github.com/mralexgray/AJS-iTunes-API.git","forks_url":"https://api.github.com/repos/mralexgray/AJS-iTunes-API/forks","full_name":"mralexgray/AJS-iTunes-API","has_pages":false,"hooks_url":"https://api.github.com/repos/mralexgray/AJS-iTunes-API/hooks","pulls_url":"https://api.github.com/repos/mralexgray/AJS-iTunes-API/pulls{/number}","pushed_at":"2011-10-30T22:26:48Z","teams_url":"https://api.github.com/repos/mralexgray/AJS-iTunes-API/teams","trees_url":"https://api.github.com/repos/mralexgray/AJS-iTunes-API/git/trees{/sha}","created_at":"2012-07-27T10:20:58Z","events_url":"https://api.github.com/repos/mralexgray/AJS-iTunes-API/events","has_issues":false,"issues_url":"https://api.github.com/repos/mralexgray/AJS-iTunes-API/issues{/number}","labels_url":"https://api.github.com/repos/mralexgray/AJS-iTunes-API/labels{/name}","merges_url":"https://api.github.com/repos/mralexgray/AJS-iTunes-API/merges","mirror_url":null,"updated_at":"2013-01-11T11:00:05Z","visibility":"public","archive_url":"https://api.github.com/repos/mralexgray/AJS-iTunes-API/{archive_format}{/ref}","commits_url":"https://api.github.com/repos/mralexgray/AJS-iTunes-API/commits{/sha}","compare_url":"https://api.github.com/repos/mralexgray/AJS-iTunes-API/compare/{base}...{head}","description":"Cocoa wrapper for the iTunes search API - for iOS and Mac OSX projects","forks_count":0,"is_template":false,"open_issues":0,"branches_url":"https://api.github.com/repos/mralexgray/AJS-iTunes-API/branches{/branch}","comments_url":"https://api.github.com/repos/mralexgray/AJS-iTunes-API/comments{/number}","contents_url":"https://api.github.com/repos/mralexgray/AJS-iTunes-API/contents/{+path}","git_refs_url":"https://api.github.com/repos/mralexgray/AJS-iTunes-API/git/refs{/sha}","git_tags_url":"https://api.github.com/repos/mralexgray/AJS-iTunes-API/git/tags{/sha}","has_projects":true,"releases_url":"https://api.github.com/repos/mralexgray/AJS-iTunes-API/releases{/id}","statuses_url":"https://api.github.com/repos/mralexgray/AJS-iTunes-API/statuses/{sha}","allow_forking":true,"assignees_url":"https://api.github.com/repos/mralexgray/AJS-iTunes-API/assignees{/user}","downloads_url":"https://api.github.com/repos/mralexgray/AJS-iTunes-API/downloads","has_downloads":true,"languages_url":"https://api.github.com/repos/mralexgray/AJS-iTunes-API/languages","default_branch":"master","milestones_url":"https://api.github.com/repos/mralexgray/AJS-iTunes-API/milestones{/number}","stargazers_url":"https://api.github.com/repos/mralexgray/AJS-iTunes-API/stargazers","watchers_count":2,"deployments_url":"https://api.github.com/repos/mralexgray/AJS-iTunes-API/deployments","git_commits_url":"https://api.github.com/repos/mralexgray/AJS-iTunes-API/git/commits{/sha}","subscribers_url":"https://api.github.com/repos/mralexgray/AJS-iTunes-API/subscribers","contributors_url":"https://api.github.com/repos/mralexgray/AJS-iTunes-API/contributors","issue_events_url":"https://api.github.com/repos/mralexgray/AJS-iTunes-API/issues/events{/number}","stargazers_count":2,"subscription_url":"https://api.github.com/repos/mralexgray/AJS-iTunes-API/subscription","collaborators_url":"https://api.github.com/repos/mralexgray/AJS-iTunes-API/collaborators{/collaborator}","issue_comment_url":"https://api.github.com/repos/mralexgray/AJS-iTunes-API/issues/comments{/number}","notifications_url":"https://api.github.com/repos/mralexgray/AJS-iTunes-API/notifications{?since,all,participating}","open_issues_count":0,"web_commit_signoff_required":false},{"id":10093801,"url":"https://api.github.com/repos/mralexgray/Alcatraz","fork":true,"name":"Alcatraz","size":3668,"forks":0,"owner":{"id":262517,"url":"https://api.github.com/users/mralexgray","type":"User","login":"mralexgray","node_id":"MDQ6VXNlcjI2MjUxNw==","html_url":"https://github.com/mralexgray","gists_url":"https://api.github.com/users/mralexgray/gists{/gist_id}","repos_url":"https://api.github.com/users/mralexgray/repos","avatar_url":"https://avatars.githubusercontent.com/u/262517?v=4","events_url":"https://api.github.com/users/mralexgray/events{/privacy}","site_admin":false,"gravatar_id":"","starred_url":"https://api.github.com/users/mralexgray/starred{/owner}{/repo}","followers_url":"https://api.github.com/users/mralexgray/followers","following_url":"https://api.github.com/users/mralexgray/following{/other_user}","organizations_url":"https://api.github.com/users/mralexgray/orgs","subscriptions_url":"https://api.github.com/users/mralexgray/subscriptions","received_events_url":"https://api.github.com/users/mralexgray/received_events"},"topics":[],"git_url":"git://github.com/mralexgray/Alcatraz.git","license":{"key":"mit","url":"https://api.github.com/licenses/mit","name":"MIT License","node_id":"MDc6TGljZW5zZTEz","spdx_id":"MIT"},"node_id":"MDEwOlJlcG9zaXRvcnkxMDA5MzgwMQ==","private":false,"ssh_url":"git@github.com:mralexgray/Alcatraz.git","svn_url":"https://github.com/mralexgray/Alcatraz","archived":false,"disabled":false,"has_wiki":false,"homepage":"mneorr.github.com/Alcatraz","html_url":"https://github.com/mralexgray/Alcatraz","keys_url":"https://api.github.com/repos/mralexgray/Alcatraz/keys{/key_id}","language":"Objective-C","tags_url":"https://api.github.com/repos/mralexgray/Alcatraz/tags","watchers":0,"blobs_url":"https://api.github.com/repos/mralexgray/Alcatraz/git/blobs{/sha}","clone_url":"https://github.com/mralexgray/Alcatraz.git","forks_url":"https://api.github.com/repos/mralexgray/Alcatraz/forks","full_name":"mralexgray/Alcatraz","has_pages":false,"hooks_url":"https://api.github.com/repos/mralexgray/Alcatraz/hooks","pulls_url":"https://api.github.com/repos/mralexgray/Alcatraz/pulls{/number}","pushed_at":"2014-03-19T12:50:37Z","teams_url":"https://api.github.com/repos/mralexgray/Alcatraz/teams","trees_url":"https://api.github.com/repos/mralexgray/Alcatraz/git/trees{/sha}","created_at":"2013-05-16T04:41:13Z","events_url":"https://api.github.com/repos/mralexgray/Alcatraz/events","has_issues":false,"issues_url":"https://api.github.com/repos/mralexgray/Alcatraz/issues{/number}","labels_url":"https://api.github.com/repos/mralexgray/Alcatraz/labels{/name}","merges_url":"https://api.github.com/repos/mralexgray/Alcatraz/merges","mirror_url":null,"updated_at":"2014-03-19T20:38:35Z","visibility":"public","archive_url":"https://api.github.com/repos/mralexgray/Alcatraz/{archive_format}{/ref}","commits_url":"https://api.github.com/repos/mralexgray/Alcatraz/commits{/sha}","compare_url":"https://api.github.com/repos/mralexgray/Alcatraz/compare/{base}...{head}","description":"The most awesome (and only) Xcode package manager!","forks_count":0,"is_template":false,"open_issues":0,"branches_url":"https://api.github.com/repos/mralexgray/Alcatraz/branches{/branch}","comments_url":"https://api.github.com/repos/mralexgray/Alcatraz/comments{/number}","contents_url":"https://api.github.com/repos/mralexgray/Alcatraz/contents/{+path}","git_refs_url":"https://api.github.com/repos/mralexgray/Alcatraz/git/refs{/sha}","git_tags_url":"https://api.github.com/repos/mralexgray/Alcatraz/git/tags{/sha}","has_projects":true,"releases_url":"https://api.github.com/repos/mralexgray/Alcatraz/releases{/id}","statuses_url":"https://api.github.com/repos/mralexgray/Alcatraz/statuses/{sha}","allow_forking":true,"assignees_url":"https://api.github.com/repos/mralexgray/Alcatraz/assignees{/user}","downloads_url":"https://api.github.com/repos/mralexgray/Alcatraz/downloads","has_downloads":true,"languages_url":"https://api.github.com/repos/mralexgray/Alcatraz/languages","default_branch":"master","milestones_url":"https://api.github.com/repos/mralexgray/Alcatraz/milestones{/number}","stargazers_url":"https://api.github.com/repos/mralexgray/Alcatraz/stargazers","watchers_count":0,"deployments_url":"https://api.github.com/repos/mralexgray/Alcatraz/deployments","git_commits_url":"https://api.github.com/repos/mralexgray/Alcatraz/git/commits{/sha}","subscribers_url":"https://api.github.com/repos/mralexgray/Alcatraz/subscribers","contributors_url":"https://api.github.com/repos/mralexgray/Alcatraz/contributors","issue_events_url":"https://api.github.com/repos/mralexgray/Alcatraz/issues/events{/number}","stargazers_count":0,"subscription_url":"https://api.github.com/repos/mralexgray/Alcatraz/subscription","collaborators_url":"https://api.github.com/repos/mralexgray/Alcatraz/collaborators{/collaborator}","issue_comment_url":"https://api.github.com/repos/mralexgray/Alcatraz/issues/comments{/number}","notifications_url":"https://api.github.com/repos/mralexgray/Alcatraz/notifications{?since,all,participating}","open_issues_count":0,"web_commit_signoff_required":false},{"id":12916552,"url":"https://api.github.com/repos/mralexgray/alcatraz-packages","fork":true,"name":"alcatraz-packages","size":826,"forks":0,"owner":{"id":262517,"url":"https://api.github.com/users/mralexgray","type":"User","login":"mralexgray","node_id":"MDQ6VXNlcjI2MjUxNw==","html_url":"https://github.com/mralexgray","gists_url":"https://api.github.com/users/mralexgray/gists{/gist_id}","repos_url":"https://api.github.com/users/mralexgray/repos","avatar_url":"https://avatars.githubusercontent.com/u/262517?v=4","events_url":"https://api.github.com/users/mralexgray/events{/privacy}","site_admin":false,"gravatar_id":"","starred_url":"https://api.github.com/users/mralexgray/starred{/owner}{/repo}","followers_url":"https://api.github.com/users/mralexgray/followers","following_url":"https://api.github.com/users/mralexgray/following{/other_user}","organizations_url":"https://api.github.com/users/mralexgray/orgs","subscriptions_url":"https://api.github.com/users/mralexgray/subscriptions","received_events_url":"https://api.github.com/users/mralexgray/received_events"},"topics":[],"git_url":"git://github.com/mralexgray/alcatraz-packages.git","license":null,"node_id":"MDEwOlJlcG9zaXRvcnkxMjkxNjU1Mg==","private":false,"ssh_url":"git@github.com:mralexgray/alcatraz-packages.git","svn_url":"https://github.com/mralexgray/alcatraz-packages","archived":false,"disabled":false,"has_wiki":true,"homepage":"mneorr.github.com/Alcatraz","html_url":"https://github.com/mralexgray/alcatraz-packages","keys_url":"https://api.github.com/repos/mralexgray/alcatraz-packages/keys{/key_id}","language":"Ruby","tags_url":"https://api.github.com/repos/mralexgray/alcatraz-packages/tags","watchers":0,"blobs_url":"https://api.github.com/repos/mralexgray/alcatraz-packages/git/blobs{/sha}","clone_url":"https://github.com/mralexgray/alcatraz-packages.git","forks_url":"https://api.github.com/repos/mralexgray/alcatraz-packages/forks","full_name":"mralexgray/alcatraz-packages","has_pages":false,"hooks_url":"https://api.github.com/repos/mralexgray/alcatraz-packages/hooks","pulls_url":"https://api.github.com/repos/mralexgray/alcatraz-packages/pulls{/number}","pushed_at":"2015-12-14T16:21:31Z","teams_url":"https://api.github.com/repos/mralexgray/alcatraz-packages/teams","trees_url":"https://api.github.com/repos/mralexgray/alcatraz-packages/git/trees{/sha}","created_at":"2013-09-18T07:15:24Z","events_url":"https://api.github.com/repos/mralexgray/alcatraz-packages/events","has_issues":false,"issues_url":"https://api.github.com/repos/mralexgray/alcatraz-packages/issues{/number}","labels_url":"https://api.github.com/repos/mralexgray/alcatraz-packages/labels{/name}","merges_url":"https://api.github.com/repos/mralexgray/alcatraz-packages/merges","mirror_url":null,"updated_at":"2015-11-10T20:52:30Z","visibility":"public","archive_url":"https://api.github.com/repos/mralexgray/alcatraz-packages/{archive_format}{/ref}","commits_url":"https://api.github.com/repos/mralexgray/alcatraz-packages/commits{/sha}","compare_url":"https://api.github.com/repos/mralexgray/alcatraz-packages/compare/{base}...{head}","description":"Package list repository for Alcatraz","forks_count":0,"is_template":false,"open_issues":0,"branches_url":"https://api.github.com/repos/mralexgray/alcatraz-packages/branches{/branch}","comments_url":"https://api.github.com/repos/mralexgray/alcatraz-packages/comments{/number}","contents_url":"https://api.github.com/repos/mralexgray/alcatraz-packages/contents/{+path}","git_refs_url":"https://api.github.com/repos/mralexgray/alcatraz-packages/git/refs{/sha}","git_tags_url":"https://api.github.com/repos/mralexgray/alcatraz-packages/git/tags{/sha}","has_projects":true,"releases_url":"https://api.github.com/repos/mralexgray/alcatraz-packages/releases{/id}","statuses_url":"https://api.github.com/repos/mralexgray/alcatraz-packages/statuses/{sha}","allow_forking":true,"assignees_url":"https://api.github.com/repos/mralexgray/alcatraz-packages/assignees{/user}","downloads_url":"https://api.github.com/repos/mralexgray/alcatraz-packages/downloads","has_downloads":true,"languages_url":"https://api.github.com/repos/mralexgray/alcatraz-packages/languages","default_branch":"master","milestones_url":"https://api.github.com/repos/mralexgray/alcatraz-packages/milestones{/number}","stargazers_url":"https://api.github.com/repos/mralexgray/alcatraz-packages/stargazers","watchers_count":0,"deployments_url":"https://api.github.com/repos/mralexgray/alcatraz-packages/deployments","git_commits_url":"https://api.github.com/repos/mralexgray/alcatraz-packages/git/commits{/sha}","subscribers_url":"https://api.github.com/repos/mralexgray/alcatraz-packages/subscribers","contributors_url":"https://api.github.com/repos/mralexgray/alcatraz-packages/contributors","issue_events_url":"https://api.github.com/repos/mralexgray/alcatraz-packages/issues/events{/number}","stargazers_count":0,"subscription_url":"https://api.github.com/repos/mralexgray/alcatraz-packages/subscription","collaborators_url":"https://api.github.com/repos/mralexgray/alcatraz-packages/collaborators{/collaborator}","issue_comment_url":"https://api.github.com/repos/mralexgray/alcatraz-packages/issues/comments{/number}","notifications_url":"https://api.github.com/repos/mralexgray/alcatraz-packages/notifications{?since,all,participating}","open_issues_count":0,"web_commit_signoff_required":false},{"id":44278362,"url":"https://api.github.com/repos/mralexgray/alexicons","fork":true,"name":"alexicons","size":257,"forks":0,"owner":{"id":262517,"url":"https://api.github.com/users/mralexgray","type":"User","login":"mralexgray","node_id":"MDQ6VXNlcjI2MjUxNw==","html_url":"https://github.com/mralexgray","gists_url":"https://api.github.com/users/mralexgray/gists{/gist_id}","repos_url":"https://api.github.com/users/mralexgray/repos","avatar_url":"https://avatars.githubusercontent.com/u/262517?v=4","events_url":"https://api.github.com/users/mralexgray/events{/privacy}","site_admin":false,"gravatar_id":"","starred_url":"https://api.github.com/users/mralexgray/starred{/owner}{/repo}","followers_url":"https://api.github.com/users/mralexgray/followers","following_url":"https://api.github.com/users/mralexgray/following{/other_user}","organizations_url":"https://api.github.com/users/mralexgray/orgs","subscriptions_url":"https://api.github.com/users/mralexgray/subscriptions","received_events_url":"https://api.github.com/users/mralexgray/received_events"},"topics":[],"git_url":"git://github.com/mralexgray/alexicons.git","license":null,"node_id":"MDEwOlJlcG9zaXRvcnk0NDI3ODM2Mg==","private":false,"ssh_url":"git@github.com:mralexgray/alexicons.git","svn_url":"https://github.com/mralexgray/alexicons","archived":false,"disabled":false,"has_wiki":false,"homepage":null,"html_url":"https://github.com/mralexgray/alexicons","keys_url":"https://api.github.com/repos/mralexgray/alexicons/keys{/key_id}","language":"CoffeeScript","tags_url":"https://api.github.com/repos/mralexgray/alexicons/tags","watchers":0,"blobs_url":"https://api.github.com/repos/mralexgray/alexicons/git/blobs{/sha}","clone_url":"https://github.com/mralexgray/alexicons.git","forks_url":"https://api.github.com/repos/mralexgray/alexicons/forks","full_name":"mralexgray/alexicons","has_pages":false,"hooks_url":"https://api.github.com/repos/mralexgray/alexicons/hooks","pulls_url":"https://api.github.com/repos/mralexgray/alexicons/pulls{/number}","pushed_at":"2015-10-16T03:57:51Z","teams_url":"https://api.github.com/repos/mralexgray/alexicons/teams","trees_url":"https://api.github.com/repos/mralexgray/alexicons/git/trees{/sha}","created_at":"2015-10-14T21:49:39Z","events_url":"https://api.github.com/repos/mralexgray/alexicons/events","has_issues":false,"issues_url":"https://api.github.com/repos/mralexgray/alexicons/issues{/number}","labels_url":"https://api.github.com/repos/mralexgray/alexicons/labels{/name}","merges_url":"https://api.github.com/repos/mralexgray/alexicons/merges","mirror_url":null,"updated_at":"2015-10-15T06:20:08Z","visibility":"public","archive_url":"https://api.github.com/repos/mralexgray/alexicons/{archive_format}{/ref}","commits_url":"https://api.github.com/repos/mralexgray/alexicons/commits{/sha}","compare_url":"https://api.github.com/repos/mralexgray/alexicons/compare/{base}...{head}","description":"Get popular cat names","forks_count":0,"is_template":false,"open_issues":0,"branches_url":"https://api.github.com/repos/mralexgray/alexicons/branches{/branch}","comments_url":"https://api.github.com/repos/mralexgray/alexicons/comments{/number}","contents_url":"https://api.github.com/repos/mralexgray/alexicons/contents/{+path}","git_refs_url":"https://api.github.com/repos/mralexgray/alexicons/git/refs{/sha}","git_tags_url":"https://api.github.com/repos/mralexgray/alexicons/git/tags{/sha}","has_projects":true,"releases_url":"https://api.github.com/repos/mralexgray/alexicons/releases{/id}","statuses_url":"https://api.github.com/repos/mralexgray/alexicons/statuses/{sha}","allow_forking":true,"assignees_url":"https://api.github.com/repos/mralexgray/alexicons/assignees{/user}","downloads_url":"https://api.github.com/repos/mralexgray/alexicons/downloads","has_downloads":true,"languages_url":"https://api.github.com/repos/mralexgray/alexicons/languages","default_branch":"master","milestones_url":"https://api.github.com/repos/mralexgray/alexicons/milestones{/number}","stargazers_url":"https://api.github.com/repos/mralexgray/alexicons/stargazers","watchers_count":0,"deployments_url":"https://api.github.com/repos/mralexgray/alexicons/deployments","git_commits_url":"https://api.github.com/repos/mralexgray/alexicons/git/commits{/sha}","subscribers_url":"https://api.github.com/repos/mralexgray/alexicons/subscribers","contributors_url":"https://api.github.com/repos/mralexgray/alexicons/contributors","issue_events_url":"https://api.github.com/repos/mralexgray/alexicons/issues/events{/number}","stargazers_count":0,"subscription_url":"https://api.github.com/repos/mralexgray/alexicons/subscription","collaborators_url":"https://api.github.com/repos/mralexgray/alexicons/collaborators{/collaborator}","issue_comment_url":"https://api.github.com/repos/mralexgray/alexicons/issues/comments{/number}","notifications_url":"https://api.github.com/repos/mralexgray/alexicons/notifications{?since,all,participating}","open_issues_count":0,"web_commit_signoff_required":false},{"id":10476467,"url":"https://api.github.com/repos/mralexgray/Alfred-Google-Translate","fork":true,"name":"Alfred-Google-Translate","size":103,"forks":0,"owner":{"id":262517,"url":"https://api.github.com/users/mralexgray","type":"User","login":"mralexgray","node_id":"MDQ6VXNlcjI2MjUxNw==","html_url":"https://github.com/mralexgray","gists_url":"https://api.github.com/users/mralexgray/gists{/gist_id}","repos_url":"https://api.github.com/users/mralexgray/repos","avatar_url":"https://avatars.githubusercontent.com/u/262517?v=4","events_url":"https://api.github.com/users/mralexgray/events{/privacy}","site_admin":false,"gravatar_id":"","starred_url":"https://api.github.com/users/mralexgray/starred{/owner}{/repo}","followers_url":"https://api.github.com/users/mralexgray/followers","following_url":"https://api.github.com/users/mralexgray/following{/other_user}","organizations_url":"https://api.github.com/users/mralexgray/orgs","subscriptions_url":"https://api.github.com/users/mralexgray/subscriptions","received_events_url":"https://api.github.com/users/mralexgray/received_events"},"topics":[],"git_url":"git://github.com/mralexgray/Alfred-Google-Translate.git","license":null,"node_id":"MDEwOlJlcG9zaXRvcnkxMDQ3NjQ2Nw==","private":false,"ssh_url":"git@github.com:mralexgray/Alfred-Google-Translate.git","svn_url":"https://github.com/mralexgray/Alfred-Google-Translate","archived":false,"disabled":false,"has_wiki":true,"homepage":null,"html_url":"https://github.com/mralexgray/Alfred-Google-Translate","keys_url":"https://api.github.com/repos/mralexgray/Alfred-Google-Translate/keys{/key_id}","language":"Shell","tags_url":"https://api.github.com/repos/mralexgray/Alfred-Google-Translate/tags","watchers":0,"blobs_url":"https://api.github.com/repos/mralexgray/Alfred-Google-Translate/git/blobs{/sha}","clone_url":"https://github.com/mralexgray/Alfred-Google-Translate.git","forks_url":"https://api.github.com/repos/mralexgray/Alfred-Google-Translate/forks","full_name":"mralexgray/Alfred-Google-Translate","has_pages":false,"hooks_url":"https://api.github.com/repos/mralexgray/Alfred-Google-Translate/hooks","pulls_url":"https://api.github.com/repos/mralexgray/Alfred-Google-Translate/pulls{/number}","pushed_at":"2013-01-12T19:39:03Z","teams_url":"https://api.github.com/repos/mralexgray/Alfred-Google-Translate/teams","trees_url":"https://api.github.com/repos/mralexgray/Alfred-Google-Translate/git/trees{/sha}","created_at":"2013-06-04T10:45:10Z","events_url":"https://api.github.com/repos/mralexgray/Alfred-Google-Translate/events","has_issues":false,"issues_url":"https://api.github.com/repos/mralexgray/Alfred-Google-Translate/issues{/number}","labels_url":"https://api.github.com/repos/mralexgray/Alfred-Google-Translate/labels{/name}","merges_url":"https://api.github.com/repos/mralexgray/Alfred-Google-Translate/merges","mirror_url":null,"updated_at":"2013-06-04T10:45:10Z","visibility":"public","archive_url":"https://api.github.com/repos/mralexgray/Alfred-Google-Translate/{archive_format}{/ref}","commits_url":"https://api.github.com/repos/mralexgray/Alfred-Google-Translate/commits{/sha}","compare_url":"https://api.github.com/repos/mralexgray/Alfred-Google-Translate/compare/{base}...{head}","description":"Extension for Alfred that will do a Google translate for you","forks_count":0,"is_template":false,"open_issues":0,"branches_url":"https://api.github.com/repos/mralexgray/Alfred-Google-Translate/branches{/branch}","comments_url":"https://api.github.com/repos/mralexgray/Alfred-Google-Translate/comments{/number}","contents_url":"https://api.github.com/repos/mralexgray/Alfred-Google-Translate/contents/{+path}","git_refs_url":"https://api.github.com/repos/mralexgray/Alfred-Google-Translate/git/refs{/sha}","git_tags_url":"https://api.github.com/repos/mralexgray/Alfred-Google-Translate/git/tags{/sha}","has_projects":true,"releases_url":"https://api.github.com/repos/mralexgray/Alfred-Google-Translate/releases{/id}","statuses_url":"https://api.github.com/repos/mralexgray/Alfred-Google-Translate/statuses/{sha}","allow_forking":true,"assignees_url":"https://api.github.com/repos/mralexgray/Alfred-Google-Translate/assignees{/user}","downloads_url":"https://api.github.com/repos/mralexgray/Alfred-Google-Translate/downloads","has_downloads":true,"languages_url":"https://api.github.com/repos/mralexgray/Alfred-Google-Translate/languages","default_branch":"master","milestones_url":"https://api.github.com/repos/mralexgray/Alfred-Google-Translate/milestones{/number}","stargazers_url":"https://api.github.com/repos/mralexgray/Alfred-Google-Translate/stargazers","watchers_count":0,"deployments_url":"https://api.github.com/repos/mralexgray/Alfred-Google-Translate/deployments","git_commits_url":"https://api.github.com/repos/mralexgray/Alfred-Google-Translate/git/commits{/sha}","subscribers_url":"https://api.github.com/repos/mralexgray/Alfred-Google-Translate/subscribers","contributors_url":"https://api.github.com/repos/mralexgray/Alfred-Google-Translate/contributors","issue_events_url":"https://api.github.com/repos/mralexgray/Alfred-Google-Translate/issues/events{/number}","stargazers_count":0,"subscription_url":"https://api.github.com/repos/mralexgray/Alfred-Google-Translate/subscription","collaborators_url":"https://api.github.com/repos/mralexgray/Alfred-Google-Translate/collaborators{/collaborator}","issue_comment_url":"https://api.github.com/repos/mralexgray/Alfred-Google-Translate/issues/comments{/number}","notifications_url":"https://api.github.com/repos/mralexgray/Alfred-Google-Translate/notifications{?since,all,participating}","open_issues_count":0,"web_commit_signoff_required":false},{"id":5524019,"url":"https://api.github.com/repos/mralexgray/Amber","fork":false,"name":"Amber","size":48,"forks":0,"owner":{"id":262517,"url":"https://api.github.com/users/mralexgray","type":"User","login":"mralexgray","node_id":"MDQ6VXNlcjI2MjUxNw==","html_url":"https://github.com/mralexgray","gists_url":"https://api.github.com/users/mralexgray/gists{/gist_id}","repos_url":"https://api.github.com/users/mralexgray/repos","avatar_url":"https://avatars.githubusercontent.com/u/262517?v=4","events_url":"https://api.github.com/users/mralexgray/events{/privacy}","site_admin":false,"gravatar_id":"","starred_url":"https://api.github.com/users/mralexgray/starred{/owner}{/repo}","followers_url":"https://api.github.com/users/mralexgray/followers","following_url":"https://api.github.com/users/mralexgray/following{/other_user}","organizations_url":"https://api.github.com/users/mralexgray/orgs","subscriptions_url":"https://api.github.com/users/mralexgray/subscriptions","received_events_url":"https://api.github.com/users/mralexgray/received_events"},"topics":[],"git_url":"git://github.com/mralexgray/Amber.git","license":null,"node_id":"MDEwOlJlcG9zaXRvcnk1NTI0MDE5","private":false,"ssh_url":"git@github.com:mralexgray/Amber.git","svn_url":"https://github.com/mralexgray/Amber","archived":false,"disabled":false,"has_wiki":true,"homepage":null,"html_url":"https://github.com/mralexgray/Amber","keys_url":"https://api.github.com/repos/mralexgray/Amber/keys{/key_id}","language":null,"tags_url":"https://api.github.com/repos/mralexgray/Amber/tags","watchers":0,"blobs_url":"https://api.github.com/repos/mralexgray/Amber/git/blobs{/sha}","clone_url":"https://github.com/mralexgray/Amber.git","forks_url":"https://api.github.com/repos/mralexgray/Amber/forks","full_name":"mralexgray/Amber","has_pages":false,"hooks_url":"https://api.github.com/repos/mralexgray/Amber/hooks","pulls_url":"https://api.github.com/repos/mralexgray/Amber/pulls{/number}","pushed_at":"2012-08-23T10:38:25Z","teams_url":"https://api.github.com/repos/mralexgray/Amber/teams","trees_url":"https://api.github.com/repos/mralexgray/Amber/git/trees{/sha}","created_at":"2012-08-23T10:38:24Z","events_url":"https://api.github.com/repos/mralexgray/Amber/events","has_issues":true,"issues_url":"https://api.github.com/repos/mralexgray/Amber/issues{/number}","labels_url":"https://api.github.com/repos/mralexgray/Amber/labels{/name}","merges_url":"https://api.github.com/repos/mralexgray/Amber/merges","mirror_url":null,"updated_at":"2013-01-11T22:25:35Z","visibility":"public","archive_url":"https://api.github.com/repos/mralexgray/Amber/{archive_format}{/ref}","commits_url":"https://api.github.com/repos/mralexgray/Amber/commits{/sha}","compare_url":"https://api.github.com/repos/mralexgray/Amber/compare/{base}...{head}","description":"Fork of the difficult-to-deal-with Amber.framework","forks_count":0,"is_template":false,"open_issues":0,"branches_url":"https://api.github.com/repos/mralexgray/Amber/branches{/branch}","comments_url":"https://api.github.com/repos/mralexgray/Amber/comments{/number}","contents_url":"https://api.github.com/repos/mralexgray/Amber/contents/{+path}","git_refs_url":"https://api.github.com/repos/mralexgray/Amber/git/refs{/sha}","git_tags_url":"https://api.github.com/repos/mralexgray/Amber/git/tags{/sha}","has_projects":true,"releases_url":"https://api.github.com/repos/mralexgray/Amber/releases{/id}","statuses_url":"https://api.github.com/repos/mralexgray/Amber/statuses/{sha}","allow_forking":true,"assignees_url":"https://api.github.com/repos/mralexgray/Amber/assignees{/user}","downloads_url":"https://api.github.com/repos/mralexgray/Amber/downloads","has_downloads":true,"languages_url":"https://api.github.com/repos/mralexgray/Amber/languages","default_branch":"master","milestones_url":"https://api.github.com/repos/mralexgray/Amber/milestones{/number}","stargazers_url":"https://api.github.com/repos/mralexgray/Amber/stargazers","watchers_count":0,"deployments_url":"https://api.github.com/repos/mralexgray/Amber/deployments","git_commits_url":"https://api.github.com/repos/mralexgray/Amber/git/commits{/sha}","subscribers_url":"https://api.github.com/repos/mralexgray/Amber/subscribers","contributors_url":"https://api.github.com/repos/mralexgray/Amber/contributors","issue_events_url":"https://api.github.com/repos/mralexgray/Amber/issues/events{/number}","stargazers_count":0,"subscription_url":"https://api.github.com/repos/mralexgray/Amber/subscription","collaborators_url":"https://api.github.com/repos/mralexgray/Amber/collaborators{/collaborator}","issue_comment_url":"https://api.github.com/repos/mralexgray/Amber/issues/comments{/number}","notifications_url":"https://api.github.com/repos/mralexgray/Amber/notifications{?since,all,participating}","open_issues_count":0,"web_commit_signoff_required":false},{"id":10809060,"url":"https://api.github.com/repos/mralexgray/Amethyst","fork":true,"name":"Amethyst","size":12623,"forks":0,"owner":{"id":262517,"url":"https://api.github.com/users/mralexgray","type":"User","login":"mralexgray","node_id":"MDQ6VXNlcjI2MjUxNw==","html_url":"https://github.com/mralexgray","gists_url":"https://api.github.com/users/mralexgray/gists{/gist_id}","repos_url":"https://api.github.com/users/mralexgray/repos","avatar_url":"https://avatars.githubusercontent.com/u/262517?v=4","events_url":"https://api.github.com/users/mralexgray/events{/privacy}","site_admin":false,"gravatar_id":"","starred_url":"https://api.github.com/users/mralexgray/starred{/owner}{/repo}","followers_url":"https://api.github.com/users/mralexgray/followers","following_url":"https://api.github.com/users/mralexgray/following{/other_user}","organizations_url":"https://api.github.com/users/mralexgray/orgs","subscriptions_url":"https://api.github.com/users/mralexgray/subscriptions","received_events_url":"https://api.github.com/users/mralexgray/received_events"},"topics":[],"git_url":"git://github.com/mralexgray/Amethyst.git","license":{"key":"mit","url":"https://api.github.com/licenses/mit","name":"MIT License","node_id":"MDc6TGljZW5zZTEz","spdx_id":"MIT"},"node_id":"MDEwOlJlcG9zaXRvcnkxMDgwOTA2MA==","private":false,"ssh_url":"git@github.com:mralexgray/Amethyst.git","svn_url":"https://github.com/mralexgray/Amethyst","archived":false,"disabled":false,"has_wiki":true,"homepage":"http://ianyh.github.io/Amethyst/","html_url":"https://github.com/mralexgray/Amethyst","keys_url":"https://api.github.com/repos/mralexgray/Amethyst/keys{/key_id}","language":"Objective-C","tags_url":"https://api.github.com/repos/mralexgray/Amethyst/tags","watchers":0,"blobs_url":"https://api.github.com/repos/mralexgray/Amethyst/git/blobs{/sha}","clone_url":"https://github.com/mralexgray/Amethyst.git","forks_url":"https://api.github.com/repos/mralexgray/Amethyst/forks","full_name":"mralexgray/Amethyst","has_pages":false,"hooks_url":"https://api.github.com/repos/mralexgray/Amethyst/hooks","pulls_url":"https://api.github.com/repos/mralexgray/Amethyst/pulls{/number}","pushed_at":"2013-06-18T02:54:11Z","teams_url":"https://api.github.com/repos/mralexgray/Amethyst/teams","trees_url":"https://api.github.com/repos/mralexgray/Amethyst/git/trees{/sha}","created_at":"2013-06-20T00:34:22Z","events_url":"https://api.github.com/repos/mralexgray/Amethyst/events","has_issues":false,"issues_url":"https://api.github.com/repos/mralexgray/Amethyst/issues{/number}","labels_url":"https://api.github.com/repos/mralexgray/Amethyst/labels{/name}","merges_url":"https://api.github.com/repos/mralexgray/Amethyst/merges","mirror_url":null,"updated_at":"2013-06-20T00:34:22Z","visibility":"public","archive_url":"https://api.github.com/repos/mralexgray/Amethyst/{archive_format}{/ref}","commits_url":"https://api.github.com/repos/mralexgray/Amethyst/commits{/sha}","compare_url":"https://api.github.com/repos/mralexgray/Amethyst/compare/{base}...{head}","description":"Tiling window manager for OS X.","forks_count":0,"is_template":false,"open_issues":0,"branches_url":"https://api.github.com/repos/mralexgray/Amethyst/branches{/branch}","comments_url":"https://api.github.com/repos/mralexgray/Amethyst/comments{/number}","contents_url":"https://api.github.com/repos/mralexgray/Amethyst/contents/{+path}","git_refs_url":"https://api.github.com/repos/mralexgray/Amethyst/git/refs{/sha}","git_tags_url":"https://api.github.com/repos/mralexgray/Amethyst/git/tags{/sha}","has_projects":true,"releases_url":"https://api.github.com/repos/mralexgray/Amethyst/releases{/id}","statuses_url":"https://api.github.com/repos/mralexgray/Amethyst/statuses/{sha}","allow_forking":true,"assignees_url":"https://api.github.com/repos/mralexgray/Amethyst/assignees{/user}","downloads_url":"https://api.github.com/repos/mralexgray/Amethyst/downloads","has_downloads":true,"languages_url":"https://api.github.com/repos/mralexgray/Amethyst/languages","default_branch":"master","milestones_url":"https://api.github.com/repos/mralexgray/Amethyst/milestones{/number}","stargazers_url":"https://api.github.com/repos/mralexgray/Amethyst/stargazers","watchers_count":0,"deployments_url":"https://api.github.com/repos/mralexgray/Amethyst/deployments","git_commits_url":"https://api.github.com/repos/mralexgray/Amethyst/git/commits{/sha}","subscribers_url":"https://api.github.com/repos/mralexgray/Amethyst/subscribers","contributors_url":"https://api.github.com/repos/mralexgray/Amethyst/contributors","issue_events_url":"https://api.github.com/repos/mralexgray/Amethyst/issues/events{/number}","stargazers_count":0,"subscription_url":"https://api.github.com/repos/mralexgray/Amethyst/subscription","collaborators_url":"https://api.github.com/repos/mralexgray/Amethyst/collaborators{/collaborator}","issue_comment_url":"https://api.github.com/repos/mralexgray/Amethyst/issues/comments{/number}","notifications_url":"https://api.github.com/repos/mralexgray/Amethyst/notifications{?since,all,participating}","open_issues_count":0,"web_commit_signoff_required":false},{"id":3684286,"url":"https://api.github.com/repos/mralexgray/Animated-Paths","fork":true,"name":"Animated-Paths","size":411,"forks":0,"owner":{"id":262517,"url":"https://api.github.com/users/mralexgray","type":"User","login":"mralexgray","node_id":"MDQ6VXNlcjI2MjUxNw==","html_url":"https://github.com/mralexgray","gists_url":"https://api.github.com/users/mralexgray/gists{/gist_id}","repos_url":"https://api.github.com/users/mralexgray/repos","avatar_url":"https://avatars.githubusercontent.com/u/262517?v=4","events_url":"https://api.github.com/users/mralexgray/events{/privacy}","site_admin":false,"gravatar_id":"","starred_url":"https://api.github.com/users/mralexgray/starred{/owner}{/repo}","followers_url":"https://api.github.com/users/mralexgray/followers","following_url":"https://api.github.com/users/mralexgray/following{/other_user}","organizations_url":"https://api.github.com/users/mralexgray/orgs","subscriptions_url":"https://api.github.com/users/mralexgray/subscriptions","received_events_url":"https://api.github.com/users/mralexgray/received_events"},"topics":[],"git_url":"git://github.com/mralexgray/Animated-Paths.git","license":{"key":"other","url":null,"name":"Other","node_id":"MDc6TGljZW5zZTA=","spdx_id":"NOASSERTION"},"node_id":"MDEwOlJlcG9zaXRvcnkzNjg0Mjg2","private":false,"ssh_url":"git@github.com:mralexgray/Animated-Paths.git","svn_url":"https://github.com/mralexgray/Animated-Paths","archived":false,"disabled":false,"has_wiki":true,"homepage":"http://oleb.net/blog/2010/12/animating-drawing-of-cgpath-with-cashapelayer/","html_url":"https://github.com/mralexgray/Animated-Paths","keys_url":"https://api.github.com/repos/mralexgray/Animated-Paths/keys{/key_id}","language":"Objective-C","tags_url":"https://api.github.com/repos/mralexgray/Animated-Paths/tags","watchers":2,"blobs_url":"https://api.github.com/repos/mralexgray/Animated-Paths/git/blobs{/sha}","clone_url":"https://github.com/mralexgray/Animated-Paths.git","forks_url":"https://api.github.com/repos/mralexgray/Animated-Paths/forks","full_name":"mralexgray/Animated-Paths","has_pages":false,"hooks_url":"https://api.github.com/repos/mralexgray/Animated-Paths/hooks","pulls_url":"https://api.github.com/repos/mralexgray/Animated-Paths/pulls{/number}","pushed_at":"2010-12-30T20:56:51Z","teams_url":"https://api.github.com/repos/mralexgray/Animated-Paths/teams","trees_url":"https://api.github.com/repos/mralexgray/Animated-Paths/git/trees{/sha}","created_at":"2012-03-11T02:56:38Z","events_url":"https://api.github.com/repos/mralexgray/Animated-Paths/events","has_issues":false,"issues_url":"https://api.github.com/repos/mralexgray/Animated-Paths/issues{/number}","labels_url":"https://api.github.com/repos/mralexgray/Animated-Paths/labels{/name}","merges_url":"https://api.github.com/repos/mralexgray/Animated-Paths/merges","mirror_url":null,"updated_at":"2013-01-08T04:12:21Z","visibility":"public","archive_url":"https://api.github.com/repos/mralexgray/Animated-Paths/{archive_format}{/ref}","commits_url":"https://api.github.com/repos/mralexgray/Animated-Paths/commits{/sha}","compare_url":"https://api.github.com/repos/mralexgray/Animated-Paths/compare/{base}...{head}","description":"Demo project: Animating the drawing of a CGPath with CAShapeLayer.strokeEnd","forks_count":0,"is_template":false,"open_issues":0,"branches_url":"https://api.github.com/repos/mralexgray/Animated-Paths/branches{/branch}","comments_url":"https://api.github.com/repos/mralexgray/Animated-Paths/comments{/number}","contents_url":"https://api.github.com/repos/mralexgray/Animated-Paths/contents/{+path}","git_refs_url":"https://api.github.com/repos/mralexgray/Animated-Paths/git/refs{/sha}","git_tags_url":"https://api.github.com/repos/mralexgray/Animated-Paths/git/tags{/sha}","has_projects":true,"releases_url":"https://api.github.com/repos/mralexgray/Animated-Paths/releases{/id}","statuses_url":"https://api.github.com/repos/mralexgray/Animated-Paths/statuses/{sha}","allow_forking":true,"assignees_url":"https://api.github.com/repos/mralexgray/Animated-Paths/assignees{/user}","downloads_url":"https://api.github.com/repos/mralexgray/Animated-Paths/downloads","has_downloads":true,"languages_url":"https://api.github.com/repos/mralexgray/Animated-Paths/languages","default_branch":"master","milestones_url":"https://api.github.com/repos/mralexgray/Animated-Paths/milestones{/number}","stargazers_url":"https://api.github.com/repos/mralexgray/Animated-Paths/stargazers","watchers_count":2,"deployments_url":"https://api.github.com/repos/mralexgray/Animated-Paths/deployments","git_commits_url":"https://api.github.com/repos/mralexgray/Animated-Paths/git/commits{/sha}","subscribers_url":"https://api.github.com/repos/mralexgray/Animated-Paths/subscribers","contributors_url":"https://api.github.com/repos/mralexgray/Animated-Paths/contributors","issue_events_url":"https://api.github.com/repos/mralexgray/Animated-Paths/issues/events{/number}","stargazers_count":2,"subscription_url":"https://api.github.com/repos/mralexgray/Animated-Paths/subscription","collaborators_url":"https://api.github.com/repos/mralexgray/Animated-Paths/collaborators{/collaborator}","issue_comment_url":"https://api.github.com/repos/mralexgray/Animated-Paths/issues/comments{/number}","notifications_url":"https://api.github.com/repos/mralexgray/Animated-Paths/notifications{?since,all,participating}","open_issues_count":0,"web_commit_signoff_required":false},{"id":16662874,"url":"https://api.github.com/repos/mralexgray/AnsiLove.framework","fork":true,"name":"AnsiLove.framework","size":3780,"forks":0,"owner":{"id":262517,"url":"https://api.github.com/users/mralexgray","type":"User","login":"mralexgray","node_id":"MDQ6VXNlcjI2MjUxNw==","html_url":"https://github.com/mralexgray","gists_url":"https://api.github.com/users/mralexgray/gists{/gist_id}","repos_url":"https://api.github.com/users/mralexgray/repos","avatar_url":"https://avatars.githubusercontent.com/u/262517?v=4","events_url":"https://api.github.com/users/mralexgray/events{/privacy}","site_admin":false,"gravatar_id":"","starred_url":"https://api.github.com/users/mralexgray/starred{/owner}{/repo}","followers_url":"https://api.github.com/users/mralexgray/followers","following_url":"https://api.github.com/users/mralexgray/following{/other_user}","organizations_url":"https://api.github.com/users/mralexgray/orgs","subscriptions_url":"https://api.github.com/users/mralexgray/subscriptions","received_events_url":"https://api.github.com/users/mralexgray/received_events"},"topics":[],"git_url":"git://github.com/mralexgray/AnsiLove.framework.git","license":{"key":"other","url":null,"name":"Other","node_id":"MDc6TGljZW5zZTA=","spdx_id":"NOASSERTION"},"node_id":"MDEwOlJlcG9zaXRvcnkxNjY2Mjg3NA==","private":false,"ssh_url":"git@github.com:mralexgray/AnsiLove.framework.git","svn_url":"https://github.com/mralexgray/AnsiLove.framework","archived":false,"disabled":false,"has_wiki":false,"homepage":"http://byteproject.net","html_url":"https://github.com/mralexgray/AnsiLove.framework","keys_url":"https://api.github.com/repos/mralexgray/AnsiLove.framework/keys{/key_id}","language":"M","tags_url":"https://api.github.com/repos/mralexgray/AnsiLove.framework/tags","watchers":0,"blobs_url":"https://api.github.com/repos/mralexgray/AnsiLove.framework/git/blobs{/sha}","clone_url":"https://github.com/mralexgray/AnsiLove.framework.git","forks_url":"https://api.github.com/repos/mralexgray/AnsiLove.framework/forks","full_name":"mralexgray/AnsiLove.framework","has_pages":false,"hooks_url":"https://api.github.com/repos/mralexgray/AnsiLove.framework/hooks","pulls_url":"https://api.github.com/repos/mralexgray/AnsiLove.framework/pulls{/number}","pushed_at":"2013-10-04T14:08:38Z","teams_url":"https://api.github.com/repos/mralexgray/AnsiLove.framework/teams","trees_url":"https://api.github.com/repos/mralexgray/AnsiLove.framework/git/trees{/sha}","created_at":"2014-02-09T08:30:27Z","events_url":"https://api.github.com/repos/mralexgray/AnsiLove.framework/events","has_issues":false,"issues_url":"https://api.github.com/repos/mralexgray/AnsiLove.framework/issues{/number}","labels_url":"https://api.github.com/repos/mralexgray/AnsiLove.framework/labels{/name}","merges_url":"https://api.github.com/repos/mralexgray/AnsiLove.framework/merges","mirror_url":null,"updated_at":"2015-01-13T20:41:46Z","visibility":"public","archive_url":"https://api.github.com/repos/mralexgray/AnsiLove.framework/{archive_format}{/ref}","commits_url":"https://api.github.com/repos/mralexgray/AnsiLove.framework/commits{/sha}","compare_url":"https://api.github.com/repos/mralexgray/AnsiLove.framework/compare/{base}...{head}","description":"Cocoa Framework for rendering ANSi / ASCII art","forks_count":0,"is_template":false,"open_issues":0,"branches_url":"https://api.github.com/repos/mralexgray/AnsiLove.framework/branches{/branch}","comments_url":"https://api.github.com/repos/mralexgray/AnsiLove.framework/comments{/number}","contents_url":"https://api.github.com/repos/mralexgray/AnsiLove.framework/contents/{+path}","git_refs_url":"https://api.github.com/repos/mralexgray/AnsiLove.framework/git/refs{/sha}","git_tags_url":"https://api.github.com/repos/mralexgray/AnsiLove.framework/git/tags{/sha}","has_projects":true,"releases_url":"https://api.github.com/repos/mralexgray/AnsiLove.framework/releases{/id}","statuses_url":"https://api.github.com/repos/mralexgray/AnsiLove.framework/statuses/{sha}","allow_forking":true,"assignees_url":"https://api.github.com/repos/mralexgray/AnsiLove.framework/assignees{/user}","downloads_url":"https://api.github.com/repos/mralexgray/AnsiLove.framework/downloads","has_downloads":true,"languages_url":"https://api.github.com/repos/mralexgray/AnsiLove.framework/languages","default_branch":"master","milestones_url":"https://api.github.com/repos/mralexgray/AnsiLove.framework/milestones{/number}","stargazers_url":"https://api.github.com/repos/mralexgray/AnsiLove.framework/stargazers","watchers_count":0,"deployments_url":"https://api.github.com/repos/mralexgray/AnsiLove.framework/deployments","git_commits_url":"https://api.github.com/repos/mralexgray/AnsiLove.framework/git/commits{/sha}","subscribers_url":"https://api.github.com/repos/mralexgray/AnsiLove.framework/subscribers","contributors_url":"https://api.github.com/repos/mralexgray/AnsiLove.framework/contributors","issue_events_url":"https://api.github.com/repos/mralexgray/AnsiLove.framework/issues/events{/number}","stargazers_count":0,"subscription_url":"https://api.github.com/repos/mralexgray/AnsiLove.framework/subscription","collaborators_url":"https://api.github.com/repos/mralexgray/AnsiLove.framework/collaborators{/collaborator}","issue_comment_url":"https://api.github.com/repos/mralexgray/AnsiLove.framework/issues/comments{/number}","notifications_url":"https://api.github.com/repos/mralexgray/AnsiLove.framework/notifications{?since,all,participating}","open_issues_count":0,"web_commit_signoff_required":false},{"id":5189563,"url":"https://api.github.com/repos/mralexgray/ANTrackBar","fork":true,"name":"ANTrackBar","size":94,"forks":0,"owner":{"id":262517,"url":"https://api.github.com/users/mralexgray","type":"User","login":"mralexgray","node_id":"MDQ6VXNlcjI2MjUxNw==","html_url":"https://github.com/mralexgray","gists_url":"https://api.github.com/users/mralexgray/gists{/gist_id}","repos_url":"https://api.github.com/users/mralexgray/repos","avatar_url":"https://avatars.githubusercontent.com/u/262517?v=4","events_url":"https://api.github.com/users/mralexgray/events{/privacy}","site_admin":false,"gravatar_id":"","starred_url":"https://api.github.com/users/mralexgray/starred{/owner}{/repo}","followers_url":"https://api.github.com/users/mralexgray/followers","following_url":"https://api.github.com/users/mralexgray/following{/other_user}","organizations_url":"https://api.github.com/users/mralexgray/orgs","subscriptions_url":"https://api.github.com/users/mralexgray/subscriptions","received_events_url":"https://api.github.com/users/mralexgray/received_events"},"topics":[],"git_url":"git://github.com/mralexgray/ANTrackBar.git","license":null,"node_id":"MDEwOlJlcG9zaXRvcnk1MTg5NTYz","private":false,"ssh_url":"git@github.com:mralexgray/ANTrackBar.git","svn_url":"https://github.com/mralexgray/ANTrackBar","archived":false,"disabled":false,"has_wiki":true,"homepage":"","html_url":"https://github.com/mralexgray/ANTrackBar","keys_url":"https://api.github.com/repos/mralexgray/ANTrackBar/keys{/key_id}","language":"Objective-C","tags_url":"https://api.github.com/repos/mralexgray/ANTrackBar/tags","watchers":2,"blobs_url":"https://api.github.com/repos/mralexgray/ANTrackBar/git/blobs{/sha}","clone_url":"https://github.com/mralexgray/ANTrackBar.git","forks_url":"https://api.github.com/repos/mralexgray/ANTrackBar/forks","full_name":"mralexgray/ANTrackBar","has_pages":false,"hooks_url":"https://api.github.com/repos/mralexgray/ANTrackBar/hooks","pulls_url":"https://api.github.com/repos/mralexgray/ANTrackBar/pulls{/number}","pushed_at":"2012-03-09T01:40:02Z","teams_url":"https://api.github.com/repos/mralexgray/ANTrackBar/teams","trees_url":"https://api.github.com/repos/mralexgray/ANTrackBar/git/trees{/sha}","created_at":"2012-07-26T08:17:22Z","events_url":"https://api.github.com/repos/mralexgray/ANTrackBar/events","has_issues":false,"issues_url":"https://api.github.com/repos/mralexgray/ANTrackBar/issues{/number}","labels_url":"https://api.github.com/repos/mralexgray/ANTrackBar/labels{/name}","merges_url":"https://api.github.com/repos/mralexgray/ANTrackBar/merges","mirror_url":null,"updated_at":"2013-01-11T10:29:56Z","visibility":"public","archive_url":"https://api.github.com/repos/mralexgray/ANTrackBar/{archive_format}{/ref}","commits_url":"https://api.github.com/repos/mralexgray/ANTrackBar/commits{/sha}","compare_url":"https://api.github.com/repos/mralexgray/ANTrackBar/compare/{base}...{head}","description":"An easy-to-use Cocoa seek bar with a pleasing appearance","forks_count":0,"is_template":false,"open_issues":0,"branches_url":"https://api.github.com/repos/mralexgray/ANTrackBar/branches{/branch}","comments_url":"https://api.github.com/repos/mralexgray/ANTrackBar/comments{/number}","contents_url":"https://api.github.com/repos/mralexgray/ANTrackBar/contents/{+path}","git_refs_url":"https://api.github.com/repos/mralexgray/ANTrackBar/git/refs{/sha}","git_tags_url":"https://api.github.com/repos/mralexgray/ANTrackBar/git/tags{/sha}","has_projects":true,"releases_url":"https://api.github.com/repos/mralexgray/ANTrackBar/releases{/id}","statuses_url":"https://api.github.com/repos/mralexgray/ANTrackBar/statuses/{sha}","allow_forking":true,"assignees_url":"https://api.github.com/repos/mralexgray/ANTrackBar/assignees{/user}","downloads_url":"https://api.github.com/repos/mralexgray/ANTrackBar/downloads","has_downloads":true,"languages_url":"https://api.github.com/repos/mralexgray/ANTrackBar/languages","default_branch":"master","milestones_url":"https://api.github.com/repos/mralexgray/ANTrackBar/milestones{/number}","stargazers_url":"https://api.github.com/repos/mralexgray/ANTrackBar/stargazers","watchers_count":2,"deployments_url":"https://api.github.com/repos/mralexgray/ANTrackBar/deployments","git_commits_url":"https://api.github.com/repos/mralexgray/ANTrackBar/git/commits{/sha}","subscribers_url":"https://api.github.com/repos/mralexgray/ANTrackBar/subscribers","contributors_url":"https://api.github.com/repos/mralexgray/ANTrackBar/contributors","issue_events_url":"https://api.github.com/repos/mralexgray/ANTrackBar/issues/events{/number}","stargazers_count":2,"subscription_url":"https://api.github.com/repos/mralexgray/ANTrackBar/subscription","collaborators_url":"https://api.github.com/repos/mralexgray/ANTrackBar/collaborators{/collaborator}","issue_comment_url":"https://api.github.com/repos/mralexgray/ANTrackBar/issues/comments{/number}","notifications_url":"https://api.github.com/repos/mralexgray/ANTrackBar/notifications{?since,all,participating}","open_issues_count":0,"web_commit_signoff_required":false},{"id":16240152,"url":"https://api.github.com/repos/mralexgray/AOP-in-Objective-C","fork":true,"name":"AOP-in-Objective-C","size":340,"forks":1,"owner":{"id":262517,"url":"https://api.github.com/users/mralexgray","type":"User","login":"mralexgray","node_id":"MDQ6VXNlcjI2MjUxNw==","html_url":"https://github.com/mralexgray","gists_url":"https://api.github.com/users/mralexgray/gists{/gist_id}","repos_url":"https://api.github.com/users/mralexgray/repos","avatar_url":"https://avatars.githubusercontent.com/u/262517?v=4","events_url":"https://api.github.com/users/mralexgray/events{/privacy}","site_admin":false,"gravatar_id":"","starred_url":"https://api.github.com/users/mralexgray/starred{/owner}{/repo}","followers_url":"https://api.github.com/users/mralexgray/followers","following_url":"https://api.github.com/users/mralexgray/following{/other_user}","organizations_url":"https://api.github.com/users/mralexgray/orgs","subscriptions_url":"https://api.github.com/users/mralexgray/subscriptions","received_events_url":"https://api.github.com/users/mralexgray/received_events"},"topics":[],"git_url":"git://github.com/mralexgray/AOP-in-Objective-C.git","license":null,"node_id":"MDEwOlJlcG9zaXRvcnkxNjI0MDE1Mg==","private":false,"ssh_url":"git@github.com:mralexgray/AOP-in-Objective-C.git","svn_url":"https://github.com/mralexgray/AOP-in-Objective-C","archived":false,"disabled":false,"has_wiki":true,"homepage":"http://innoli.hu/en/opensource/","html_url":"https://github.com/mralexgray/AOP-in-Objective-C","keys_url":"https://api.github.com/repos/mralexgray/AOP-in-Objective-C/keys{/key_id}","language":"Objective-C","tags_url":"https://api.github.com/repos/mralexgray/AOP-in-Objective-C/tags","watchers":0,"blobs_url":"https://api.github.com/repos/mralexgray/AOP-in-Objective-C/git/blobs{/sha}","clone_url":"https://github.com/mralexgray/AOP-in-Objective-C.git","forks_url":"https://api.github.com/repos/mralexgray/AOP-in-Objective-C/forks","full_name":"mralexgray/AOP-in-Objective-C","has_pages":false,"hooks_url":"https://api.github.com/repos/mralexgray/AOP-in-Objective-C/hooks","pulls_url":"https://api.github.com/repos/mralexgray/AOP-in-Objective-C/pulls{/number}","pushed_at":"2014-02-12T16:23:20Z","teams_url":"https://api.github.com/repos/mralexgray/AOP-in-Objective-C/teams","trees_url":"https://api.github.com/repos/mralexgray/AOP-in-Objective-C/git/trees{/sha}","created_at":"2014-01-25T21:18:04Z","events_url":"https://api.github.com/repos/mralexgray/AOP-in-Objective-C/events","has_issues":false,"issues_url":"https://api.github.com/repos/mralexgray/AOP-in-Objective-C/issues{/number}","labels_url":"https://api.github.com/repos/mralexgray/AOP-in-Objective-C/labels{/name}","merges_url":"https://api.github.com/repos/mralexgray/AOP-in-Objective-C/merges","mirror_url":null,"updated_at":"2014-06-19T19:38:12Z","visibility":"public","archive_url":"https://api.github.com/repos/mralexgray/AOP-in-Objective-C/{archive_format}{/ref}","commits_url":"https://api.github.com/repos/mralexgray/AOP-in-Objective-C/commits{/sha}","compare_url":"https://api.github.com/repos/mralexgray/AOP-in-Objective-C/compare/{base}...{head}","description":"An NSProxy based library for easily enabling AOP like functionality in Objective-C.","forks_count":1,"is_template":false,"open_issues":0,"branches_url":"https://api.github.com/repos/mralexgray/AOP-in-Objective-C/branches{/branch}","comments_url":"https://api.github.com/repos/mralexgray/AOP-in-Objective-C/comments{/number}","contents_url":"https://api.github.com/repos/mralexgray/AOP-in-Objective-C/contents/{+path}","git_refs_url":"https://api.github.com/repos/mralexgray/AOP-in-Objective-C/git/refs{/sha}","git_tags_url":"https://api.github.com/repos/mralexgray/AOP-in-Objective-C/git/tags{/sha}","has_projects":true,"releases_url":"https://api.github.com/repos/mralexgray/AOP-in-Objective-C/releases{/id}","statuses_url":"https://api.github.com/repos/mralexgray/AOP-in-Objective-C/statuses/{sha}","allow_forking":true,"assignees_url":"https://api.github.com/repos/mralexgray/AOP-in-Objective-C/assignees{/user}","downloads_url":"https://api.github.com/repos/mralexgray/AOP-in-Objective-C/downloads","has_downloads":true,"languages_url":"https://api.github.com/repos/mralexgray/AOP-in-Objective-C/languages","default_branch":"travis-coveralls","milestones_url":"https://api.github.com/repos/mralexgray/AOP-in-Objective-C/milestones{/number}","stargazers_url":"https://api.github.com/repos/mralexgray/AOP-in-Objective-C/stargazers","watchers_count":0,"deployments_url":"https://api.github.com/repos/mralexgray/AOP-in-Objective-C/deployments","git_commits_url":"https://api.github.com/repos/mralexgray/AOP-in-Objective-C/git/commits{/sha}","subscribers_url":"https://api.github.com/repos/mralexgray/AOP-in-Objective-C/subscribers","contributors_url":"https://api.github.com/repos/mralexgray/AOP-in-Objective-C/contributors","issue_events_url":"https://api.github.com/repos/mralexgray/AOP-in-Objective-C/issues/events{/number}","stargazers_count":0,"subscription_url":"https://api.github.com/repos/mralexgray/AOP-in-Objective-C/subscription","collaborators_url":"https://api.github.com/repos/mralexgray/AOP-in-Objective-C/collaborators{/collaborator}","issue_comment_url":"https://api.github.com/repos/mralexgray/AOP-in-Objective-C/issues/comments{/number}","notifications_url":"https://api.github.com/repos/mralexgray/AOP-in-Objective-C/notifications{?since,all,participating}","open_issues_count":0,"web_commit_signoff_required":false},{"id":13141936,"url":"https://api.github.com/repos/mralexgray/Apaxy","fork":true,"name":"Apaxy","size":113,"forks":0,"owner":{"id":262517,"url":"https://api.github.com/users/mralexgray","type":"User","login":"mralexgray","node_id":"MDQ6VXNlcjI2MjUxNw==","html_url":"https://github.com/mralexgray","gists_url":"https://api.github.com/users/mralexgray/gists{/gist_id}","repos_url":"https://api.github.com/users/mralexgray/repos","avatar_url":"https://avatars.githubusercontent.com/u/262517?v=4","events_url":"https://api.github.com/users/mralexgray/events{/privacy}","site_admin":false,"gravatar_id":"","starred_url":"https://api.github.com/users/mralexgray/starred{/owner}{/repo}","followers_url":"https://api.github.com/users/mralexgray/followers","following_url":"https://api.github.com/users/mralexgray/following{/other_user}","organizations_url":"https://api.github.com/users/mralexgray/orgs","subscriptions_url":"https://api.github.com/users/mralexgray/subscriptions","received_events_url":"https://api.github.com/users/mralexgray/received_events"},"topics":[],"git_url":"git://github.com/mralexgray/Apaxy.git","license":{"key":"unlicense","url":"https://api.github.com/licenses/unlicense","name":"The Unlicense","node_id":"MDc6TGljZW5zZTE1","spdx_id":"Unlicense"},"node_id":"MDEwOlJlcG9zaXRvcnkxMzE0MTkzNg==","private":false,"ssh_url":"git@github.com:mralexgray/Apaxy.git","svn_url":"https://github.com/mralexgray/Apaxy","archived":false,"disabled":false,"has_wiki":true,"homepage":null,"html_url":"https://github.com/mralexgray/Apaxy","keys_url":"https://api.github.com/repos/mralexgray/Apaxy/keys{/key_id}","language":"CSS","tags_url":"https://api.github.com/repos/mralexgray/Apaxy/tags","watchers":0,"blobs_url":"https://api.github.com/repos/mralexgray/Apaxy/git/blobs{/sha}","clone_url":"https://github.com/mralexgray/Apaxy.git","forks_url":"https://api.github.com/repos/mralexgray/Apaxy/forks","full_name":"mralexgray/Apaxy","has_pages":false,"hooks_url":"https://api.github.com/repos/mralexgray/Apaxy/hooks","pulls_url":"https://api.github.com/repos/mralexgray/Apaxy/pulls{/number}","pushed_at":"2013-08-02T16:01:32Z","teams_url":"https://api.github.com/repos/mralexgray/Apaxy/teams","trees_url":"https://api.github.com/repos/mralexgray/Apaxy/git/trees{/sha}","created_at":"2013-09-27T05:05:35Z","events_url":"https://api.github.com/repos/mralexgray/Apaxy/events","has_issues":false,"issues_url":"https://api.github.com/repos/mralexgray/Apaxy/issues{/number}","labels_url":"https://api.github.com/repos/mralexgray/Apaxy/labels{/name}","merges_url":"https://api.github.com/repos/mralexgray/Apaxy/merges","mirror_url":null,"updated_at":"2018-02-16T21:40:24Z","visibility":"public","archive_url":"https://api.github.com/repos/mralexgray/Apaxy/{archive_format}{/ref}","commits_url":"https://api.github.com/repos/mralexgray/Apaxy/commits{/sha}","compare_url":"https://api.github.com/repos/mralexgray/Apaxy/compare/{base}...{head}","description":"A simple, customisable theme for your Apache directory listing.","forks_count":0,"is_template":false,"open_issues":0,"branches_url":"https://api.github.com/repos/mralexgray/Apaxy/branches{/branch}","comments_url":"https://api.github.com/repos/mralexgray/Apaxy/comments{/number}","contents_url":"https://api.github.com/repos/mralexgray/Apaxy/contents/{+path}","git_refs_url":"https://api.github.com/repos/mralexgray/Apaxy/git/refs{/sha}","git_tags_url":"https://api.github.com/repos/mralexgray/Apaxy/git/tags{/sha}","has_projects":true,"releases_url":"https://api.github.com/repos/mralexgray/Apaxy/releases{/id}","statuses_url":"https://api.github.com/repos/mralexgray/Apaxy/statuses/{sha}","allow_forking":true,"assignees_url":"https://api.github.com/repos/mralexgray/Apaxy/assignees{/user}","downloads_url":"https://api.github.com/repos/mralexgray/Apaxy/downloads","has_downloads":true,"languages_url":"https://api.github.com/repos/mralexgray/Apaxy/languages","default_branch":"master","milestones_url":"https://api.github.com/repos/mralexgray/Apaxy/milestones{/number}","stargazers_url":"https://api.github.com/repos/mralexgray/Apaxy/stargazers","watchers_count":0,"deployments_url":"https://api.github.com/repos/mralexgray/Apaxy/deployments","git_commits_url":"https://api.github.com/repos/mralexgray/Apaxy/git/commits{/sha}","subscribers_url":"https://api.github.com/repos/mralexgray/Apaxy/subscribers","contributors_url":"https://api.github.com/repos/mralexgray/Apaxy/contributors","issue_events_url":"https://api.github.com/repos/mralexgray/Apaxy/issues/events{/number}","stargazers_count":0,"subscription_url":"https://api.github.com/repos/mralexgray/Apaxy/subscription","collaborators_url":"https://api.github.com/repos/mralexgray/Apaxy/collaborators{/collaborator}","issue_comment_url":"https://api.github.com/repos/mralexgray/Apaxy/issues/comments{/number}","notifications_url":"https://api.github.com/repos/mralexgray/Apaxy/notifications{?since,all,participating}","open_issues_count":0,"web_commit_signoff_required":false},{"id":20027360,"url":"https://api.github.com/repos/mralexgray/app","fork":true,"name":"app","size":1890,"forks":0,"owner":{"id":262517,"url":"https://api.github.com/users/mralexgray","type":"User","login":"mralexgray","node_id":"MDQ6VXNlcjI2MjUxNw==","html_url":"https://github.com/mralexgray","gists_url":"https://api.github.com/users/mralexgray/gists{/gist_id}","repos_url":"https://api.github.com/users/mralexgray/repos","avatar_url":"https://avatars.githubusercontent.com/u/262517?v=4","events_url":"https://api.github.com/users/mralexgray/events{/privacy}","site_admin":false,"gravatar_id":"","starred_url":"https://api.github.com/users/mralexgray/starred{/owner}{/repo}","followers_url":"https://api.github.com/users/mralexgray/followers","following_url":"https://api.github.com/users/mralexgray/following{/other_user}","organizations_url":"https://api.github.com/users/mralexgray/orgs","subscriptions_url":"https://api.github.com/users/mralexgray/subscriptions","received_events_url":"https://api.github.com/users/mralexgray/received_events"},"topics":[],"git_url":"git://github.com/mralexgray/app.git","license":{"key":"other","url":null,"name":"Other","node_id":"MDc6TGljZW5zZTA=","spdx_id":"NOASSERTION"},"node_id":"MDEwOlJlcG9zaXRvcnkyMDAyNzM2MA==","private":false,"ssh_url":"git@github.com:mralexgray/app.git","svn_url":"https://github.com/mralexgray/app","archived":false,"disabled":false,"has_wiki":true,"homepage":null,"html_url":"https://github.com/mralexgray/app","keys_url":"https://api.github.com/repos/mralexgray/app/keys{/key_id}","language":"JavaScript","tags_url":"https://api.github.com/repos/mralexgray/app/tags","watchers":0,"blobs_url":"https://api.github.com/repos/mralexgray/app/git/blobs{/sha}","clone_url":"https://github.com/mralexgray/app.git","forks_url":"https://api.github.com/repos/mralexgray/app/forks","full_name":"mralexgray/app","has_pages":false,"hooks_url":"https://api.github.com/repos/mralexgray/app/hooks","pulls_url":"https://api.github.com/repos/mralexgray/app/pulls{/number}","pushed_at":"2014-05-20T19:51:38Z","teams_url":"https://api.github.com/repos/mralexgray/app/teams","trees_url":"https://api.github.com/repos/mralexgray/app/git/trees{/sha}","created_at":"2014-05-21T15:54:20Z","events_url":"https://api.github.com/repos/mralexgray/app/events","has_issues":false,"issues_url":"https://api.github.com/repos/mralexgray/app/issues{/number}","labels_url":"https://api.github.com/repos/mralexgray/app/labels{/name}","merges_url":"https://api.github.com/repos/mralexgray/app/merges","mirror_url":null,"updated_at":"2014-05-21T15:54:22Z","visibility":"public","archive_url":"https://api.github.com/repos/mralexgray/app/{archive_format}{/ref}","commits_url":"https://api.github.com/repos/mralexgray/app/commits{/sha}","compare_url":"https://api.github.com/repos/mralexgray/app/compare/{base}...{head}","description":"Instant mobile web app creation","forks_count":0,"is_template":false,"open_issues":0,"branches_url":"https://api.github.com/repos/mralexgray/app/branches{/branch}","comments_url":"https://api.github.com/repos/mralexgray/app/comments{/number}","contents_url":"https://api.github.com/repos/mralexgray/app/contents/{+path}","git_refs_url":"https://api.github.com/repos/mralexgray/app/git/refs{/sha}","git_tags_url":"https://api.github.com/repos/mralexgray/app/git/tags{/sha}","has_projects":true,"releases_url":"https://api.github.com/repos/mralexgray/app/releases{/id}","statuses_url":"https://api.github.com/repos/mralexgray/app/statuses/{sha}","allow_forking":true,"assignees_url":"https://api.github.com/repos/mralexgray/app/assignees{/user}","downloads_url":"https://api.github.com/repos/mralexgray/app/downloads","has_downloads":true,"languages_url":"https://api.github.com/repos/mralexgray/app/languages","default_branch":"master","milestones_url":"https://api.github.com/repos/mralexgray/app/milestones{/number}","stargazers_url":"https://api.github.com/repos/mralexgray/app/stargazers","watchers_count":0,"deployments_url":"https://api.github.com/repos/mralexgray/app/deployments","git_commits_url":"https://api.github.com/repos/mralexgray/app/git/commits{/sha}","subscribers_url":"https://api.github.com/repos/mralexgray/app/subscribers","contributors_url":"https://api.github.com/repos/mralexgray/app/contributors","issue_events_url":"https://api.github.com/repos/mralexgray/app/issues/events{/number}","stargazers_count":0,"subscription_url":"https://api.github.com/repos/mralexgray/app/subscription","collaborators_url":"https://api.github.com/repos/mralexgray/app/collaborators{/collaborator}","issue_comment_url":"https://api.github.com/repos/mralexgray/app/issues/comments{/number}","notifications_url":"https://api.github.com/repos/mralexgray/app/notifications{?since,all,participating}","open_issues_count":0,"web_commit_signoff_required":false}],"name":"Shirt","revenue":4.99},"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"},{"name":"Page View","type":"page","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":"5f58d1f7-cbd6-4bff-8571-9933be7210b1","timestamp":"2020-02-02T00:23:09.544Z","properties":{"path":"/","title":"Home"},"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"}]', + destConfig: { + clientContext: '', + lambda: 'testFunction', + invocationType: 'Event', + }, + }, + metadata: [ + { + userId: 'anon-id-new<<>>identified user id', + jobId: 32, + sourceId: '2DTlLPQxignYp4ag9sISgGN2uY7', + destinationId: '2DTozIMGtBwTGNJtuvdPByFSL2Z', + attemptNum: 0, + receivedAt: '2022-08-18T08:43:13.521+05:30', + createdAt: '2022-08-18T03:13:15.549Z', + firstAttemptedAt: '', + transformAt: 'router', + workspaceId: '2DTlBMipxWfJZzZ1SsjELQWvkwd', + secret: null, + jobsT: { + UUID: 'dc239cd1-bef4-4999-88e1-7332c64bf78c', + JobID: 32, + UserID: 'anon-id-new<<>>identified user id', + CreatedAt: '2022-08-18T03:13:15.549078Z', + ExpireAt: '2022-08-18T03:13:15.549078Z', + CustomVal: 'LAMBDA', + EventCount: 1, + EventPayload: { + type: 'track', + event: 'Product Purchased new', + 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: '9f8fb785-c720-4381-a009-bf22a13f4ced', + timestamp: '2020-02-02T00:23:09.544Z', + properties: { + data: [ + { + id: 6104546, + url: 'https://api.github.com/repos/mralexgray/-REPONAME', + fork: false, + name: '-REPONAME', + size: 48, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/-REPONAME.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnk2MTA0NTQ2', + private: false, + ssh_url: 'git@github.com:mralexgray/-REPONAME.git', + svn_url: 'https://github.com/mralexgray/-REPONAME', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/-REPONAME', + keys_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/keys{/key_id}', + language: null, + tags_url: 'https://api.github.com/repos/mralexgray/-REPONAME/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/-REPONAME.git', + forks_url: 'https://api.github.com/repos/mralexgray/-REPONAME/forks', + full_name: 'mralexgray/-REPONAME', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/-REPONAME/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/pulls{/number}', + pushed_at: '2012-10-06T16:37:39Z', + teams_url: 'https://api.github.com/repos/mralexgray/-REPONAME/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/git/trees{/sha}', + created_at: '2012-10-06T16:37:39Z', + events_url: 'https://api.github.com/repos/mralexgray/-REPONAME/events', + has_issues: true, + issues_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/-REPONAME/merges', + mirror_url: null, + updated_at: '2013-01-12T13:39:30Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/compare/{base}...{head}', + description: null, + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 104510411, + url: 'https://api.github.com/repos/mralexgray/...', + fork: true, + name: '...', + size: 113, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/....git', + license: { + key: 'mit', + url: 'https://api.github.com/licenses/mit', + name: 'MIT License', + node_id: 'MDc6TGljZW5zZTEz', + spdx_id: 'MIT', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkxMDQ1MTA0MTE=', + private: false, + ssh_url: 'git@github.com:mralexgray/....git', + svn_url: 'https://github.com/mralexgray/...', + archived: false, + disabled: false, + has_wiki: false, + homepage: 'https://driesvints.com/blog/getting-started-with-dotfiles', + html_url: 'https://github.com/mralexgray/...', + keys_url: 'https://api.github.com/repos/mralexgray/.../keys{/key_id}', + language: 'Shell', + tags_url: 'https://api.github.com/repos/mralexgray/.../tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/.../git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/....git', + forks_url: 'https://api.github.com/repos/mralexgray/.../forks', + full_name: 'mralexgray/...', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/.../hooks', + pulls_url: 'https://api.github.com/repos/mralexgray/.../pulls{/number}', + pushed_at: '2017-09-15T08:27:32Z', + teams_url: 'https://api.github.com/repos/mralexgray/.../teams', + trees_url: + 'https://api.github.com/repos/mralexgray/.../git/trees{/sha}', + created_at: '2017-09-22T19:19:42Z', + events_url: 'https://api.github.com/repos/mralexgray/.../events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/.../issues{/number}', + labels_url: 'https://api.github.com/repos/mralexgray/.../labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/.../merges', + mirror_url: null, + updated_at: '2017-09-22T19:20:22Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/.../{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/.../commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/.../compare/{base}...{head}', + description: ':computer: Public repo for my personal dotfiles.', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/.../branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/.../comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/.../contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/.../git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/.../git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/.../releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/.../statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/.../assignees{/user}', + downloads_url: 'https://api.github.com/repos/mralexgray/.../downloads', + has_downloads: true, + languages_url: 'https://api.github.com/repos/mralexgray/.../languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/.../milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/.../stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/.../deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/.../git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/.../subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/.../contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/.../issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/.../subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/.../collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/.../issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/.../notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 58656723, + url: 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol', + fork: true, + name: '2200087-Serial-Protocol', + size: 41, + forks: 1, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/2200087-Serial-Protocol.git', + license: { + key: 'gpl-2.0', + url: 'https://api.github.com/licenses/gpl-2.0', + name: 'GNU General Public License v2.0', + node_id: 'MDc6TGljZW5zZTg=', + spdx_id: 'GPL-2.0', + }, + node_id: 'MDEwOlJlcG9zaXRvcnk1ODY1NjcyMw==', + private: false, + ssh_url: 'git@github.com:mralexgray/2200087-Serial-Protocol.git', + svn_url: 'https://github.com/mralexgray/2200087-Serial-Protocol', + archived: false, + disabled: false, + has_wiki: true, + homepage: 'http://daviddworken.com', + html_url: 'https://github.com/mralexgray/2200087-Serial-Protocol', + keys_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/keys{/key_id}', + language: 'Python', + tags_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/2200087-Serial-Protocol.git', + forks_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/forks', + full_name: 'mralexgray/2200087-Serial-Protocol', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/pulls{/number}', + pushed_at: '2016-05-12T16:07:24Z', + teams_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/git/trees{/sha}', + created_at: '2016-05-12T16:05:28Z', + events_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/merges', + mirror_url: null, + updated_at: '2016-05-12T16:05:30Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/compare/{base}...{head}', + description: + "A reverse engineered protocol description and accompanying code for Radioshack's 2200087 multimeter", + forks_count: 1, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 13121042, + url: 'https://api.github.com/repos/mralexgray/ace', + fork: true, + name: 'ace', + size: 21080, + forks: 1, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/ace.git', + license: { + key: 'other', + url: null, + name: 'Other', + node_id: 'MDc6TGljZW5zZTA=', + spdx_id: 'NOASSERTION', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkxMzEyMTA0Mg==', + private: false, + ssh_url: 'git@github.com:mralexgray/ace.git', + svn_url: 'https://github.com/mralexgray/ace', + archived: false, + disabled: false, + has_wiki: true, + homepage: 'http://ace.c9.io', + html_url: 'https://github.com/mralexgray/ace', + keys_url: 'https://api.github.com/repos/mralexgray/ace/keys{/key_id}', + language: 'JavaScript', + tags_url: 'https://api.github.com/repos/mralexgray/ace/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/ace/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/ace.git', + forks_url: 'https://api.github.com/repos/mralexgray/ace/forks', + full_name: 'mralexgray/ace', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/ace/hooks', + pulls_url: 'https://api.github.com/repos/mralexgray/ace/pulls{/number}', + pushed_at: '2013-10-26T12:34:48Z', + teams_url: 'https://api.github.com/repos/mralexgray/ace/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/ace/git/trees{/sha}', + created_at: '2013-09-26T11:58:10Z', + events_url: 'https://api.github.com/repos/mralexgray/ace/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/ace/issues{/number}', + labels_url: 'https://api.github.com/repos/mralexgray/ace/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/ace/merges', + mirror_url: null, + updated_at: '2013-10-26T12:34:49Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/ace/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/ace/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/ace/compare/{base}...{head}', + description: 'Ace (Ajax.org Cloud9 Editor)', + forks_count: 1, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/ace/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/ace/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/ace/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/ace/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/ace/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/ace/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/ace/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/ace/assignees{/user}', + downloads_url: 'https://api.github.com/repos/mralexgray/ace/downloads', + has_downloads: true, + languages_url: 'https://api.github.com/repos/mralexgray/ace/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/ace/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/ace/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/ace/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/ace/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/ace/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/ace/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/ace/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/ace/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/ace/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/ace/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/ace/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 10791045, + url: 'https://api.github.com/repos/mralexgray/ACEView', + fork: true, + name: 'ACEView', + size: 1733, + forks: 1, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/ACEView.git', + license: { + key: 'other', + url: null, + name: 'Other', + node_id: 'MDc6TGljZW5zZTA=', + spdx_id: 'NOASSERTION', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkxMDc5MTA0NQ==', + private: false, + ssh_url: 'git@github.com:mralexgray/ACEView.git', + svn_url: 'https://github.com/mralexgray/ACEView', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/ACEView', + keys_url: + 'https://api.github.com/repos/mralexgray/ACEView/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/ACEView/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/ACEView/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/ACEView.git', + forks_url: 'https://api.github.com/repos/mralexgray/ACEView/forks', + full_name: 'mralexgray/ACEView', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/ACEView/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/ACEView/pulls{/number}', + pushed_at: '2014-05-09T01:36:23Z', + teams_url: 'https://api.github.com/repos/mralexgray/ACEView/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/ACEView/git/trees{/sha}', + created_at: '2013-06-19T12:15:04Z', + events_url: 'https://api.github.com/repos/mralexgray/ACEView/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/ACEView/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/ACEView/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/ACEView/merges', + mirror_url: null, + updated_at: '2015-11-24T01:14:10Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/ACEView/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/ACEView/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/ACEView/compare/{base}...{head}', + description: 'Use the wonderful ACE editor in your Cocoa applications', + forks_count: 1, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/ACEView/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/ACEView/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/ACEView/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/ACEView/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/ACEView/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/ACEView/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/ACEView/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/ACEView/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/ACEView/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/ACEView/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/ACEView/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/ACEView/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/ACEView/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/ACEView/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/ACEView/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/ACEView/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/ACEView/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/ACEView/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/ACEView/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/ACEView/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/ACEView/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 13623648, + url: 'https://api.github.com/repos/mralexgray/ActiveLog', + fork: true, + name: 'ActiveLog', + size: 60, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/ActiveLog.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnkxMzYyMzY0OA==', + private: false, + ssh_url: 'git@github.com:mralexgray/ActiveLog.git', + svn_url: 'https://github.com/mralexgray/ActiveLog', + archived: false, + disabled: false, + has_wiki: true, + homepage: 'http://deepitpro.com/en/articles/ActiveLog/info/', + html_url: 'https://github.com/mralexgray/ActiveLog', + keys_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/ActiveLog/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/ActiveLog.git', + forks_url: 'https://api.github.com/repos/mralexgray/ActiveLog/forks', + full_name: 'mralexgray/ActiveLog', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/ActiveLog/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/pulls{/number}', + pushed_at: '2011-07-03T06:28:59Z', + teams_url: 'https://api.github.com/repos/mralexgray/ActiveLog/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/git/trees{/sha}', + created_at: '2013-10-16T15:52:37Z', + events_url: 'https://api.github.com/repos/mralexgray/ActiveLog/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/ActiveLog/merges', + mirror_url: null, + updated_at: '2013-10-16T15:52:37Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/compare/{base}...{head}', + description: 'Shut up all logs with active filter.', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 9716210, + url: 'https://api.github.com/repos/mralexgray/adium', + fork: false, + name: 'adium', + size: 277719, + forks: 37, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/adium.git', + license: { + key: 'other', + url: null, + name: 'Other', + node_id: 'MDc6TGljZW5zZTA=', + spdx_id: 'NOASSERTION', + }, + node_id: 'MDEwOlJlcG9zaXRvcnk5NzE2MjEw', + private: false, + ssh_url: 'git@github.com:mralexgray/adium.git', + svn_url: 'https://github.com/mralexgray/adium', + archived: false, + disabled: false, + has_wiki: false, + homepage: null, + html_url: 'https://github.com/mralexgray/adium', + keys_url: 'https://api.github.com/repos/mralexgray/adium/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/adium/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/adium/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/adium.git', + forks_url: 'https://api.github.com/repos/mralexgray/adium/forks', + full_name: 'mralexgray/adium', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/adium/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/adium/pulls{/number}', + pushed_at: '2013-04-26T16:43:53Z', + teams_url: 'https://api.github.com/repos/mralexgray/adium/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/adium/git/trees{/sha}', + created_at: '2013-04-27T14:59:33Z', + events_url: 'https://api.github.com/repos/mralexgray/adium/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/adium/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/adium/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/adium/merges', + mirror_url: null, + updated_at: '2019-12-11T06:51:45Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/adium/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/adium/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/adium/compare/{base}...{head}', + description: 'Official mirror of hg.adium.im', + forks_count: 37, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/adium/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/adium/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/adium/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/adium/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/adium/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/adium/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/adium/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/adium/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/adium/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/adium/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/adium/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/adium/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/adium/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/adium/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/adium/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/adium/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/adium/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/adium/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/adium/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/adium/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/adium/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 12752329, + url: 'https://api.github.com/repos/mralexgray/ADLivelyTableView', + fork: true, + name: 'ADLivelyTableView', + size: 73, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/ADLivelyTableView.git', + license: { + key: 'other', + url: null, + name: 'Other', + node_id: 'MDc6TGljZW5zZTA=', + spdx_id: 'NOASSERTION', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkxMjc1MjMyOQ==', + private: false, + ssh_url: 'git@github.com:mralexgray/ADLivelyTableView.git', + svn_url: 'https://github.com/mralexgray/ADLivelyTableView', + archived: false, + disabled: false, + has_wiki: true, + homepage: 'http://applidium.com/en/news/lively_uitableview/', + html_url: 'https://github.com/mralexgray/ADLivelyTableView', + keys_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/keys{/key_id}', + language: 'Objective-C', + tags_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/ADLivelyTableView.git', + forks_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/forks', + full_name: 'mralexgray/ADLivelyTableView', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/pulls{/number}', + pushed_at: '2012-05-10T10:40:15Z', + teams_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/git/trees{/sha}', + created_at: '2013-09-11T09:18:01Z', + events_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/merges', + mirror_url: null, + updated_at: '2013-09-11T09:18:03Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/compare/{base}...{head}', + description: 'Lively UITableView', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 5697379, + url: 'https://api.github.com/repos/mralexgray/AFIncrementalStore', + fork: true, + name: 'AFIncrementalStore', + size: 139, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/AFIncrementalStore.git', + license: { + key: 'mit', + url: 'https://api.github.com/licenses/mit', + name: 'MIT License', + node_id: 'MDc6TGljZW5zZTEz', + spdx_id: 'MIT', + }, + node_id: 'MDEwOlJlcG9zaXRvcnk1Njk3Mzc5', + private: false, + ssh_url: 'git@github.com:mralexgray/AFIncrementalStore.git', + svn_url: 'https://github.com/mralexgray/AFIncrementalStore', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/AFIncrementalStore', + keys_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/keys{/key_id}', + language: 'Objective-C', + tags_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/AFIncrementalStore.git', + forks_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/forks', + full_name: 'mralexgray/AFIncrementalStore', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/pulls{/number}', + pushed_at: '2012-09-01T22:46:25Z', + teams_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/git/trees{/sha}', + created_at: '2012-09-06T04:20:33Z', + events_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/merges', + mirror_url: null, + updated_at: '2013-01-12T03:15:29Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/compare/{base}...{head}', + description: 'Core Data Persistence with AFNetworking, Done Right', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 6969621, + url: 'https://api.github.com/repos/mralexgray/AFNetworking', + fork: true, + name: 'AFNetworking', + size: 4341, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/AFNetworking.git', + license: { + key: 'mit', + url: 'https://api.github.com/licenses/mit', + name: 'MIT License', + node_id: 'MDc6TGljZW5zZTEz', + spdx_id: 'MIT', + }, + node_id: 'MDEwOlJlcG9zaXRvcnk2OTY5NjIx', + private: false, + ssh_url: 'git@github.com:mralexgray/AFNetworking.git', + svn_url: 'https://github.com/mralexgray/AFNetworking', + archived: false, + disabled: false, + has_wiki: true, + homepage: 'http://afnetworking.com', + html_url: 'https://github.com/mralexgray/AFNetworking', + keys_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/AFNetworking/tags', + watchers: 2, + blobs_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/AFNetworking.git', + forks_url: 'https://api.github.com/repos/mralexgray/AFNetworking/forks', + full_name: 'mralexgray/AFNetworking', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/AFNetworking/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/pulls{/number}', + pushed_at: '2014-01-24T07:14:32Z', + teams_url: 'https://api.github.com/repos/mralexgray/AFNetworking/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/git/trees{/sha}', + created_at: '2012-12-02T17:00:04Z', + events_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/merges', + mirror_url: null, + updated_at: '2014-01-24T07:14:33Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/compare/{base}...{head}', + description: 'A delightful iOS and OS X networking framework', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/stargazers', + watchers_count: 2, + deployments_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/issues/events{/number}', + stargazers_count: 2, + subscription_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 9485541, + url: 'https://api.github.com/repos/mralexgray/AGNSSplitView', + fork: true, + name: 'AGNSSplitView', + size: 68, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/AGNSSplitView.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnk5NDg1NTQx', + private: false, + ssh_url: 'git@github.com:mralexgray/AGNSSplitView.git', + svn_url: 'https://github.com/mralexgray/AGNSSplitView', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/AGNSSplitView', + keys_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/AGNSSplitView/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/AGNSSplitView.git', + forks_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/forks', + full_name: 'mralexgray/AGNSSplitView', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/pulls{/number}', + pushed_at: '2013-02-26T00:32:32Z', + teams_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/git/trees{/sha}', + created_at: '2013-04-17T00:10:13Z', + events_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/merges', + mirror_url: null, + updated_at: '2013-04-17T00:10:13Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/compare/{base}...{head}', + description: 'Simple NSSplitView additions.', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 12767784, + url: 'https://api.github.com/repos/mralexgray/AGScopeBar', + fork: true, + name: 'AGScopeBar', + size: 64, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/AGScopeBar.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnkxMjc2Nzc4NA==', + private: false, + ssh_url: 'git@github.com:mralexgray/AGScopeBar.git', + svn_url: 'https://github.com/mralexgray/AGScopeBar', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/AGScopeBar', + keys_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/AGScopeBar/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/AGScopeBar.git', + forks_url: 'https://api.github.com/repos/mralexgray/AGScopeBar/forks', + full_name: 'mralexgray/AGScopeBar', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/AGScopeBar/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/pulls{/number}', + pushed_at: '2013-05-07T03:35:29Z', + teams_url: 'https://api.github.com/repos/mralexgray/AGScopeBar/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/git/trees{/sha}', + created_at: '2013-09-11T21:06:54Z', + events_url: 'https://api.github.com/repos/mralexgray/AGScopeBar/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/AGScopeBar/merges', + mirror_url: null, + updated_at: '2013-09-11T21:06:54Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/compare/{base}...{head}', + description: 'Custom scope bar implementation for Cocoa', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 31829499, + url: 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin', + fork: true, + name: 'agvtool-xcode-plugin', + size: 102, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/agvtool-xcode-plugin.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnkzMTgyOTQ5OQ==', + private: false, + ssh_url: 'git@github.com:mralexgray/agvtool-xcode-plugin.git', + svn_url: 'https://github.com/mralexgray/agvtool-xcode-plugin', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/agvtool-xcode-plugin', + keys_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/keys{/key_id}', + language: 'Objective-C', + tags_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/agvtool-xcode-plugin.git', + forks_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/forks', + full_name: 'mralexgray/agvtool-xcode-plugin', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/pulls{/number}', + pushed_at: '2015-03-08T00:04:31Z', + teams_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/git/trees{/sha}', + created_at: '2015-03-07T22:15:38Z', + events_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/merges', + mirror_url: null, + updated_at: '2015-03-07T22:15:41Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/compare/{base}...{head}', + description: 'this is a plugin wrapper for agvtool for xcode.', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 9227846, + url: 'https://api.github.com/repos/mralexgray/AHContentBrowser', + fork: true, + name: 'AHContentBrowser', + size: 223, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/AHContentBrowser.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnk5MjI3ODQ2', + private: false, + ssh_url: 'git@github.com:mralexgray/AHContentBrowser.git', + svn_url: 'https://github.com/mralexgray/AHContentBrowser', + archived: false, + disabled: false, + has_wiki: true, + homepage: '', + html_url: 'https://github.com/mralexgray/AHContentBrowser', + keys_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/keys{/key_id}', + language: 'Objective-C', + tags_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/AHContentBrowser.git', + forks_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/forks', + full_name: 'mralexgray/AHContentBrowser', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/pulls{/number}', + pushed_at: '2013-03-13T17:38:23Z', + teams_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/git/trees{/sha}', + created_at: '2013-04-04T20:56:16Z', + events_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/merges', + mirror_url: null, + updated_at: '2015-10-22T05:00:24Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/compare/{base}...{head}', + description: + 'A Mac only webview that loads a fast readable version of the website if available.', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 37430328, + url: 'https://api.github.com/repos/mralexgray/AHLaunchCtl', + fork: true, + name: 'AHLaunchCtl', + size: 592, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/AHLaunchCtl.git', + license: { + key: 'mit', + url: 'https://api.github.com/licenses/mit', + name: 'MIT License', + node_id: 'MDc6TGljZW5zZTEz', + spdx_id: 'MIT', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkzNzQzMDMyOA==', + private: false, + ssh_url: 'git@github.com:mralexgray/AHLaunchCtl.git', + svn_url: 'https://github.com/mralexgray/AHLaunchCtl', + archived: false, + disabled: false, + has_wiki: true, + homepage: '', + html_url: 'https://github.com/mralexgray/AHLaunchCtl', + keys_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/AHLaunchCtl/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/AHLaunchCtl.git', + forks_url: 'https://api.github.com/repos/mralexgray/AHLaunchCtl/forks', + full_name: 'mralexgray/AHLaunchCtl', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/AHLaunchCtl/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/pulls{/number}', + pushed_at: '2015-05-26T18:50:48Z', + teams_url: 'https://api.github.com/repos/mralexgray/AHLaunchCtl/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/git/trees{/sha}', + created_at: '2015-06-14T21:31:03Z', + events_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/merges', + mirror_url: null, + updated_at: '2015-06-14T21:31:04Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/compare/{base}...{head}', + description: 'LaunchD Framework for Cocoa Apps', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 9167473, + url: 'https://api.github.com/repos/mralexgray/AHLayout', + fork: true, + name: 'AHLayout', + size: 359, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/AHLayout.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnk5MTY3NDcz', + private: false, + ssh_url: 'git@github.com:mralexgray/AHLayout.git', + svn_url: 'https://github.com/mralexgray/AHLayout', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/AHLayout', + keys_url: + 'https://api.github.com/repos/mralexgray/AHLayout/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/AHLayout/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/AHLayout/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/AHLayout.git', + forks_url: 'https://api.github.com/repos/mralexgray/AHLayout/forks', + full_name: 'mralexgray/AHLayout', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/AHLayout/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/AHLayout/pulls{/number}', + pushed_at: '2013-07-08T02:31:14Z', + teams_url: 'https://api.github.com/repos/mralexgray/AHLayout/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/AHLayout/git/trees{/sha}', + created_at: '2013-04-02T10:10:30Z', + events_url: 'https://api.github.com/repos/mralexgray/AHLayout/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/AHLayout/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/AHLayout/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/AHLayout/merges', + mirror_url: null, + updated_at: '2013-07-08T02:31:17Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/AHLayout/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/AHLayout/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/AHLayout/compare/{base}...{head}', + description: 'AHLayout', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/AHLayout/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/AHLayout/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/AHLayout/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/AHLayout/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/AHLayout/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/AHLayout/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/AHLayout/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/AHLayout/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/AHLayout/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/AHLayout/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/AHLayout/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/AHLayout/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/AHLayout/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/AHLayout/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/AHLayout/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/AHLayout/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/AHLayout/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/AHLayout/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/AHLayout/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/AHLayout/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/AHLayout/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 18450201, + url: 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework', + fork: true, + name: 'Airmail-Plug-In-Framework', + size: 888, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/Airmail-Plug-In-Framework.git', + license: { + key: 'gpl-2.0', + url: 'https://api.github.com/licenses/gpl-2.0', + name: 'GNU General Public License v2.0', + node_id: 'MDc6TGljZW5zZTg=', + spdx_id: 'GPL-2.0', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkxODQ1MDIwMQ==', + private: false, + ssh_url: 'git@github.com:mralexgray/Airmail-Plug-In-Framework.git', + svn_url: 'https://github.com/mralexgray/Airmail-Plug-In-Framework', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/Airmail-Plug-In-Framework', + keys_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/keys{/key_id}', + language: null, + tags_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/git/blobs{/sha}', + clone_url: + 'https://github.com/mralexgray/Airmail-Plug-In-Framework.git', + forks_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/forks', + full_name: 'mralexgray/Airmail-Plug-In-Framework', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/pulls{/number}', + pushed_at: '2014-03-27T15:42:19Z', + teams_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/git/trees{/sha}', + created_at: '2014-04-04T19:33:54Z', + events_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/merges', + mirror_url: null, + updated_at: '2014-11-23T19:31:04Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/compare/{base}...{head}', + description: null, + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 5203219, + url: 'https://api.github.com/repos/mralexgray/AJS-iTunes-API', + fork: true, + name: 'AJS-iTunes-API', + size: 103, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/AJS-iTunes-API.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnk1MjAzMjE5', + private: false, + ssh_url: 'git@github.com:mralexgray/AJS-iTunes-API.git', + svn_url: 'https://github.com/mralexgray/AJS-iTunes-API', + archived: false, + disabled: false, + has_wiki: true, + homepage: '', + html_url: 'https://github.com/mralexgray/AJS-iTunes-API', + keys_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/tags', + watchers: 2, + blobs_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/AJS-iTunes-API.git', + forks_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/forks', + full_name: 'mralexgray/AJS-iTunes-API', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/pulls{/number}', + pushed_at: '2011-10-30T22:26:48Z', + teams_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/git/trees{/sha}', + created_at: '2012-07-27T10:20:58Z', + events_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/merges', + mirror_url: null, + updated_at: '2013-01-11T11:00:05Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/compare/{base}...{head}', + description: + 'Cocoa wrapper for the iTunes search API - for iOS and Mac OSX projects', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/stargazers', + watchers_count: 2, + deployments_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/issues/events{/number}', + stargazers_count: 2, + subscription_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 10093801, + url: 'https://api.github.com/repos/mralexgray/Alcatraz', + fork: true, + name: 'Alcatraz', + size: 3668, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/Alcatraz.git', + license: { + key: 'mit', + url: 'https://api.github.com/licenses/mit', + name: 'MIT License', + node_id: 'MDc6TGljZW5zZTEz', + spdx_id: 'MIT', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkxMDA5MzgwMQ==', + private: false, + ssh_url: 'git@github.com:mralexgray/Alcatraz.git', + svn_url: 'https://github.com/mralexgray/Alcatraz', + archived: false, + disabled: false, + has_wiki: false, + homepage: 'mneorr.github.com/Alcatraz', + html_url: 'https://github.com/mralexgray/Alcatraz', + keys_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/Alcatraz/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/Alcatraz.git', + forks_url: 'https://api.github.com/repos/mralexgray/Alcatraz/forks', + full_name: 'mralexgray/Alcatraz', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/Alcatraz/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/pulls{/number}', + pushed_at: '2014-03-19T12:50:37Z', + teams_url: 'https://api.github.com/repos/mralexgray/Alcatraz/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/git/trees{/sha}', + created_at: '2013-05-16T04:41:13Z', + events_url: 'https://api.github.com/repos/mralexgray/Alcatraz/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/Alcatraz/merges', + mirror_url: null, + updated_at: '2014-03-19T20:38:35Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/compare/{base}...{head}', + description: 'The most awesome (and only) Xcode package manager!', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 12916552, + url: 'https://api.github.com/repos/mralexgray/alcatraz-packages', + fork: true, + name: 'alcatraz-packages', + size: 826, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/alcatraz-packages.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnkxMjkxNjU1Mg==', + private: false, + ssh_url: 'git@github.com:mralexgray/alcatraz-packages.git', + svn_url: 'https://github.com/mralexgray/alcatraz-packages', + archived: false, + disabled: false, + has_wiki: true, + homepage: 'mneorr.github.com/Alcatraz', + html_url: 'https://github.com/mralexgray/alcatraz-packages', + keys_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/keys{/key_id}', + language: 'Ruby', + tags_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/alcatraz-packages.git', + forks_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/forks', + full_name: 'mralexgray/alcatraz-packages', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/pulls{/number}', + pushed_at: '2015-12-14T16:21:31Z', + teams_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/git/trees{/sha}', + created_at: '2013-09-18T07:15:24Z', + events_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/merges', + mirror_url: null, + updated_at: '2015-11-10T20:52:30Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/compare/{base}...{head}', + description: 'Package list repository for Alcatraz', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 44278362, + url: 'https://api.github.com/repos/mralexgray/alexicons', + fork: true, + name: 'alexicons', + size: 257, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/alexicons.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnk0NDI3ODM2Mg==', + private: false, + ssh_url: 'git@github.com:mralexgray/alexicons.git', + svn_url: 'https://github.com/mralexgray/alexicons', + archived: false, + disabled: false, + has_wiki: false, + homepage: null, + html_url: 'https://github.com/mralexgray/alexicons', + keys_url: + 'https://api.github.com/repos/mralexgray/alexicons/keys{/key_id}', + language: 'CoffeeScript', + tags_url: 'https://api.github.com/repos/mralexgray/alexicons/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/alexicons/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/alexicons.git', + forks_url: 'https://api.github.com/repos/mralexgray/alexicons/forks', + full_name: 'mralexgray/alexicons', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/alexicons/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/alexicons/pulls{/number}', + pushed_at: '2015-10-16T03:57:51Z', + teams_url: 'https://api.github.com/repos/mralexgray/alexicons/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/alexicons/git/trees{/sha}', + created_at: '2015-10-14T21:49:39Z', + events_url: 'https://api.github.com/repos/mralexgray/alexicons/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/alexicons/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/alexicons/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/alexicons/merges', + mirror_url: null, + updated_at: '2015-10-15T06:20:08Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/alexicons/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/alexicons/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/alexicons/compare/{base}...{head}', + description: 'Get popular cat names', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/alexicons/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/alexicons/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/alexicons/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/alexicons/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/alexicons/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/alexicons/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/alexicons/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/alexicons/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/alexicons/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/alexicons/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/alexicons/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/alexicons/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/alexicons/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/alexicons/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/alexicons/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/alexicons/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/alexicons/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/alexicons/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/alexicons/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/alexicons/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/alexicons/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 10476467, + url: 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate', + fork: true, + name: 'Alfred-Google-Translate', + size: 103, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/Alfred-Google-Translate.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnkxMDQ3NjQ2Nw==', + private: false, + ssh_url: 'git@github.com:mralexgray/Alfred-Google-Translate.git', + svn_url: 'https://github.com/mralexgray/Alfred-Google-Translate', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/Alfred-Google-Translate', + keys_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/keys{/key_id}', + language: 'Shell', + tags_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/Alfred-Google-Translate.git', + forks_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/forks', + full_name: 'mralexgray/Alfred-Google-Translate', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/pulls{/number}', + pushed_at: '2013-01-12T19:39:03Z', + teams_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/git/trees{/sha}', + created_at: '2013-06-04T10:45:10Z', + events_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/merges', + mirror_url: null, + updated_at: '2013-06-04T10:45:10Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/compare/{base}...{head}', + description: + 'Extension for Alfred that will do a Google translate for you', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 5524019, + url: 'https://api.github.com/repos/mralexgray/Amber', + fork: false, + name: 'Amber', + size: 48, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/Amber.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnk1NTI0MDE5', + private: false, + ssh_url: 'git@github.com:mralexgray/Amber.git', + svn_url: 'https://github.com/mralexgray/Amber', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/Amber', + keys_url: 'https://api.github.com/repos/mralexgray/Amber/keys{/key_id}', + language: null, + tags_url: 'https://api.github.com/repos/mralexgray/Amber/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/Amber/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/Amber.git', + forks_url: 'https://api.github.com/repos/mralexgray/Amber/forks', + full_name: 'mralexgray/Amber', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/Amber/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/Amber/pulls{/number}', + pushed_at: '2012-08-23T10:38:25Z', + teams_url: 'https://api.github.com/repos/mralexgray/Amber/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/Amber/git/trees{/sha}', + created_at: '2012-08-23T10:38:24Z', + events_url: 'https://api.github.com/repos/mralexgray/Amber/events', + has_issues: true, + issues_url: + 'https://api.github.com/repos/mralexgray/Amber/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/Amber/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/Amber/merges', + mirror_url: null, + updated_at: '2013-01-11T22:25:35Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/Amber/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/Amber/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/Amber/compare/{base}...{head}', + description: 'Fork of the difficult-to-deal-with Amber.framework', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/Amber/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/Amber/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/Amber/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/Amber/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/Amber/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/Amber/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/Amber/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/Amber/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/Amber/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/Amber/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/Amber/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/Amber/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/Amber/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/Amber/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/Amber/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/Amber/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/Amber/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/Amber/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/Amber/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/Amber/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/Amber/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 10809060, + url: 'https://api.github.com/repos/mralexgray/Amethyst', + fork: true, + name: 'Amethyst', + size: 12623, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/Amethyst.git', + license: { + key: 'mit', + url: 'https://api.github.com/licenses/mit', + name: 'MIT License', + node_id: 'MDc6TGljZW5zZTEz', + spdx_id: 'MIT', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkxMDgwOTA2MA==', + private: false, + ssh_url: 'git@github.com:mralexgray/Amethyst.git', + svn_url: 'https://github.com/mralexgray/Amethyst', + archived: false, + disabled: false, + has_wiki: true, + homepage: 'http://ianyh.github.io/Amethyst/', + html_url: 'https://github.com/mralexgray/Amethyst', + keys_url: + 'https://api.github.com/repos/mralexgray/Amethyst/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/Amethyst/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/Amethyst/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/Amethyst.git', + forks_url: 'https://api.github.com/repos/mralexgray/Amethyst/forks', + full_name: 'mralexgray/Amethyst', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/Amethyst/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/Amethyst/pulls{/number}', + pushed_at: '2013-06-18T02:54:11Z', + teams_url: 'https://api.github.com/repos/mralexgray/Amethyst/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/Amethyst/git/trees{/sha}', + created_at: '2013-06-20T00:34:22Z', + events_url: 'https://api.github.com/repos/mralexgray/Amethyst/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/Amethyst/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/Amethyst/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/Amethyst/merges', + mirror_url: null, + updated_at: '2013-06-20T00:34:22Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/Amethyst/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/Amethyst/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/Amethyst/compare/{base}...{head}', + description: 'Tiling window manager for OS X.', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/Amethyst/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/Amethyst/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/Amethyst/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/Amethyst/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/Amethyst/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/Amethyst/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/Amethyst/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/Amethyst/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/Amethyst/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/Amethyst/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/Amethyst/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/Amethyst/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/Amethyst/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/Amethyst/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/Amethyst/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/Amethyst/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/Amethyst/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/Amethyst/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/Amethyst/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/Amethyst/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/Amethyst/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 3684286, + url: 'https://api.github.com/repos/mralexgray/Animated-Paths', + fork: true, + name: 'Animated-Paths', + size: 411, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/Animated-Paths.git', + license: { + key: 'other', + url: null, + name: 'Other', + node_id: 'MDc6TGljZW5zZTA=', + spdx_id: 'NOASSERTION', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkzNjg0Mjg2', + private: false, + ssh_url: 'git@github.com:mralexgray/Animated-Paths.git', + svn_url: 'https://github.com/mralexgray/Animated-Paths', + archived: false, + disabled: false, + has_wiki: true, + homepage: + 'http://oleb.net/blog/2010/12/animating-drawing-of-cgpath-with-cashapelayer/', + html_url: 'https://github.com/mralexgray/Animated-Paths', + keys_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/Animated-Paths/tags', + watchers: 2, + blobs_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/Animated-Paths.git', + forks_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/forks', + full_name: 'mralexgray/Animated-Paths', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/pulls{/number}', + pushed_at: '2010-12-30T20:56:51Z', + teams_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/git/trees{/sha}', + created_at: '2012-03-11T02:56:38Z', + events_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/merges', + mirror_url: null, + updated_at: '2013-01-08T04:12:21Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/compare/{base}...{head}', + description: + 'Demo project: Animating the drawing of a CGPath with CAShapeLayer.strokeEnd', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/stargazers', + watchers_count: 2, + deployments_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/issues/events{/number}', + stargazers_count: 2, + subscription_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 16662874, + url: 'https://api.github.com/repos/mralexgray/AnsiLove.framework', + fork: true, + name: 'AnsiLove.framework', + size: 3780, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/AnsiLove.framework.git', + license: { + key: 'other', + url: null, + name: 'Other', + node_id: 'MDc6TGljZW5zZTA=', + spdx_id: 'NOASSERTION', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkxNjY2Mjg3NA==', + private: false, + ssh_url: 'git@github.com:mralexgray/AnsiLove.framework.git', + svn_url: 'https://github.com/mralexgray/AnsiLove.framework', + archived: false, + disabled: false, + has_wiki: false, + homepage: 'http://byteproject.net', + html_url: 'https://github.com/mralexgray/AnsiLove.framework', + keys_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/keys{/key_id}', + language: 'M', + tags_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/AnsiLove.framework.git', + forks_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/forks', + full_name: 'mralexgray/AnsiLove.framework', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/pulls{/number}', + pushed_at: '2013-10-04T14:08:38Z', + teams_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/git/trees{/sha}', + created_at: '2014-02-09T08:30:27Z', + events_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/merges', + mirror_url: null, + updated_at: '2015-01-13T20:41:46Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/compare/{base}...{head}', + description: 'Cocoa Framework for rendering ANSi / ASCII art', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 5189563, + url: 'https://api.github.com/repos/mralexgray/ANTrackBar', + fork: true, + name: 'ANTrackBar', + size: 94, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/ANTrackBar.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnk1MTg5NTYz', + private: false, + ssh_url: 'git@github.com:mralexgray/ANTrackBar.git', + svn_url: 'https://github.com/mralexgray/ANTrackBar', + archived: false, + disabled: false, + has_wiki: true, + homepage: '', + html_url: 'https://github.com/mralexgray/ANTrackBar', + keys_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/ANTrackBar/tags', + watchers: 2, + blobs_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/ANTrackBar.git', + forks_url: 'https://api.github.com/repos/mralexgray/ANTrackBar/forks', + full_name: 'mralexgray/ANTrackBar', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/ANTrackBar/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/pulls{/number}', + pushed_at: '2012-03-09T01:40:02Z', + teams_url: 'https://api.github.com/repos/mralexgray/ANTrackBar/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/git/trees{/sha}', + created_at: '2012-07-26T08:17:22Z', + events_url: 'https://api.github.com/repos/mralexgray/ANTrackBar/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/ANTrackBar/merges', + mirror_url: null, + updated_at: '2013-01-11T10:29:56Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/compare/{base}...{head}', + description: 'An easy-to-use Cocoa seek bar with a pleasing appearance', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/stargazers', + watchers_count: 2, + deployments_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/issues/events{/number}', + stargazers_count: 2, + subscription_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 16240152, + url: 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C', + fork: true, + name: 'AOP-in-Objective-C', + size: 340, + forks: 1, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/AOP-in-Objective-C.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnkxNjI0MDE1Mg==', + private: false, + ssh_url: 'git@github.com:mralexgray/AOP-in-Objective-C.git', + svn_url: 'https://github.com/mralexgray/AOP-in-Objective-C', + archived: false, + disabled: false, + has_wiki: true, + homepage: 'http://innoli.hu/en/opensource/', + html_url: 'https://github.com/mralexgray/AOP-in-Objective-C', + keys_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/keys{/key_id}', + language: 'Objective-C', + tags_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/AOP-in-Objective-C.git', + forks_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/forks', + full_name: 'mralexgray/AOP-in-Objective-C', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/pulls{/number}', + pushed_at: '2014-02-12T16:23:20Z', + teams_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/git/trees{/sha}', + created_at: '2014-01-25T21:18:04Z', + events_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/merges', + mirror_url: null, + updated_at: '2014-06-19T19:38:12Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/compare/{base}...{head}', + description: + 'An NSProxy based library for easily enabling AOP like functionality in Objective-C.', + forks_count: 1, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/languages', + default_branch: 'travis-coveralls', + milestones_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 13141936, + url: 'https://api.github.com/repos/mralexgray/Apaxy', + fork: true, + name: 'Apaxy', + size: 113, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/Apaxy.git', + license: { + key: 'unlicense', + url: 'https://api.github.com/licenses/unlicense', + name: 'The Unlicense', + node_id: 'MDc6TGljZW5zZTE1', + spdx_id: 'Unlicense', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkxMzE0MTkzNg==', + private: false, + ssh_url: 'git@github.com:mralexgray/Apaxy.git', + svn_url: 'https://github.com/mralexgray/Apaxy', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/Apaxy', + keys_url: 'https://api.github.com/repos/mralexgray/Apaxy/keys{/key_id}', + language: 'CSS', + tags_url: 'https://api.github.com/repos/mralexgray/Apaxy/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/Apaxy/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/Apaxy.git', + forks_url: 'https://api.github.com/repos/mralexgray/Apaxy/forks', + full_name: 'mralexgray/Apaxy', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/Apaxy/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/Apaxy/pulls{/number}', + pushed_at: '2013-08-02T16:01:32Z', + teams_url: 'https://api.github.com/repos/mralexgray/Apaxy/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/Apaxy/git/trees{/sha}', + created_at: '2013-09-27T05:05:35Z', + events_url: 'https://api.github.com/repos/mralexgray/Apaxy/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/Apaxy/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/Apaxy/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/Apaxy/merges', + mirror_url: null, + updated_at: '2018-02-16T21:40:24Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/Apaxy/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/Apaxy/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/Apaxy/compare/{base}...{head}', + description: + 'A simple, customisable theme for your Apache directory listing.', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/Apaxy/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/Apaxy/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/Apaxy/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/Apaxy/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/Apaxy/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/Apaxy/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/Apaxy/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/Apaxy/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/Apaxy/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/Apaxy/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/Apaxy/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/Apaxy/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/Apaxy/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/Apaxy/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/Apaxy/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/Apaxy/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/Apaxy/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/Apaxy/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/Apaxy/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/Apaxy/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/Apaxy/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 20027360, + url: 'https://api.github.com/repos/mralexgray/app', + fork: true, + name: 'app', + size: 1890, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/app.git', + license: { + key: 'other', + url: null, + name: 'Other', + node_id: 'MDc6TGljZW5zZTA=', + spdx_id: 'NOASSERTION', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkyMDAyNzM2MA==', + private: false, + ssh_url: 'git@github.com:mralexgray/app.git', + svn_url: 'https://github.com/mralexgray/app', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/app', + keys_url: 'https://api.github.com/repos/mralexgray/app/keys{/key_id}', + language: 'JavaScript', + tags_url: 'https://api.github.com/repos/mralexgray/app/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/app/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/app.git', + forks_url: 'https://api.github.com/repos/mralexgray/app/forks', + full_name: 'mralexgray/app', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/app/hooks', + pulls_url: 'https://api.github.com/repos/mralexgray/app/pulls{/number}', + pushed_at: '2014-05-20T19:51:38Z', + teams_url: 'https://api.github.com/repos/mralexgray/app/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/app/git/trees{/sha}', + created_at: '2014-05-21T15:54:20Z', + events_url: 'https://api.github.com/repos/mralexgray/app/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/app/issues{/number}', + labels_url: 'https://api.github.com/repos/mralexgray/app/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/app/merges', + mirror_url: null, + updated_at: '2014-05-21T15:54:22Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/app/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/app/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/app/compare/{base}...{head}', + description: 'Instant mobile web app creation', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/app/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/app/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/app/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/app/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/app/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/app/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/app/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/app/assignees{/user}', + downloads_url: 'https://api.github.com/repos/mralexgray/app/downloads', + has_downloads: true, + languages_url: 'https://api.github.com/repos/mralexgray/app/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/app/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/app/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/app/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/app/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/app/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/app/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/app/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/app/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/app/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/app/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/app/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + ], + name: 'Shirt', + revenue: 4.99, + }, + 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', + }, + PayloadSize: 48375, + LastJobStatus: { + JobID: 0, + JobState: '', + AttemptNum: 0, + ExecTime: '0001-01-01T00:00:00Z', + RetryTime: '0001-01-01T00:00:00Z', + ErrorCode: '', + ErrorResponse: null, + Parameters: null, + WorkspaceId: '', + }, + Parameters: { + record_id: null, + source_id: '2DTlLPQxignYp4ag9sISgGN2uY7', + event_name: 'Product Purchased new', + event_type: 'track', + message_id: '9f8fb785-c720-4381-a009-bf22a13f4ced', + received_at: '2022-08-18T08:43:13.521+05:30', + workspaceId: '2DTlBMipxWfJZzZ1SsjELQWvkwd', + transform_at: 'router', + source_job_id: '', + destination_id: '2DTozIMGtBwTGNJtuvdPByFSL2Z', + gateway_job_id: 6, + source_task_id: '', + source_batch_id: '', + source_category: '', + source_job_run_id: '', + source_task_run_id: '', + source_definition_id: '2DTlJaW1jHhM8B27Et2CMTZoxZF', + destination_definition_id: '', + }, + WorkspaceId: '2DTlBMipxWfJZzZ1SsjELQWvkwd', + }, + workerAssignedTime: '2022-08-18T08:43:16.586825+05:30', + }, + { + userId: 'anon-id-new<<>>identified user id', + jobId: 33, + sourceId: '2DTlLPQxignYp4ag9sISgGN2uY7', + destinationId: '2DTozIMGtBwTGNJtuvdPByFSL2Z', + attemptNum: 0, + receivedAt: '2022-08-18T08:43:13.521+05:30', + createdAt: '2022-08-18T03:13:15.549Z', + firstAttemptedAt: '', + transformAt: 'router', + workspaceId: '2DTlBMipxWfJZzZ1SsjELQWvkwd', + secret: null, + jobsT: { + UUID: 'bf616af4-2c6b-495f-8b2d-b522c93bdca2', + JobID: 33, + UserID: 'anon-id-new<<>>identified user id', + CreatedAt: '2022-08-18T03:13:15.549078Z', + ExpireAt: '2022-08-18T03:13:15.549078Z', + CustomVal: 'LAMBDA', + EventCount: 1, + EventPayload: { + name: 'Page View', + type: 'page', + 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: '5f58d1f7-cbd6-4bff-8571-9933be7210b1', + timestamp: '2020-02-02T00:23:09.544Z', + properties: { + path: '/', + title: 'Home', + }, + 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', + }, + PayloadSize: 548, + LastJobStatus: { + JobID: 0, + JobState: '', + AttemptNum: 0, + ExecTime: '0001-01-01T00:00:00Z', + RetryTime: '0001-01-01T00:00:00Z', + ErrorCode: '', + ErrorResponse: null, + Parameters: null, + WorkspaceId: '', + }, + Parameters: { + record_id: null, + source_id: '2DTlLPQxignYp4ag9sISgGN2uY7', + event_name: '', + event_type: 'page', + message_id: '5f58d1f7-cbd6-4bff-8571-9933be7210b1', + received_at: '2022-08-18T08:43:13.521+05:30', + workspaceId: '2DTlBMipxWfJZzZ1SsjELQWvkwd', + transform_at: 'router', + source_job_id: '', + destination_id: '2DTozIMGtBwTGNJtuvdPByFSL2Z', + gateway_job_id: 6, + source_task_id: '', + source_batch_id: '', + source_category: '', + source_job_run_id: '', + source_task_run_id: '', + source_definition_id: '2DTlJaW1jHhM8B27Et2CMTZoxZF', + destination_definition_id: '', + }, + WorkspaceId: '2DTlBMipxWfJZzZ1SsjELQWvkwd', + }, + workerAssignedTime: '2022-08-18T08:43:16.586825+05:30', + }, + ], + batched: false, + statusCode: 200, + }, + { + 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"}]', + destConfig: { + clientContext: '', + lambda: 'testFunction', + invocationType: 'Event', + }, + }, + metadata: [ + { + userId: 'anon-id-new<<>>identified user id', + jobId: 34, + sourceId: '2DTlLPQxignYp4ag9sISgGN2uY7', + destinationId: '2DTozIMGtBwTGNJtuvdPByFSL2Z', + attemptNum: 0, + receivedAt: '2022-08-18T08:43:13.521+05:30', + createdAt: '2022-08-18T03:13:15.549Z', + firstAttemptedAt: '', + transformAt: 'router', + workspaceId: '2DTlBMipxWfJZzZ1SsjELQWvkwd', + secret: null, + jobsT: { + UUID: '8faa9d6d-d8a8-468c-bef4-c2db52f6101b', + JobID: 34, + UserID: 'anon-id-new<<>>identified user id', + CreatedAt: '2022-08-18T03:13:15.549078Z', + ExpireAt: '2022-08-18T03:13:15.549078Z', + CustomVal: 'LAMBDA', + EventCount: 1, + EventPayload: { + 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', + }, + PayloadSize: 536, + LastJobStatus: { + JobID: 0, + JobState: '', + AttemptNum: 0, + ExecTime: '0001-01-01T00:00:00Z', + RetryTime: '0001-01-01T00:00:00Z', + ErrorCode: '', + ErrorResponse: null, + Parameters: null, + WorkspaceId: '', + }, + Parameters: { + record_id: null, + source_id: '2DTlLPQxignYp4ag9sISgGN2uY7', + event_name: '', + event_type: 'screen', + message_id: '1b8ee4c3-ffad-4457-b453-31b32da1dfea', + received_at: '2022-08-18T08:43:13.521+05:30', + workspaceId: '2DTlBMipxWfJZzZ1SsjELQWvkwd', + transform_at: 'router', + source_job_id: '', + destination_id: '2DTozIMGtBwTGNJtuvdPByFSL2Z', + gateway_job_id: 6, + source_task_id: '', + source_batch_id: '', + source_category: '', + source_job_run_id: '', + source_task_run_id: '', + source_definition_id: '2DTlJaW1jHhM8B27Et2CMTZoxZF', + destination_definition_id: '', + }, + WorkspaceId: '2DTlBMipxWfJZzZ1SsjELQWvkwd', + }, + workerAssignedTime: '2022-08-18T08:43:16.586825+05:30', + }, + { + userId: 'anon-id-new<<>>identified user id', + jobId: 35, + sourceId: '2DTlLPQxignYp4ag9sISgGN2uY7', + destinationId: '2DTozIMGtBwTGNJtuvdPByFSL2Z', + attemptNum: 0, + receivedAt: '2022-08-18T08:43:13.521+05:30', + createdAt: '2022-08-18T03:13:15.549Z', + firstAttemptedAt: '', + transformAt: 'router', + workspaceId: '2DTlBMipxWfJZzZ1SsjELQWvkwd', + secret: null, + jobsT: { + UUID: '73cea314-998a-4b72-8004-34b0618093a3', + JobID: 35, + UserID: 'anon-id-new<<>>identified user id', + CreatedAt: '2022-08-18T03:13:15.549078Z', + ExpireAt: '2022-08-18T03:13:15.549078Z', + CustomVal: 'LAMBDA', + EventCount: 1, + EventPayload: { + 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', + }, + PayloadSize: 589, + LastJobStatus: { + JobID: 0, + JobState: '', + AttemptNum: 0, + ExecTime: '0001-01-01T00:00:00Z', + RetryTime: '0001-01-01T00:00:00Z', + ErrorCode: '', + ErrorResponse: null, + Parameters: null, + WorkspaceId: '', + }, + Parameters: { + record_id: null, + source_id: '2DTlLPQxignYp4ag9sISgGN2uY7', + event_name: '', + event_type: 'group', + message_id: '2c59b527-3235-4fc2-9680-f41ec52ebb51', + received_at: '2022-08-18T08:43:13.521+05:30', + workspaceId: '2DTlBMipxWfJZzZ1SsjELQWvkwd', + transform_at: 'router', + source_job_id: '', + destination_id: '2DTozIMGtBwTGNJtuvdPByFSL2Z', + gateway_job_id: 6, + source_task_id: '', + source_batch_id: '', + source_category: '', + source_job_run_id: '', + source_task_run_id: '', + source_definition_id: '2DTlJaW1jHhM8B27Et2CMTZoxZF', + destination_definition_id: '', + }, + WorkspaceId: '2DTlBMipxWfJZzZ1SsjELQWvkwd', + }, + workerAssignedTime: '2022-08-18T08:43:16.586825+05:30', + }, + ], + batched: false, + statusCode: 200, + }, + { + 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"}]', + destConfig: { + clientContext: '', + lambda: 'testFunction', + invocationType: 'Event', + }, + }, + metadata: [ + { + userId: 'anon-id-new<<>>identified user id', + jobId: 36, + sourceId: '2DTlLPQxignYp4ag9sISgGN2uY7', + destinationId: '2DTozIMGtBwTGNJtuvdPByFSL2Z', + attemptNum: 0, + receivedAt: '2022-08-18T08:43:13.521+05:30', + createdAt: '2022-08-18T03:13:15.549Z', + firstAttemptedAt: '', + transformAt: 'router', + workspaceId: '2DTlBMipxWfJZzZ1SsjELQWvkwd', + secret: null, + jobsT: { + UUID: 'ac80629c-9eb6-4e92-bee8-4647e88f7fc0', + JobID: 36, + UserID: 'anon-id-new<<>>identified user id', + CreatedAt: '2022-08-18T03:13:15.549078Z', + ExpireAt: '2022-08-18T03:13:15.549078Z', + CustomVal: 'LAMBDA', + EventCount: 1, + EventPayload: { + 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', + }, + PayloadSize: 506, + LastJobStatus: { + JobID: 0, + JobState: '', + AttemptNum: 0, + ExecTime: '0001-01-01T00:00:00Z', + RetryTime: '0001-01-01T00:00:00Z', + ErrorCode: '', + ErrorResponse: null, + Parameters: null, + WorkspaceId: '', + }, + Parameters: { + record_id: null, + source_id: '2DTlLPQxignYp4ag9sISgGN2uY7', + event_name: '', + event_type: 'alias', + message_id: '3ff8d400-b6d4-43a4-a0ff-1bc7ae8b5f7d', + received_at: '2022-08-18T08:43:13.521+05:30', + workspaceId: '2DTlBMipxWfJZzZ1SsjELQWvkwd', + transform_at: 'router', + source_job_id: '', + destination_id: '2DTozIMGtBwTGNJtuvdPByFSL2Z', + gateway_job_id: 6, + source_task_id: '', + source_batch_id: '', + source_category: '', + source_job_run_id: '', + source_task_run_id: '', + source_definition_id: '2DTlJaW1jHhM8B27Et2CMTZoxZF', + destination_definition_id: '', + }, + WorkspaceId: '2DTlBMipxWfJZzZ1SsjELQWvkwd', + }, + workerAssignedTime: '2022-08-18T08:43:16.586825+05:30', + }, + ], + batched: false, + statusCode: 200, + }, + { + metadata: [ + { + userId: 'anon-id-new<<>>identified user id', + jobId: 31, + sourceId: '2DTlLPQxignYp4ag9sISgGN2uY7', + destinationId: '2DTozIMGtBwTGNJtuvdPByFSL2Z', + attemptNum: 0, + receivedAt: '2022-08-18T08:43:13.521+05:30', + createdAt: '2022-08-18T03:13:15.549Z', + firstAttemptedAt: '', + transformAt: 'router', + workspaceId: '2DTlBMipxWfJZzZ1SsjELQWvkwd', + secret: null, + jobsT: { + UUID: '47b3937a-1fef-49fa-85c8-649673bd7170', + JobID: 31, + UserID: 'anon-id-new<<>>identified user id', + CreatedAt: '2022-08-18T03:13:15.549078Z', + ExpireAt: '2022-08-18T03:13:15.549078Z', + CustomVal: 'LAMBDA', + EventCount: 1, + EventPayload: { + type: 'identify', + sentAt: '2022-08-18T08:43:15.539+05:30', + userId: 'identified user id', + context: { + ip: '14.5.67.21', + traits: { + data: [ + { + id: 6104546, + url: 'https://api.github.com/repos/mralexgray/-REPONAME', + fork: false, + name: '-REPONAME', + size: 48, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: + 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/-REPONAME.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnk2MTA0NTQ2', + private: false, + ssh_url: 'git@github.com:mralexgray/-REPONAME.git', + svn_url: 'https://github.com/mralexgray/-REPONAME', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/-REPONAME', + keys_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/keys{/key_id}', + language: null, + tags_url: 'https://api.github.com/repos/mralexgray/-REPONAME/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/-REPONAME.git', + forks_url: 'https://api.github.com/repos/mralexgray/-REPONAME/forks', + full_name: 'mralexgray/-REPONAME', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/-REPONAME/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/pulls{/number}', + pushed_at: '2012-10-06T16:37:39Z', + teams_url: 'https://api.github.com/repos/mralexgray/-REPONAME/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/git/trees{/sha}', + created_at: '2012-10-06T16:37:39Z', + events_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/events', + has_issues: true, + issues_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/merges', + mirror_url: null, + updated_at: '2013-01-12T13:39:30Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/compare/{base}...{head}', + description: null, + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 104510411, + url: 'https://api.github.com/repos/mralexgray/...', + fork: true, + name: '...', + size: 113, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: + 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/....git', + license: { + key: 'mit', + url: 'https://api.github.com/licenses/mit', + name: 'MIT License', + node_id: 'MDc6TGljZW5zZTEz', + spdx_id: 'MIT', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkxMDQ1MTA0MTE=', + private: false, + ssh_url: 'git@github.com:mralexgray/....git', + svn_url: 'https://github.com/mralexgray/...', + archived: false, + disabled: false, + has_wiki: false, + homepage: 'https://driesvints.com/blog/getting-started-with-dotfiles', + html_url: 'https://github.com/mralexgray/...', + keys_url: 'https://api.github.com/repos/mralexgray/.../keys{/key_id}', + language: 'Shell', + tags_url: 'https://api.github.com/repos/mralexgray/.../tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/.../git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/....git', + forks_url: 'https://api.github.com/repos/mralexgray/.../forks', + full_name: 'mralexgray/...', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/.../hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/.../pulls{/number}', + pushed_at: '2017-09-15T08:27:32Z', + teams_url: 'https://api.github.com/repos/mralexgray/.../teams', + trees_url: + 'https://api.github.com/repos/mralexgray/.../git/trees{/sha}', + created_at: '2017-09-22T19:19:42Z', + events_url: 'https://api.github.com/repos/mralexgray/.../events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/.../issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/.../labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/.../merges', + mirror_url: null, + updated_at: '2017-09-22T19:20:22Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/.../{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/.../commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/.../compare/{base}...{head}', + description: ':computer: Public repo for my personal dotfiles.', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/.../branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/.../comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/.../contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/.../git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/.../git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/.../releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/.../statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/.../assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/.../downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/.../languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/.../milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/.../stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/.../deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/.../git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/.../subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/.../contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/.../issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/.../subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/.../collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/.../issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/.../notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 58656723, + url: 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol', + fork: true, + name: '2200087-Serial-Protocol', + size: 41, + forks: 1, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: + 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/2200087-Serial-Protocol.git', + license: { + key: 'gpl-2.0', + url: 'https://api.github.com/licenses/gpl-2.0', + name: 'GNU General Public License v2.0', + node_id: 'MDc6TGljZW5zZTg=', + spdx_id: 'GPL-2.0', + }, + node_id: 'MDEwOlJlcG9zaXRvcnk1ODY1NjcyMw==', + private: false, + ssh_url: 'git@github.com:mralexgray/2200087-Serial-Protocol.git', + svn_url: 'https://github.com/mralexgray/2200087-Serial-Protocol', + archived: false, + disabled: false, + has_wiki: true, + homepage: 'http://daviddworken.com', + html_url: 'https://github.com/mralexgray/2200087-Serial-Protocol', + keys_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/keys{/key_id}', + language: 'Python', + tags_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/git/blobs{/sha}', + clone_url: + 'https://github.com/mralexgray/2200087-Serial-Protocol.git', + forks_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/forks', + full_name: 'mralexgray/2200087-Serial-Protocol', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/pulls{/number}', + pushed_at: '2016-05-12T16:07:24Z', + teams_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/git/trees{/sha}', + created_at: '2016-05-12T16:05:28Z', + events_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/merges', + mirror_url: null, + updated_at: '2016-05-12T16:05:30Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/compare/{base}...{head}', + description: + "A reverse engineered protocol description and accompanying code for Radioshack's 2200087 multimeter", + forks_count: 1, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 13121042, + url: 'https://api.github.com/repos/mralexgray/ace', + fork: true, + name: 'ace', + size: 21080, + forks: 1, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: + 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/ace.git', + license: { + key: 'other', + url: null, + name: 'Other', + node_id: 'MDc6TGljZW5zZTA=', + spdx_id: 'NOASSERTION', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkxMzEyMTA0Mg==', + private: false, + ssh_url: 'git@github.com:mralexgray/ace.git', + svn_url: 'https://github.com/mralexgray/ace', + archived: false, + disabled: false, + has_wiki: true, + homepage: 'http://ace.c9.io', + html_url: 'https://github.com/mralexgray/ace', + keys_url: 'https://api.github.com/repos/mralexgray/ace/keys{/key_id}', + language: 'JavaScript', + tags_url: 'https://api.github.com/repos/mralexgray/ace/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/ace/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/ace.git', + forks_url: 'https://api.github.com/repos/mralexgray/ace/forks', + full_name: 'mralexgray/ace', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/ace/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/ace/pulls{/number}', + pushed_at: '2013-10-26T12:34:48Z', + teams_url: 'https://api.github.com/repos/mralexgray/ace/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/ace/git/trees{/sha}', + created_at: '2013-09-26T11:58:10Z', + events_url: 'https://api.github.com/repos/mralexgray/ace/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/ace/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/ace/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/ace/merges', + mirror_url: null, + updated_at: '2013-10-26T12:34:49Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/ace/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/ace/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/ace/compare/{base}...{head}', + description: 'Ace (Ajax.org Cloud9 Editor)', + forks_count: 1, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/ace/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/ace/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/ace/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/ace/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/ace/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/ace/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/ace/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/ace/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/ace/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/ace/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/ace/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/ace/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/ace/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/ace/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/ace/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/ace/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/ace/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/ace/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/ace/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/ace/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/ace/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 10791045, + url: 'https://api.github.com/repos/mralexgray/ACEView', + fork: true, + name: 'ACEView', + size: 1733, + forks: 1, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: + 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/ACEView.git', + license: { + key: 'other', + url: null, + name: 'Other', + node_id: 'MDc6TGljZW5zZTA=', + spdx_id: 'NOASSERTION', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkxMDc5MTA0NQ==', + private: false, + ssh_url: 'git@github.com:mralexgray/ACEView.git', + svn_url: 'https://github.com/mralexgray/ACEView', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/ACEView', + keys_url: + 'https://api.github.com/repos/mralexgray/ACEView/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/ACEView/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/ACEView/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/ACEView.git', + forks_url: 'https://api.github.com/repos/mralexgray/ACEView/forks', + full_name: 'mralexgray/ACEView', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/ACEView/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/ACEView/pulls{/number}', + pushed_at: '2014-05-09T01:36:23Z', + teams_url: 'https://api.github.com/repos/mralexgray/ACEView/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/ACEView/git/trees{/sha}', + created_at: '2013-06-19T12:15:04Z', + events_url: 'https://api.github.com/repos/mralexgray/ACEView/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/ACEView/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/ACEView/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/ACEView/merges', + mirror_url: null, + updated_at: '2015-11-24T01:14:10Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/ACEView/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/ACEView/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/ACEView/compare/{base}...{head}', + description: + 'Use the wonderful ACE editor in your Cocoa applications', + forks_count: 1, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/ACEView/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/ACEView/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/ACEView/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/ACEView/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/ACEView/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/ACEView/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/ACEView/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/ACEView/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/ACEView/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/ACEView/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/ACEView/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/ACEView/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/ACEView/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/ACEView/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/ACEView/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/ACEView/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/ACEView/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/ACEView/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/ACEView/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/ACEView/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/ACEView/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 13623648, + url: 'https://api.github.com/repos/mralexgray/ActiveLog', + fork: true, + name: 'ActiveLog', + size: 60, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: + 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/ActiveLog.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnkxMzYyMzY0OA==', + private: false, + ssh_url: 'git@github.com:mralexgray/ActiveLog.git', + svn_url: 'https://github.com/mralexgray/ActiveLog', + archived: false, + disabled: false, + has_wiki: true, + homepage: 'http://deepitpro.com/en/articles/ActiveLog/info/', + html_url: 'https://github.com/mralexgray/ActiveLog', + keys_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/ActiveLog/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/ActiveLog.git', + forks_url: 'https://api.github.com/repos/mralexgray/ActiveLog/forks', + full_name: 'mralexgray/ActiveLog', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/ActiveLog/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/pulls{/number}', + pushed_at: '2011-07-03T06:28:59Z', + teams_url: 'https://api.github.com/repos/mralexgray/ActiveLog/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/git/trees{/sha}', + created_at: '2013-10-16T15:52:37Z', + events_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/merges', + mirror_url: null, + updated_at: '2013-10-16T15:52:37Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/compare/{base}...{head}', + description: 'Shut up all logs with active filter.', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 9716210, + url: 'https://api.github.com/repos/mralexgray/adium', + fork: false, + name: 'adium', + size: 277719, + forks: 37, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: + 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/adium.git', + license: { + key: 'other', + url: null, + name: 'Other', + node_id: 'MDc6TGljZW5zZTA=', + spdx_id: 'NOASSERTION', + }, + node_id: 'MDEwOlJlcG9zaXRvcnk5NzE2MjEw', + private: false, + ssh_url: 'git@github.com:mralexgray/adium.git', + svn_url: 'https://github.com/mralexgray/adium', + archived: false, + disabled: false, + has_wiki: false, + homepage: null, + html_url: 'https://github.com/mralexgray/adium', + keys_url: + 'https://api.github.com/repos/mralexgray/adium/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/adium/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/adium/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/adium.git', + forks_url: 'https://api.github.com/repos/mralexgray/adium/forks', + full_name: 'mralexgray/adium', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/adium/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/adium/pulls{/number}', + pushed_at: '2013-04-26T16:43:53Z', + teams_url: 'https://api.github.com/repos/mralexgray/adium/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/adium/git/trees{/sha}', + created_at: '2013-04-27T14:59:33Z', + events_url: 'https://api.github.com/repos/mralexgray/adium/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/adium/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/adium/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/adium/merges', + mirror_url: null, + updated_at: '2019-12-11T06:51:45Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/adium/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/adium/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/adium/compare/{base}...{head}', + description: 'Official mirror of hg.adium.im', + forks_count: 37, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/adium/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/adium/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/adium/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/adium/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/adium/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/adium/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/adium/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/adium/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/adium/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/adium/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/adium/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/adium/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/adium/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/adium/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/adium/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/adium/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/adium/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/adium/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/adium/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/adium/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/adium/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 12752329, + url: 'https://api.github.com/repos/mralexgray/ADLivelyTableView', + fork: true, + name: 'ADLivelyTableView', + size: 73, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: + 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/ADLivelyTableView.git', + license: { + key: 'other', + url: null, + name: 'Other', + node_id: 'MDc6TGljZW5zZTA=', + spdx_id: 'NOASSERTION', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkxMjc1MjMyOQ==', + private: false, + ssh_url: 'git@github.com:mralexgray/ADLivelyTableView.git', + svn_url: 'https://github.com/mralexgray/ADLivelyTableView', + archived: false, + disabled: false, + has_wiki: true, + homepage: 'http://applidium.com/en/news/lively_uitableview/', + html_url: 'https://github.com/mralexgray/ADLivelyTableView', + keys_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/keys{/key_id}', + language: 'Objective-C', + tags_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/ADLivelyTableView.git', + forks_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/forks', + full_name: 'mralexgray/ADLivelyTableView', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/pulls{/number}', + pushed_at: '2012-05-10T10:40:15Z', + teams_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/git/trees{/sha}', + created_at: '2013-09-11T09:18:01Z', + events_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/merges', + mirror_url: null, + updated_at: '2013-09-11T09:18:03Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/compare/{base}...{head}', + description: 'Lively UITableView', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 5697379, + url: 'https://api.github.com/repos/mralexgray/AFIncrementalStore', + fork: true, + name: 'AFIncrementalStore', + size: 139, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: + 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/AFIncrementalStore.git', + license: { + key: 'mit', + url: 'https://api.github.com/licenses/mit', + name: 'MIT License', + node_id: 'MDc6TGljZW5zZTEz', + spdx_id: 'MIT', + }, + node_id: 'MDEwOlJlcG9zaXRvcnk1Njk3Mzc5', + private: false, + ssh_url: 'git@github.com:mralexgray/AFIncrementalStore.git', + svn_url: 'https://github.com/mralexgray/AFIncrementalStore', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/AFIncrementalStore', + keys_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/keys{/key_id}', + language: 'Objective-C', + tags_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/AFIncrementalStore.git', + forks_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/forks', + full_name: 'mralexgray/AFIncrementalStore', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/pulls{/number}', + pushed_at: '2012-09-01T22:46:25Z', + teams_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/git/trees{/sha}', + created_at: '2012-09-06T04:20:33Z', + events_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/merges', + mirror_url: null, + updated_at: '2013-01-12T03:15:29Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/compare/{base}...{head}', + description: 'Core Data Persistence with AFNetworking, Done Right', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 6969621, + url: 'https://api.github.com/repos/mralexgray/AFNetworking', + fork: true, + name: 'AFNetworking', + size: 4341, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: + 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/AFNetworking.git', + license: { + key: 'mit', + url: 'https://api.github.com/licenses/mit', + name: 'MIT License', + node_id: 'MDc6TGljZW5zZTEz', + spdx_id: 'MIT', + }, + node_id: 'MDEwOlJlcG9zaXRvcnk2OTY5NjIx', + private: false, + ssh_url: 'git@github.com:mralexgray/AFNetworking.git', + svn_url: 'https://github.com/mralexgray/AFNetworking', + archived: false, + disabled: false, + has_wiki: true, + homepage: 'http://afnetworking.com', + html_url: 'https://github.com/mralexgray/AFNetworking', + keys_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/AFNetworking/tags', + watchers: 2, + blobs_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/AFNetworking.git', + forks_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/forks', + full_name: 'mralexgray/AFNetworking', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/pulls{/number}', + pushed_at: '2014-01-24T07:14:32Z', + teams_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/git/trees{/sha}', + created_at: '2012-12-02T17:00:04Z', + events_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/merges', + mirror_url: null, + updated_at: '2014-01-24T07:14:33Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/compare/{base}...{head}', + description: 'A delightful iOS and OS X networking framework', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/stargazers', + watchers_count: 2, + deployments_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/issues/events{/number}', + stargazers_count: 2, + subscription_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 9485541, + url: 'https://api.github.com/repos/mralexgray/AGNSSplitView', + fork: true, + name: 'AGNSSplitView', + size: 68, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: + 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/AGNSSplitView.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnk5NDg1NTQx', + private: false, + ssh_url: 'git@github.com:mralexgray/AGNSSplitView.git', + svn_url: 'https://github.com/mralexgray/AGNSSplitView', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/AGNSSplitView', + keys_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/keys{/key_id}', + language: 'Objective-C', + tags_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/AGNSSplitView.git', + forks_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/forks', + full_name: 'mralexgray/AGNSSplitView', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/pulls{/number}', + pushed_at: '2013-02-26T00:32:32Z', + teams_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/git/trees{/sha}', + created_at: '2013-04-17T00:10:13Z', + events_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/merges', + mirror_url: null, + updated_at: '2013-04-17T00:10:13Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/compare/{base}...{head}', + description: 'Simple NSSplitView additions.', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 12767784, + url: 'https://api.github.com/repos/mralexgray/AGScopeBar', + fork: true, + name: 'AGScopeBar', + size: 64, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: + 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/AGScopeBar.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnkxMjc2Nzc4NA==', + private: false, + ssh_url: 'git@github.com:mralexgray/AGScopeBar.git', + svn_url: 'https://github.com/mralexgray/AGScopeBar', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/AGScopeBar', + keys_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/AGScopeBar/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/AGScopeBar.git', + forks_url: 'https://api.github.com/repos/mralexgray/AGScopeBar/forks', + full_name: 'mralexgray/AGScopeBar', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/AGScopeBar/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/pulls{/number}', + pushed_at: '2013-05-07T03:35:29Z', + teams_url: 'https://api.github.com/repos/mralexgray/AGScopeBar/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/git/trees{/sha}', + created_at: '2013-09-11T21:06:54Z', + events_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/merges', + mirror_url: null, + updated_at: '2013-09-11T21:06:54Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/compare/{base}...{head}', + description: 'Custom scope bar implementation for Cocoa', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 31829499, + url: 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin', + fork: true, + name: 'agvtool-xcode-plugin', + size: 102, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: + 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/agvtool-xcode-plugin.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnkzMTgyOTQ5OQ==', + private: false, + ssh_url: 'git@github.com:mralexgray/agvtool-xcode-plugin.git', + svn_url: 'https://github.com/mralexgray/agvtool-xcode-plugin', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/agvtool-xcode-plugin', + keys_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/keys{/key_id}', + language: 'Objective-C', + tags_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/agvtool-xcode-plugin.git', + forks_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/forks', + full_name: 'mralexgray/agvtool-xcode-plugin', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/pulls{/number}', + pushed_at: '2015-03-08T00:04:31Z', + teams_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/git/trees{/sha}', + created_at: '2015-03-07T22:15:38Z', + events_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/merges', + mirror_url: null, + updated_at: '2015-03-07T22:15:41Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/compare/{base}...{head}', + description: 'this is a plugin wrapper for agvtool for xcode.', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 9227846, + url: 'https://api.github.com/repos/mralexgray/AHContentBrowser', + fork: true, + name: 'AHContentBrowser', + size: 223, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: + 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/AHContentBrowser.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnk5MjI3ODQ2', + private: false, + ssh_url: 'git@github.com:mralexgray/AHContentBrowser.git', + svn_url: 'https://github.com/mralexgray/AHContentBrowser', + archived: false, + disabled: false, + has_wiki: true, + homepage: '', + html_url: 'https://github.com/mralexgray/AHContentBrowser', + keys_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/keys{/key_id}', + language: 'Objective-C', + tags_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/AHContentBrowser.git', + forks_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/forks', + full_name: 'mralexgray/AHContentBrowser', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/pulls{/number}', + pushed_at: '2013-03-13T17:38:23Z', + teams_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/git/trees{/sha}', + created_at: '2013-04-04T20:56:16Z', + events_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/merges', + mirror_url: null, + updated_at: '2015-10-22T05:00:24Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/compare/{base}...{head}', + description: + 'A Mac only webview that loads a fast readable version of the website if available.', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 37430328, + url: 'https://api.github.com/repos/mralexgray/AHLaunchCtl', + fork: true, + name: 'AHLaunchCtl', + size: 592, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: + 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/AHLaunchCtl.git', + license: { + key: 'mit', + url: 'https://api.github.com/licenses/mit', + name: 'MIT License', + node_id: 'MDc6TGljZW5zZTEz', + spdx_id: 'MIT', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkzNzQzMDMyOA==', + private: false, + ssh_url: 'git@github.com:mralexgray/AHLaunchCtl.git', + svn_url: 'https://github.com/mralexgray/AHLaunchCtl', + archived: false, + disabled: false, + has_wiki: true, + homepage: '', + html_url: 'https://github.com/mralexgray/AHLaunchCtl', + keys_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/AHLaunchCtl/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/AHLaunchCtl.git', + forks_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/forks', + full_name: 'mralexgray/AHLaunchCtl', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/pulls{/number}', + pushed_at: '2015-05-26T18:50:48Z', + teams_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/git/trees{/sha}', + created_at: '2015-06-14T21:31:03Z', + events_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/merges', + mirror_url: null, + updated_at: '2015-06-14T21:31:04Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/compare/{base}...{head}', + description: 'LaunchD Framework for Cocoa Apps', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 9167473, + url: 'https://api.github.com/repos/mralexgray/AHLayout', + fork: true, + name: 'AHLayout', + size: 359, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: + 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/AHLayout.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnk5MTY3NDcz', + private: false, + ssh_url: 'git@github.com:mralexgray/AHLayout.git', + svn_url: 'https://github.com/mralexgray/AHLayout', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/AHLayout', + keys_url: + 'https://api.github.com/repos/mralexgray/AHLayout/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/AHLayout/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/AHLayout/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/AHLayout.git', + forks_url: 'https://api.github.com/repos/mralexgray/AHLayout/forks', + full_name: 'mralexgray/AHLayout', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/AHLayout/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/AHLayout/pulls{/number}', + pushed_at: '2013-07-08T02:31:14Z', + teams_url: 'https://api.github.com/repos/mralexgray/AHLayout/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/AHLayout/git/trees{/sha}', + created_at: '2013-04-02T10:10:30Z', + events_url: 'https://api.github.com/repos/mralexgray/AHLayout/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/AHLayout/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/AHLayout/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/AHLayout/merges', + mirror_url: null, + updated_at: '2013-07-08T02:31:17Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/AHLayout/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/AHLayout/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/AHLayout/compare/{base}...{head}', + description: 'AHLayout', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/AHLayout/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/AHLayout/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/AHLayout/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/AHLayout/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/AHLayout/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/AHLayout/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/AHLayout/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/AHLayout/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/AHLayout/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/AHLayout/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/AHLayout/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/AHLayout/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/AHLayout/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/AHLayout/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/AHLayout/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/AHLayout/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/AHLayout/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/AHLayout/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/AHLayout/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/AHLayout/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/AHLayout/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 18450201, + url: 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework', + fork: true, + name: 'Airmail-Plug-In-Framework', + size: 888, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: + 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/Airmail-Plug-In-Framework.git', + license: { + key: 'gpl-2.0', + url: 'https://api.github.com/licenses/gpl-2.0', + name: 'GNU General Public License v2.0', + node_id: 'MDc6TGljZW5zZTg=', + spdx_id: 'GPL-2.0', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkxODQ1MDIwMQ==', + private: false, + ssh_url: 'git@github.com:mralexgray/Airmail-Plug-In-Framework.git', + svn_url: 'https://github.com/mralexgray/Airmail-Plug-In-Framework', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/Airmail-Plug-In-Framework', + keys_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/keys{/key_id}', + language: null, + tags_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/git/blobs{/sha}', + clone_url: + 'https://github.com/mralexgray/Airmail-Plug-In-Framework.git', + forks_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/forks', + full_name: 'mralexgray/Airmail-Plug-In-Framework', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/pulls{/number}', + pushed_at: '2014-03-27T15:42:19Z', + teams_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/git/trees{/sha}', + created_at: '2014-04-04T19:33:54Z', + events_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/merges', + mirror_url: null, + updated_at: '2014-11-23T19:31:04Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/compare/{base}...{head}', + description: null, + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 5203219, + url: 'https://api.github.com/repos/mralexgray/AJS-iTunes-API', + fork: true, + name: 'AJS-iTunes-API', + size: 103, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: + 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/AJS-iTunes-API.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnk1MjAzMjE5', + private: false, + ssh_url: 'git@github.com:mralexgray/AJS-iTunes-API.git', + svn_url: 'https://github.com/mralexgray/AJS-iTunes-API', + archived: false, + disabled: false, + has_wiki: true, + homepage: '', + html_url: 'https://github.com/mralexgray/AJS-iTunes-API', + keys_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/keys{/key_id}', + language: 'Objective-C', + tags_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/tags', + watchers: 2, + blobs_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/AJS-iTunes-API.git', + forks_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/forks', + full_name: 'mralexgray/AJS-iTunes-API', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/pulls{/number}', + pushed_at: '2011-10-30T22:26:48Z', + teams_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/git/trees{/sha}', + created_at: '2012-07-27T10:20:58Z', + events_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/merges', + mirror_url: null, + updated_at: '2013-01-11T11:00:05Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/compare/{base}...{head}', + description: + 'Cocoa wrapper for the iTunes search API - for iOS and Mac OSX projects', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/stargazers', + watchers_count: 2, + deployments_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/issues/events{/number}', + stargazers_count: 2, + subscription_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 10093801, + url: 'https://api.github.com/repos/mralexgray/Alcatraz', + fork: true, + name: 'Alcatraz', + size: 3668, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: + 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/Alcatraz.git', + license: { + key: 'mit', + url: 'https://api.github.com/licenses/mit', + name: 'MIT License', + node_id: 'MDc6TGljZW5zZTEz', + spdx_id: 'MIT', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkxMDA5MzgwMQ==', + private: false, + ssh_url: 'git@github.com:mralexgray/Alcatraz.git', + svn_url: 'https://github.com/mralexgray/Alcatraz', + archived: false, + disabled: false, + has_wiki: false, + homepage: 'mneorr.github.com/Alcatraz', + html_url: 'https://github.com/mralexgray/Alcatraz', + keys_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/Alcatraz/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/Alcatraz.git', + forks_url: 'https://api.github.com/repos/mralexgray/Alcatraz/forks', + full_name: 'mralexgray/Alcatraz', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/Alcatraz/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/pulls{/number}', + pushed_at: '2014-03-19T12:50:37Z', + teams_url: 'https://api.github.com/repos/mralexgray/Alcatraz/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/git/trees{/sha}', + created_at: '2013-05-16T04:41:13Z', + events_url: 'https://api.github.com/repos/mralexgray/Alcatraz/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/Alcatraz/merges', + mirror_url: null, + updated_at: '2014-03-19T20:38:35Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/compare/{base}...{head}', + description: 'The most awesome (and only) Xcode package manager!', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 12916552, + url: 'https://api.github.com/repos/mralexgray/alcatraz-packages', + fork: true, + name: 'alcatraz-packages', + size: 826, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: + 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/alcatraz-packages.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnkxMjkxNjU1Mg==', + private: false, + ssh_url: 'git@github.com:mralexgray/alcatraz-packages.git', + svn_url: 'https://github.com/mralexgray/alcatraz-packages', + archived: false, + disabled: false, + has_wiki: true, + homepage: 'mneorr.github.com/Alcatraz', + html_url: 'https://github.com/mralexgray/alcatraz-packages', + keys_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/keys{/key_id}', + language: 'Ruby', + tags_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/alcatraz-packages.git', + forks_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/forks', + full_name: 'mralexgray/alcatraz-packages', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/pulls{/number}', + pushed_at: '2015-12-14T16:21:31Z', + teams_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/git/trees{/sha}', + created_at: '2013-09-18T07:15:24Z', + events_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/merges', + mirror_url: null, + updated_at: '2015-11-10T20:52:30Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/compare/{base}...{head}', + description: 'Package list repository for Alcatraz', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 44278362, + url: 'https://api.github.com/repos/mralexgray/alexicons', + fork: true, + name: 'alexicons', + size: 257, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: + 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/alexicons.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnk0NDI3ODM2Mg==', + private: false, + ssh_url: 'git@github.com:mralexgray/alexicons.git', + svn_url: 'https://github.com/mralexgray/alexicons', + archived: false, + disabled: false, + has_wiki: false, + homepage: null, + html_url: 'https://github.com/mralexgray/alexicons', + keys_url: + 'https://api.github.com/repos/mralexgray/alexicons/keys{/key_id}', + language: 'CoffeeScript', + tags_url: 'https://api.github.com/repos/mralexgray/alexicons/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/alexicons/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/alexicons.git', + forks_url: 'https://api.github.com/repos/mralexgray/alexicons/forks', + full_name: 'mralexgray/alexicons', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/alexicons/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/alexicons/pulls{/number}', + pushed_at: '2015-10-16T03:57:51Z', + teams_url: 'https://api.github.com/repos/mralexgray/alexicons/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/alexicons/git/trees{/sha}', + created_at: '2015-10-14T21:49:39Z', + events_url: + 'https://api.github.com/repos/mralexgray/alexicons/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/alexicons/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/alexicons/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/alexicons/merges', + mirror_url: null, + updated_at: '2015-10-15T06:20:08Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/alexicons/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/alexicons/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/alexicons/compare/{base}...{head}', + description: 'Get popular cat names', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/alexicons/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/alexicons/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/alexicons/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/alexicons/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/alexicons/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/alexicons/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/alexicons/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/alexicons/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/alexicons/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/alexicons/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/alexicons/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/alexicons/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/alexicons/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/alexicons/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/alexicons/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/alexicons/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/alexicons/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/alexicons/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/alexicons/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/alexicons/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/alexicons/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 10476467, + url: 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate', + fork: true, + name: 'Alfred-Google-Translate', + size: 103, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: + 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/Alfred-Google-Translate.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnkxMDQ3NjQ2Nw==', + private: false, + ssh_url: 'git@github.com:mralexgray/Alfred-Google-Translate.git', + svn_url: 'https://github.com/mralexgray/Alfred-Google-Translate', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/Alfred-Google-Translate', + keys_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/keys{/key_id}', + language: 'Shell', + tags_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/git/blobs{/sha}', + clone_url: + 'https://github.com/mralexgray/Alfred-Google-Translate.git', + forks_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/forks', + full_name: 'mralexgray/Alfred-Google-Translate', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/pulls{/number}', + pushed_at: '2013-01-12T19:39:03Z', + teams_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/git/trees{/sha}', + created_at: '2013-06-04T10:45:10Z', + events_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/merges', + mirror_url: null, + updated_at: '2013-06-04T10:45:10Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/compare/{base}...{head}', + description: + 'Extension for Alfred that will do a Google translate for you', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 5524019, + url: 'https://api.github.com/repos/mralexgray/Amber', + fork: false, + name: 'Amber', + size: 48, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: + 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/Amber.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnk1NTI0MDE5', + private: false, + ssh_url: 'git@github.com:mralexgray/Amber.git', + svn_url: 'https://github.com/mralexgray/Amber', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/Amber', + keys_url: + 'https://api.github.com/repos/mralexgray/Amber/keys{/key_id}', + language: null, + tags_url: 'https://api.github.com/repos/mralexgray/Amber/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/Amber/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/Amber.git', + forks_url: 'https://api.github.com/repos/mralexgray/Amber/forks', + full_name: 'mralexgray/Amber', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/Amber/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/Amber/pulls{/number}', + pushed_at: '2012-08-23T10:38:25Z', + teams_url: 'https://api.github.com/repos/mralexgray/Amber/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/Amber/git/trees{/sha}', + created_at: '2012-08-23T10:38:24Z', + events_url: 'https://api.github.com/repos/mralexgray/Amber/events', + has_issues: true, + issues_url: + 'https://api.github.com/repos/mralexgray/Amber/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/Amber/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/Amber/merges', + mirror_url: null, + updated_at: '2013-01-11T22:25:35Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/Amber/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/Amber/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/Amber/compare/{base}...{head}', + description: 'Fork of the difficult-to-deal-with Amber.framework', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/Amber/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/Amber/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/Amber/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/Amber/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/Amber/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/Amber/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/Amber/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/Amber/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/Amber/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/Amber/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/Amber/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/Amber/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/Amber/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/Amber/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/Amber/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/Amber/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/Amber/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/Amber/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/Amber/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/Amber/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/Amber/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 10809060, + url: 'https://api.github.com/repos/mralexgray/Amethyst', + fork: true, + name: 'Amethyst', + size: 12623, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: + 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/Amethyst.git', + license: { + key: 'mit', + url: 'https://api.github.com/licenses/mit', + name: 'MIT License', + node_id: 'MDc6TGljZW5zZTEz', + spdx_id: 'MIT', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkxMDgwOTA2MA==', + private: false, + ssh_url: 'git@github.com:mralexgray/Amethyst.git', + svn_url: 'https://github.com/mralexgray/Amethyst', + archived: false, + disabled: false, + has_wiki: true, + homepage: 'http://ianyh.github.io/Amethyst/', + html_url: 'https://github.com/mralexgray/Amethyst', + keys_url: + 'https://api.github.com/repos/mralexgray/Amethyst/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/Amethyst/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/Amethyst/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/Amethyst.git', + forks_url: 'https://api.github.com/repos/mralexgray/Amethyst/forks', + full_name: 'mralexgray/Amethyst', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/Amethyst/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/Amethyst/pulls{/number}', + pushed_at: '2013-06-18T02:54:11Z', + teams_url: 'https://api.github.com/repos/mralexgray/Amethyst/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/Amethyst/git/trees{/sha}', + created_at: '2013-06-20T00:34:22Z', + events_url: 'https://api.github.com/repos/mralexgray/Amethyst/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/Amethyst/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/Amethyst/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/Amethyst/merges', + mirror_url: null, + updated_at: '2013-06-20T00:34:22Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/Amethyst/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/Amethyst/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/Amethyst/compare/{base}...{head}', + description: 'Tiling window manager for OS X.', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/Amethyst/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/Amethyst/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/Amethyst/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/Amethyst/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/Amethyst/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/Amethyst/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/Amethyst/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/Amethyst/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/Amethyst/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/Amethyst/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/Amethyst/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/Amethyst/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/Amethyst/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/Amethyst/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/Amethyst/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/Amethyst/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/Amethyst/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/Amethyst/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/Amethyst/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/Amethyst/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/Amethyst/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 3684286, + url: 'https://api.github.com/repos/mralexgray/Animated-Paths', + fork: true, + name: 'Animated-Paths', + size: 411, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: + 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/Animated-Paths.git', + license: { + key: 'other', + url: null, + name: 'Other', + node_id: 'MDc6TGljZW5zZTA=', + spdx_id: 'NOASSERTION', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkzNjg0Mjg2', + private: false, + ssh_url: 'git@github.com:mralexgray/Animated-Paths.git', + svn_url: 'https://github.com/mralexgray/Animated-Paths', + archived: false, + disabled: false, + has_wiki: true, + homepage: + 'http://oleb.net/blog/2010/12/animating-drawing-of-cgpath-with-cashapelayer/', + html_url: 'https://github.com/mralexgray/Animated-Paths', + keys_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/keys{/key_id}', + language: 'Objective-C', + tags_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/tags', + watchers: 2, + blobs_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/Animated-Paths.git', + forks_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/forks', + full_name: 'mralexgray/Animated-Paths', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/pulls{/number}', + pushed_at: '2010-12-30T20:56:51Z', + teams_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/git/trees{/sha}', + created_at: '2012-03-11T02:56:38Z', + events_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/merges', + mirror_url: null, + updated_at: '2013-01-08T04:12:21Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/compare/{base}...{head}', + description: + 'Demo project: Animating the drawing of a CGPath with CAShapeLayer.strokeEnd', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/stargazers', + watchers_count: 2, + deployments_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/issues/events{/number}', + stargazers_count: 2, + subscription_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 16662874, + url: 'https://api.github.com/repos/mralexgray/AnsiLove.framework', + fork: true, + name: 'AnsiLove.framework', + size: 3780, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: + 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/AnsiLove.framework.git', + license: { + key: 'other', + url: null, + name: 'Other', + node_id: 'MDc6TGljZW5zZTA=', + spdx_id: 'NOASSERTION', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkxNjY2Mjg3NA==', + private: false, + ssh_url: 'git@github.com:mralexgray/AnsiLove.framework.git', + svn_url: 'https://github.com/mralexgray/AnsiLove.framework', + archived: false, + disabled: false, + has_wiki: false, + homepage: 'http://byteproject.net', + html_url: 'https://github.com/mralexgray/AnsiLove.framework', + keys_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/keys{/key_id}', + language: 'M', + tags_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/AnsiLove.framework.git', + forks_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/forks', + full_name: 'mralexgray/AnsiLove.framework', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/pulls{/number}', + pushed_at: '2013-10-04T14:08:38Z', + teams_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/git/trees{/sha}', + created_at: '2014-02-09T08:30:27Z', + events_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/merges', + mirror_url: null, + updated_at: '2015-01-13T20:41:46Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/compare/{base}...{head}', + description: 'Cocoa Framework for rendering ANSi / ASCII art', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 5189563, + url: 'https://api.github.com/repos/mralexgray/ANTrackBar', + fork: true, + name: 'ANTrackBar', + size: 94, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: + 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/ANTrackBar.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnk1MTg5NTYz', + private: false, + ssh_url: 'git@github.com:mralexgray/ANTrackBar.git', + svn_url: 'https://github.com/mralexgray/ANTrackBar', + archived: false, + disabled: false, + has_wiki: true, + homepage: '', + html_url: 'https://github.com/mralexgray/ANTrackBar', + keys_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/ANTrackBar/tags', + watchers: 2, + blobs_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/ANTrackBar.git', + forks_url: 'https://api.github.com/repos/mralexgray/ANTrackBar/forks', + full_name: 'mralexgray/ANTrackBar', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/ANTrackBar/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/pulls{/number}', + pushed_at: '2012-03-09T01:40:02Z', + teams_url: 'https://api.github.com/repos/mralexgray/ANTrackBar/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/git/trees{/sha}', + created_at: '2012-07-26T08:17:22Z', + events_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/merges', + mirror_url: null, + updated_at: '2013-01-11T10:29:56Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/compare/{base}...{head}', + description: + 'An easy-to-use Cocoa seek bar with a pleasing appearance', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/stargazers', + watchers_count: 2, + deployments_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/issues/events{/number}', + stargazers_count: 2, + subscription_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 16240152, + url: 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C', + fork: true, + name: 'AOP-in-Objective-C', + size: 340, + forks: 1, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: + 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/AOP-in-Objective-C.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnkxNjI0MDE1Mg==', + private: false, + ssh_url: 'git@github.com:mralexgray/AOP-in-Objective-C.git', + svn_url: 'https://github.com/mralexgray/AOP-in-Objective-C', + archived: false, + disabled: false, + has_wiki: true, + homepage: 'http://innoli.hu/en/opensource/', + html_url: 'https://github.com/mralexgray/AOP-in-Objective-C', + keys_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/keys{/key_id}', + language: 'Objective-C', + tags_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/AOP-in-Objective-C.git', + forks_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/forks', + full_name: 'mralexgray/AOP-in-Objective-C', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/pulls{/number}', + pushed_at: '2014-02-12T16:23:20Z', + teams_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/git/trees{/sha}', + created_at: '2014-01-25T21:18:04Z', + events_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/merges', + mirror_url: null, + updated_at: '2014-06-19T19:38:12Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/compare/{base}...{head}', + description: + 'An NSProxy based library for easily enabling AOP like functionality in Objective-C.', + forks_count: 1, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/languages', + default_branch: 'travis-coveralls', + milestones_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 13141936, + url: 'https://api.github.com/repos/mralexgray/Apaxy', + fork: true, + name: 'Apaxy', + size: 113, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: + 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/Apaxy.git', + license: { + key: 'unlicense', + url: 'https://api.github.com/licenses/unlicense', + name: 'The Unlicense', + node_id: 'MDc6TGljZW5zZTE1', + spdx_id: 'Unlicense', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkxMzE0MTkzNg==', + private: false, + ssh_url: 'git@github.com:mralexgray/Apaxy.git', + svn_url: 'https://github.com/mralexgray/Apaxy', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/Apaxy', + keys_url: + 'https://api.github.com/repos/mralexgray/Apaxy/keys{/key_id}', + language: 'CSS', + tags_url: 'https://api.github.com/repos/mralexgray/Apaxy/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/Apaxy/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/Apaxy.git', + forks_url: 'https://api.github.com/repos/mralexgray/Apaxy/forks', + full_name: 'mralexgray/Apaxy', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/Apaxy/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/Apaxy/pulls{/number}', + pushed_at: '2013-08-02T16:01:32Z', + teams_url: 'https://api.github.com/repos/mralexgray/Apaxy/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/Apaxy/git/trees{/sha}', + created_at: '2013-09-27T05:05:35Z', + events_url: 'https://api.github.com/repos/mralexgray/Apaxy/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/Apaxy/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/Apaxy/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/Apaxy/merges', + mirror_url: null, + updated_at: '2018-02-16T21:40:24Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/Apaxy/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/Apaxy/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/Apaxy/compare/{base}...{head}', + description: + 'A simple, customisable theme for your Apache directory listing.', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/Apaxy/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/Apaxy/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/Apaxy/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/Apaxy/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/Apaxy/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/Apaxy/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/Apaxy/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/Apaxy/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/Apaxy/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/Apaxy/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/Apaxy/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/Apaxy/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/Apaxy/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/Apaxy/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/Apaxy/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/Apaxy/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/Apaxy/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/Apaxy/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/Apaxy/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/Apaxy/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/Apaxy/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 20027360, + url: 'https://api.github.com/repos/mralexgray/app', + fork: true, + name: 'app', + size: 1890, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: + 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/app.git', + license: { + key: 'other', + url: null, + name: 'Other', + node_id: 'MDc6TGljZW5zZTA=', + spdx_id: 'NOASSERTION', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkyMDAyNzM2MA==', + private: false, + ssh_url: 'git@github.com:mralexgray/app.git', + svn_url: 'https://github.com/mralexgray/app', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/app', + keys_url: 'https://api.github.com/repos/mralexgray/app/keys{/key_id}', + language: 'JavaScript', + tags_url: 'https://api.github.com/repos/mralexgray/app/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/app/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/app.git', + forks_url: 'https://api.github.com/repos/mralexgray/app/forks', + full_name: 'mralexgray/app', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/app/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/app/pulls{/number}', + pushed_at: '2014-05-20T19:51:38Z', + teams_url: 'https://api.github.com/repos/mralexgray/app/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/app/git/trees{/sha}', + created_at: '2014-05-21T15:54:20Z', + events_url: 'https://api.github.com/repos/mralexgray/app/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/app/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/app/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/app/merges', + mirror_url: null, + updated_at: '2014-05-21T15:54:22Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/app/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/app/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/app/compare/{base}...{head}', + description: 'Instant mobile web app creation', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/app/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/app/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/app/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/app/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/app/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/app/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/app/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/app/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/app/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/app/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/app/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/app/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/app/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/app/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/app/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/app/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/app/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/app/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/app/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/app/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/app/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + ], + data2: [ + { + id: 6104546, + url: 'https://api.github.com/repos/mralexgray/-REPONAME', + fork: false, + name: '-REPONAME', + size: 48, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: + 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/-REPONAME.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnk2MTA0NTQ2', + private: false, + ssh_url: 'git@github.com:mralexgray/-REPONAME.git', + svn_url: 'https://github.com/mralexgray/-REPONAME', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/-REPONAME', + keys_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/keys{/key_id}', + language: null, + tags_url: 'https://api.github.com/repos/mralexgray/-REPONAME/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/-REPONAME.git', + forks_url: 'https://api.github.com/repos/mralexgray/-REPONAME/forks', + full_name: 'mralexgray/-REPONAME', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/-REPONAME/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/pulls{/number}', + pushed_at: '2012-10-06T16:37:39Z', + teams_url: 'https://api.github.com/repos/mralexgray/-REPONAME/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/git/trees{/sha}', + created_at: '2012-10-06T16:37:39Z', + events_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/events', + has_issues: true, + issues_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/merges', + mirror_url: null, + updated_at: '2013-01-12T13:39:30Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/compare/{base}...{head}', + description: null, + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/-REPONAME/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 104510411, + url: 'https://api.github.com/repos/mralexgray/...', + fork: true, + name: '...', + size: 113, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: + 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/....git', + license: { + key: 'mit', + url: 'https://api.github.com/licenses/mit', + name: 'MIT License', + node_id: 'MDc6TGljZW5zZTEz', + spdx_id: 'MIT', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkxMDQ1MTA0MTE=', + private: false, + ssh_url: 'git@github.com:mralexgray/....git', + svn_url: 'https://github.com/mralexgray/...', + archived: false, + disabled: false, + has_wiki: false, + homepage: 'https://driesvints.com/blog/getting-started-with-dotfiles', + html_url: 'https://github.com/mralexgray/...', + keys_url: 'https://api.github.com/repos/mralexgray/.../keys{/key_id}', + language: 'Shell', + tags_url: 'https://api.github.com/repos/mralexgray/.../tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/.../git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/....git', + forks_url: 'https://api.github.com/repos/mralexgray/.../forks', + full_name: 'mralexgray/...', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/.../hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/.../pulls{/number}', + pushed_at: '2017-09-15T08:27:32Z', + teams_url: 'https://api.github.com/repos/mralexgray/.../teams', + trees_url: + 'https://api.github.com/repos/mralexgray/.../git/trees{/sha}', + created_at: '2017-09-22T19:19:42Z', + events_url: 'https://api.github.com/repos/mralexgray/.../events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/.../issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/.../labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/.../merges', + mirror_url: null, + updated_at: '2017-09-22T19:20:22Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/.../{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/.../commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/.../compare/{base}...{head}', + description: ':computer: Public repo for my personal dotfiles.', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/.../branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/.../comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/.../contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/.../git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/.../git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/.../releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/.../statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/.../assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/.../downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/.../languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/.../milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/.../stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/.../deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/.../git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/.../subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/.../contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/.../issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/.../subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/.../collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/.../issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/.../notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 58656723, + url: 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol', + fork: true, + name: '2200087-Serial-Protocol', + size: 41, + forks: 1, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: + 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/2200087-Serial-Protocol.git', + license: { + key: 'gpl-2.0', + url: 'https://api.github.com/licenses/gpl-2.0', + name: 'GNU General Public License v2.0', + node_id: 'MDc6TGljZW5zZTg=', + spdx_id: 'GPL-2.0', + }, + node_id: 'MDEwOlJlcG9zaXRvcnk1ODY1NjcyMw==', + private: false, + ssh_url: 'git@github.com:mralexgray/2200087-Serial-Protocol.git', + svn_url: 'https://github.com/mralexgray/2200087-Serial-Protocol', + archived: false, + disabled: false, + has_wiki: true, + homepage: 'http://daviddworken.com', + html_url: 'https://github.com/mralexgray/2200087-Serial-Protocol', + keys_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/keys{/key_id}', + language: 'Python', + tags_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/git/blobs{/sha}', + clone_url: + 'https://github.com/mralexgray/2200087-Serial-Protocol.git', + forks_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/forks', + full_name: 'mralexgray/2200087-Serial-Protocol', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/pulls{/number}', + pushed_at: '2016-05-12T16:07:24Z', + teams_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/git/trees{/sha}', + created_at: '2016-05-12T16:05:28Z', + events_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/merges', + mirror_url: null, + updated_at: '2016-05-12T16:05:30Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/compare/{base}...{head}', + description: + "A reverse engineered protocol description and accompanying code for Radioshack's 2200087 multimeter", + forks_count: 1, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/2200087-Serial-Protocol/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 13121042, + url: 'https://api.github.com/repos/mralexgray/ace', + fork: true, + name: 'ace', + size: 21080, + forks: 1, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: + 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/ace.git', + license: { + key: 'other', + url: null, + name: 'Other', + node_id: 'MDc6TGljZW5zZTA=', + spdx_id: 'NOASSERTION', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkxMzEyMTA0Mg==', + private: false, + ssh_url: 'git@github.com:mralexgray/ace.git', + svn_url: 'https://github.com/mralexgray/ace', + archived: false, + disabled: false, + has_wiki: true, + homepage: 'http://ace.c9.io', + html_url: 'https://github.com/mralexgray/ace', + keys_url: 'https://api.github.com/repos/mralexgray/ace/keys{/key_id}', + language: 'JavaScript', + tags_url: 'https://api.github.com/repos/mralexgray/ace/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/ace/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/ace.git', + forks_url: 'https://api.github.com/repos/mralexgray/ace/forks', + full_name: 'mralexgray/ace', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/ace/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/ace/pulls{/number}', + pushed_at: '2013-10-26T12:34:48Z', + teams_url: 'https://api.github.com/repos/mralexgray/ace/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/ace/git/trees{/sha}', + created_at: '2013-09-26T11:58:10Z', + events_url: 'https://api.github.com/repos/mralexgray/ace/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/ace/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/ace/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/ace/merges', + mirror_url: null, + updated_at: '2013-10-26T12:34:49Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/ace/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/ace/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/ace/compare/{base}...{head}', + description: 'Ace (Ajax.org Cloud9 Editor)', + forks_count: 1, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/ace/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/ace/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/ace/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/ace/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/ace/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/ace/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/ace/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/ace/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/ace/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/ace/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/ace/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/ace/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/ace/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/ace/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/ace/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/ace/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/ace/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/ace/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/ace/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/ace/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/ace/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 10791045, + url: 'https://api.github.com/repos/mralexgray/ACEView', + fork: true, + name: 'ACEView', + size: 1733, + forks: 1, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: + 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/ACEView.git', + license: { + key: 'other', + url: null, + name: 'Other', + node_id: 'MDc6TGljZW5zZTA=', + spdx_id: 'NOASSERTION', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkxMDc5MTA0NQ==', + private: false, + ssh_url: 'git@github.com:mralexgray/ACEView.git', + svn_url: 'https://github.com/mralexgray/ACEView', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/ACEView', + keys_url: + 'https://api.github.com/repos/mralexgray/ACEView/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/ACEView/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/ACEView/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/ACEView.git', + forks_url: 'https://api.github.com/repos/mralexgray/ACEView/forks', + full_name: 'mralexgray/ACEView', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/ACEView/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/ACEView/pulls{/number}', + pushed_at: '2014-05-09T01:36:23Z', + teams_url: 'https://api.github.com/repos/mralexgray/ACEView/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/ACEView/git/trees{/sha}', + created_at: '2013-06-19T12:15:04Z', + events_url: 'https://api.github.com/repos/mralexgray/ACEView/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/ACEView/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/ACEView/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/ACEView/merges', + mirror_url: null, + updated_at: '2015-11-24T01:14:10Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/ACEView/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/ACEView/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/ACEView/compare/{base}...{head}', + description: + 'Use the wonderful ACE editor in your Cocoa applications', + forks_count: 1, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/ACEView/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/ACEView/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/ACEView/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/ACEView/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/ACEView/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/ACEView/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/ACEView/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/ACEView/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/ACEView/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/ACEView/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/ACEView/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/ACEView/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/ACEView/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/ACEView/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/ACEView/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/ACEView/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/ACEView/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/ACEView/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/ACEView/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/ACEView/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/ACEView/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 13623648, + url: 'https://api.github.com/repos/mralexgray/ActiveLog', + fork: true, + name: 'ActiveLog', + size: 60, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: + 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/ActiveLog.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnkxMzYyMzY0OA==', + private: false, + ssh_url: 'git@github.com:mralexgray/ActiveLog.git', + svn_url: 'https://github.com/mralexgray/ActiveLog', + archived: false, + disabled: false, + has_wiki: true, + homepage: 'http://deepitpro.com/en/articles/ActiveLog/info/', + html_url: 'https://github.com/mralexgray/ActiveLog', + keys_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/ActiveLog/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/ActiveLog.git', + forks_url: 'https://api.github.com/repos/mralexgray/ActiveLog/forks', + full_name: 'mralexgray/ActiveLog', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/ActiveLog/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/pulls{/number}', + pushed_at: '2011-07-03T06:28:59Z', + teams_url: 'https://api.github.com/repos/mralexgray/ActiveLog/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/git/trees{/sha}', + created_at: '2013-10-16T15:52:37Z', + events_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/merges', + mirror_url: null, + updated_at: '2013-10-16T15:52:37Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/compare/{base}...{head}', + description: 'Shut up all logs with active filter.', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/ActiveLog/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 9716210, + url: 'https://api.github.com/repos/mralexgray/adium', + fork: false, + name: 'adium', + size: 277719, + forks: 37, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: + 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/adium.git', + license: { + key: 'other', + url: null, + name: 'Other', + node_id: 'MDc6TGljZW5zZTA=', + spdx_id: 'NOASSERTION', + }, + node_id: 'MDEwOlJlcG9zaXRvcnk5NzE2MjEw', + private: false, + ssh_url: 'git@github.com:mralexgray/adium.git', + svn_url: 'https://github.com/mralexgray/adium', + archived: false, + disabled: false, + has_wiki: false, + homepage: null, + html_url: 'https://github.com/mralexgray/adium', + keys_url: + 'https://api.github.com/repos/mralexgray/adium/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/adium/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/adium/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/adium.git', + forks_url: 'https://api.github.com/repos/mralexgray/adium/forks', + full_name: 'mralexgray/adium', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/adium/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/adium/pulls{/number}', + pushed_at: '2013-04-26T16:43:53Z', + teams_url: 'https://api.github.com/repos/mralexgray/adium/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/adium/git/trees{/sha}', + created_at: '2013-04-27T14:59:33Z', + events_url: 'https://api.github.com/repos/mralexgray/adium/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/adium/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/adium/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/adium/merges', + mirror_url: null, + updated_at: '2019-12-11T06:51:45Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/adium/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/adium/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/adium/compare/{base}...{head}', + description: 'Official mirror of hg.adium.im', + forks_count: 37, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/adium/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/adium/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/adium/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/adium/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/adium/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/adium/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/adium/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/adium/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/adium/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/adium/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/adium/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/adium/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/adium/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/adium/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/adium/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/adium/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/adium/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/adium/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/adium/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/adium/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/adium/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 12752329, + url: 'https://api.github.com/repos/mralexgray/ADLivelyTableView', + fork: true, + name: 'ADLivelyTableView', + size: 73, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: + 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/ADLivelyTableView.git', + license: { + key: 'other', + url: null, + name: 'Other', + node_id: 'MDc6TGljZW5zZTA=', + spdx_id: 'NOASSERTION', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkxMjc1MjMyOQ==', + private: false, + ssh_url: 'git@github.com:mralexgray/ADLivelyTableView.git', + svn_url: 'https://github.com/mralexgray/ADLivelyTableView', + archived: false, + disabled: false, + has_wiki: true, + homepage: 'http://applidium.com/en/news/lively_uitableview/', + html_url: 'https://github.com/mralexgray/ADLivelyTableView', + keys_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/keys{/key_id}', + language: 'Objective-C', + tags_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/ADLivelyTableView.git', + forks_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/forks', + full_name: 'mralexgray/ADLivelyTableView', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/pulls{/number}', + pushed_at: '2012-05-10T10:40:15Z', + teams_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/git/trees{/sha}', + created_at: '2013-09-11T09:18:01Z', + events_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/merges', + mirror_url: null, + updated_at: '2013-09-11T09:18:03Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/compare/{base}...{head}', + description: 'Lively UITableView', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/ADLivelyTableView/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 5697379, + url: 'https://api.github.com/repos/mralexgray/AFIncrementalStore', + fork: true, + name: 'AFIncrementalStore', + size: 139, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: + 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/AFIncrementalStore.git', + license: { + key: 'mit', + url: 'https://api.github.com/licenses/mit', + name: 'MIT License', + node_id: 'MDc6TGljZW5zZTEz', + spdx_id: 'MIT', + }, + node_id: 'MDEwOlJlcG9zaXRvcnk1Njk3Mzc5', + private: false, + ssh_url: 'git@github.com:mralexgray/AFIncrementalStore.git', + svn_url: 'https://github.com/mralexgray/AFIncrementalStore', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/AFIncrementalStore', + keys_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/keys{/key_id}', + language: 'Objective-C', + tags_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/AFIncrementalStore.git', + forks_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/forks', + full_name: 'mralexgray/AFIncrementalStore', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/pulls{/number}', + pushed_at: '2012-09-01T22:46:25Z', + teams_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/git/trees{/sha}', + created_at: '2012-09-06T04:20:33Z', + events_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/merges', + mirror_url: null, + updated_at: '2013-01-12T03:15:29Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/compare/{base}...{head}', + description: 'Core Data Persistence with AFNetworking, Done Right', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/AFIncrementalStore/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 6969621, + url: 'https://api.github.com/repos/mralexgray/AFNetworking', + fork: true, + name: 'AFNetworking', + size: 4341, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: + 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/AFNetworking.git', + license: { + key: 'mit', + url: 'https://api.github.com/licenses/mit', + name: 'MIT License', + node_id: 'MDc6TGljZW5zZTEz', + spdx_id: 'MIT', + }, + node_id: 'MDEwOlJlcG9zaXRvcnk2OTY5NjIx', + private: false, + ssh_url: 'git@github.com:mralexgray/AFNetworking.git', + svn_url: 'https://github.com/mralexgray/AFNetworking', + archived: false, + disabled: false, + has_wiki: true, + homepage: 'http://afnetworking.com', + html_url: 'https://github.com/mralexgray/AFNetworking', + keys_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/AFNetworking/tags', + watchers: 2, + blobs_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/AFNetworking.git', + forks_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/forks', + full_name: 'mralexgray/AFNetworking', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/pulls{/number}', + pushed_at: '2014-01-24T07:14:32Z', + teams_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/git/trees{/sha}', + created_at: '2012-12-02T17:00:04Z', + events_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/merges', + mirror_url: null, + updated_at: '2014-01-24T07:14:33Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/compare/{base}...{head}', + description: 'A delightful iOS and OS X networking framework', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/stargazers', + watchers_count: 2, + deployments_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/issues/events{/number}', + stargazers_count: 2, + subscription_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/AFNetworking/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 9485541, + url: 'https://api.github.com/repos/mralexgray/AGNSSplitView', + fork: true, + name: 'AGNSSplitView', + size: 68, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: + 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/AGNSSplitView.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnk5NDg1NTQx', + private: false, + ssh_url: 'git@github.com:mralexgray/AGNSSplitView.git', + svn_url: 'https://github.com/mralexgray/AGNSSplitView', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/AGNSSplitView', + keys_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/keys{/key_id}', + language: 'Objective-C', + tags_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/AGNSSplitView.git', + forks_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/forks', + full_name: 'mralexgray/AGNSSplitView', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/pulls{/number}', + pushed_at: '2013-02-26T00:32:32Z', + teams_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/git/trees{/sha}', + created_at: '2013-04-17T00:10:13Z', + events_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/merges', + mirror_url: null, + updated_at: '2013-04-17T00:10:13Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/compare/{base}...{head}', + description: 'Simple NSSplitView additions.', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/AGNSSplitView/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 12767784, + url: 'https://api.github.com/repos/mralexgray/AGScopeBar', + fork: true, + name: 'AGScopeBar', + size: 64, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: + 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/AGScopeBar.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnkxMjc2Nzc4NA==', + private: false, + ssh_url: 'git@github.com:mralexgray/AGScopeBar.git', + svn_url: 'https://github.com/mralexgray/AGScopeBar', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/AGScopeBar', + keys_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/AGScopeBar/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/AGScopeBar.git', + forks_url: 'https://api.github.com/repos/mralexgray/AGScopeBar/forks', + full_name: 'mralexgray/AGScopeBar', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/AGScopeBar/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/pulls{/number}', + pushed_at: '2013-05-07T03:35:29Z', + teams_url: 'https://api.github.com/repos/mralexgray/AGScopeBar/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/git/trees{/sha}', + created_at: '2013-09-11T21:06:54Z', + events_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/merges', + mirror_url: null, + updated_at: '2013-09-11T21:06:54Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/compare/{base}...{head}', + description: 'Custom scope bar implementation for Cocoa', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/AGScopeBar/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 31829499, + url: 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin', + fork: true, + name: 'agvtool-xcode-plugin', + size: 102, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: + 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/agvtool-xcode-plugin.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnkzMTgyOTQ5OQ==', + private: false, + ssh_url: 'git@github.com:mralexgray/agvtool-xcode-plugin.git', + svn_url: 'https://github.com/mralexgray/agvtool-xcode-plugin', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/agvtool-xcode-plugin', + keys_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/keys{/key_id}', + language: 'Objective-C', + tags_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/agvtool-xcode-plugin.git', + forks_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/forks', + full_name: 'mralexgray/agvtool-xcode-plugin', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/pulls{/number}', + pushed_at: '2015-03-08T00:04:31Z', + teams_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/git/trees{/sha}', + created_at: '2015-03-07T22:15:38Z', + events_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/merges', + mirror_url: null, + updated_at: '2015-03-07T22:15:41Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/compare/{base}...{head}', + description: 'this is a plugin wrapper for agvtool for xcode.', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/agvtool-xcode-plugin/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 9227846, + url: 'https://api.github.com/repos/mralexgray/AHContentBrowser', + fork: true, + name: 'AHContentBrowser', + size: 223, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: + 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/AHContentBrowser.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnk5MjI3ODQ2', + private: false, + ssh_url: 'git@github.com:mralexgray/AHContentBrowser.git', + svn_url: 'https://github.com/mralexgray/AHContentBrowser', + archived: false, + disabled: false, + has_wiki: true, + homepage: '', + html_url: 'https://github.com/mralexgray/AHContentBrowser', + keys_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/keys{/key_id}', + language: 'Objective-C', + tags_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/AHContentBrowser.git', + forks_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/forks', + full_name: 'mralexgray/AHContentBrowser', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/pulls{/number}', + pushed_at: '2013-03-13T17:38:23Z', + teams_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/git/trees{/sha}', + created_at: '2013-04-04T20:56:16Z', + events_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/merges', + mirror_url: null, + updated_at: '2015-10-22T05:00:24Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/compare/{base}...{head}', + description: + 'A Mac only webview that loads a fast readable version of the website if available.', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/AHContentBrowser/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 37430328, + url: 'https://api.github.com/repos/mralexgray/AHLaunchCtl', + fork: true, + name: 'AHLaunchCtl', + size: 592, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: + 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/AHLaunchCtl.git', + license: { + key: 'mit', + url: 'https://api.github.com/licenses/mit', + name: 'MIT License', + node_id: 'MDc6TGljZW5zZTEz', + spdx_id: 'MIT', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkzNzQzMDMyOA==', + private: false, + ssh_url: 'git@github.com:mralexgray/AHLaunchCtl.git', + svn_url: 'https://github.com/mralexgray/AHLaunchCtl', + archived: false, + disabled: false, + has_wiki: true, + homepage: '', + html_url: 'https://github.com/mralexgray/AHLaunchCtl', + keys_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/AHLaunchCtl/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/AHLaunchCtl.git', + forks_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/forks', + full_name: 'mralexgray/AHLaunchCtl', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/pulls{/number}', + pushed_at: '2015-05-26T18:50:48Z', + teams_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/git/trees{/sha}', + created_at: '2015-06-14T21:31:03Z', + events_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/merges', + mirror_url: null, + updated_at: '2015-06-14T21:31:04Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/compare/{base}...{head}', + description: 'LaunchD Framework for Cocoa Apps', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/AHLaunchCtl/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 9167473, + url: 'https://api.github.com/repos/mralexgray/AHLayout', + fork: true, + name: 'AHLayout', + size: 359, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: + 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/AHLayout.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnk5MTY3NDcz', + private: false, + ssh_url: 'git@github.com:mralexgray/AHLayout.git', + svn_url: 'https://github.com/mralexgray/AHLayout', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/AHLayout', + keys_url: + 'https://api.github.com/repos/mralexgray/AHLayout/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/AHLayout/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/AHLayout/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/AHLayout.git', + forks_url: 'https://api.github.com/repos/mralexgray/AHLayout/forks', + full_name: 'mralexgray/AHLayout', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/AHLayout/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/AHLayout/pulls{/number}', + pushed_at: '2013-07-08T02:31:14Z', + teams_url: 'https://api.github.com/repos/mralexgray/AHLayout/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/AHLayout/git/trees{/sha}', + created_at: '2013-04-02T10:10:30Z', + events_url: 'https://api.github.com/repos/mralexgray/AHLayout/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/AHLayout/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/AHLayout/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/AHLayout/merges', + mirror_url: null, + updated_at: '2013-07-08T02:31:17Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/AHLayout/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/AHLayout/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/AHLayout/compare/{base}...{head}', + description: 'AHLayout', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/AHLayout/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/AHLayout/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/AHLayout/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/AHLayout/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/AHLayout/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/AHLayout/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/AHLayout/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/AHLayout/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/AHLayout/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/AHLayout/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/AHLayout/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/AHLayout/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/AHLayout/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/AHLayout/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/AHLayout/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/AHLayout/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/AHLayout/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/AHLayout/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/AHLayout/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/AHLayout/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/AHLayout/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 18450201, + url: 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework', + fork: true, + name: 'Airmail-Plug-In-Framework', + size: 888, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: + 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/Airmail-Plug-In-Framework.git', + license: { + key: 'gpl-2.0', + url: 'https://api.github.com/licenses/gpl-2.0', + name: 'GNU General Public License v2.0', + node_id: 'MDc6TGljZW5zZTg=', + spdx_id: 'GPL-2.0', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkxODQ1MDIwMQ==', + private: false, + ssh_url: 'git@github.com:mralexgray/Airmail-Plug-In-Framework.git', + svn_url: 'https://github.com/mralexgray/Airmail-Plug-In-Framework', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/Airmail-Plug-In-Framework', + keys_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/keys{/key_id}', + language: null, + tags_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/git/blobs{/sha}', + clone_url: + 'https://github.com/mralexgray/Airmail-Plug-In-Framework.git', + forks_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/forks', + full_name: 'mralexgray/Airmail-Plug-In-Framework', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/pulls{/number}', + pushed_at: '2014-03-27T15:42:19Z', + teams_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/git/trees{/sha}', + created_at: '2014-04-04T19:33:54Z', + events_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/merges', + mirror_url: null, + updated_at: '2014-11-23T19:31:04Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/compare/{base}...{head}', + description: null, + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/Airmail-Plug-In-Framework/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 5203219, + url: 'https://api.github.com/repos/mralexgray/AJS-iTunes-API', + fork: true, + name: 'AJS-iTunes-API', + size: 103, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: + 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/AJS-iTunes-API.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnk1MjAzMjE5', + private: false, + ssh_url: 'git@github.com:mralexgray/AJS-iTunes-API.git', + svn_url: 'https://github.com/mralexgray/AJS-iTunes-API', + archived: false, + disabled: false, + has_wiki: true, + homepage: '', + html_url: 'https://github.com/mralexgray/AJS-iTunes-API', + keys_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/keys{/key_id}', + language: 'Objective-C', + tags_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/tags', + watchers: 2, + blobs_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/AJS-iTunes-API.git', + forks_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/forks', + full_name: 'mralexgray/AJS-iTunes-API', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/pulls{/number}', + pushed_at: '2011-10-30T22:26:48Z', + teams_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/git/trees{/sha}', + created_at: '2012-07-27T10:20:58Z', + events_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/merges', + mirror_url: null, + updated_at: '2013-01-11T11:00:05Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/compare/{base}...{head}', + description: + 'Cocoa wrapper for the iTunes search API - for iOS and Mac OSX projects', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/stargazers', + watchers_count: 2, + deployments_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/issues/events{/number}', + stargazers_count: 2, + subscription_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/AJS-iTunes-API/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 10093801, + url: 'https://api.github.com/repos/mralexgray/Alcatraz', + fork: true, + name: 'Alcatraz', + size: 3668, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: + 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/Alcatraz.git', + license: { + key: 'mit', + url: 'https://api.github.com/licenses/mit', + name: 'MIT License', + node_id: 'MDc6TGljZW5zZTEz', + spdx_id: 'MIT', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkxMDA5MzgwMQ==', + private: false, + ssh_url: 'git@github.com:mralexgray/Alcatraz.git', + svn_url: 'https://github.com/mralexgray/Alcatraz', + archived: false, + disabled: false, + has_wiki: false, + homepage: 'mneorr.github.com/Alcatraz', + html_url: 'https://github.com/mralexgray/Alcatraz', + keys_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/Alcatraz/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/Alcatraz.git', + forks_url: 'https://api.github.com/repos/mralexgray/Alcatraz/forks', + full_name: 'mralexgray/Alcatraz', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/Alcatraz/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/pulls{/number}', + pushed_at: '2014-03-19T12:50:37Z', + teams_url: 'https://api.github.com/repos/mralexgray/Alcatraz/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/git/trees{/sha}', + created_at: '2013-05-16T04:41:13Z', + events_url: 'https://api.github.com/repos/mralexgray/Alcatraz/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/Alcatraz/merges', + mirror_url: null, + updated_at: '2014-03-19T20:38:35Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/compare/{base}...{head}', + description: 'The most awesome (and only) Xcode package manager!', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/Alcatraz/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 12916552, + url: 'https://api.github.com/repos/mralexgray/alcatraz-packages', + fork: true, + name: 'alcatraz-packages', + size: 826, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: + 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/alcatraz-packages.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnkxMjkxNjU1Mg==', + private: false, + ssh_url: 'git@github.com:mralexgray/alcatraz-packages.git', + svn_url: 'https://github.com/mralexgray/alcatraz-packages', + archived: false, + disabled: false, + has_wiki: true, + homepage: 'mneorr.github.com/Alcatraz', + html_url: 'https://github.com/mralexgray/alcatraz-packages', + keys_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/keys{/key_id}', + language: 'Ruby', + tags_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/alcatraz-packages.git', + forks_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/forks', + full_name: 'mralexgray/alcatraz-packages', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/pulls{/number}', + pushed_at: '2015-12-14T16:21:31Z', + teams_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/git/trees{/sha}', + created_at: '2013-09-18T07:15:24Z', + events_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/merges', + mirror_url: null, + updated_at: '2015-11-10T20:52:30Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/compare/{base}...{head}', + description: 'Package list repository for Alcatraz', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/alcatraz-packages/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 44278362, + url: 'https://api.github.com/repos/mralexgray/alexicons', + fork: true, + name: 'alexicons', + size: 257, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: + 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/alexicons.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnk0NDI3ODM2Mg==', + private: false, + ssh_url: 'git@github.com:mralexgray/alexicons.git', + svn_url: 'https://github.com/mralexgray/alexicons', + archived: false, + disabled: false, + has_wiki: false, + homepage: null, + html_url: 'https://github.com/mralexgray/alexicons', + keys_url: + 'https://api.github.com/repos/mralexgray/alexicons/keys{/key_id}', + language: 'CoffeeScript', + tags_url: 'https://api.github.com/repos/mralexgray/alexicons/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/alexicons/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/alexicons.git', + forks_url: 'https://api.github.com/repos/mralexgray/alexicons/forks', + full_name: 'mralexgray/alexicons', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/alexicons/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/alexicons/pulls{/number}', + pushed_at: '2015-10-16T03:57:51Z', + teams_url: 'https://api.github.com/repos/mralexgray/alexicons/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/alexicons/git/trees{/sha}', + created_at: '2015-10-14T21:49:39Z', + events_url: + 'https://api.github.com/repos/mralexgray/alexicons/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/alexicons/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/alexicons/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/alexicons/merges', + mirror_url: null, + updated_at: '2015-10-15T06:20:08Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/alexicons/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/alexicons/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/alexicons/compare/{base}...{head}', + description: 'Get popular cat names', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/alexicons/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/alexicons/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/alexicons/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/alexicons/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/alexicons/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/alexicons/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/alexicons/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/alexicons/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/alexicons/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/alexicons/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/alexicons/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/alexicons/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/alexicons/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/alexicons/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/alexicons/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/alexicons/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/alexicons/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/alexicons/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/alexicons/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/alexicons/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/alexicons/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 10476467, + url: 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate', + fork: true, + name: 'Alfred-Google-Translate', + size: 103, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: + 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/Alfred-Google-Translate.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnkxMDQ3NjQ2Nw==', + private: false, + ssh_url: 'git@github.com:mralexgray/Alfred-Google-Translate.git', + svn_url: 'https://github.com/mralexgray/Alfred-Google-Translate', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/Alfred-Google-Translate', + keys_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/keys{/key_id}', + language: 'Shell', + tags_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/git/blobs{/sha}', + clone_url: + 'https://github.com/mralexgray/Alfred-Google-Translate.git', + forks_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/forks', + full_name: 'mralexgray/Alfred-Google-Translate', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/pulls{/number}', + pushed_at: '2013-01-12T19:39:03Z', + teams_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/git/trees{/sha}', + created_at: '2013-06-04T10:45:10Z', + events_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/merges', + mirror_url: null, + updated_at: '2013-06-04T10:45:10Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/compare/{base}...{head}', + description: + 'Extension for Alfred that will do a Google translate for you', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/Alfred-Google-Translate/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 5524019, + url: 'https://api.github.com/repos/mralexgray/Amber', + fork: false, + name: 'Amber', + size: 48, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: + 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/Amber.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnk1NTI0MDE5', + private: false, + ssh_url: 'git@github.com:mralexgray/Amber.git', + svn_url: 'https://github.com/mralexgray/Amber', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/Amber', + keys_url: + 'https://api.github.com/repos/mralexgray/Amber/keys{/key_id}', + language: null, + tags_url: 'https://api.github.com/repos/mralexgray/Amber/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/Amber/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/Amber.git', + forks_url: 'https://api.github.com/repos/mralexgray/Amber/forks', + full_name: 'mralexgray/Amber', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/Amber/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/Amber/pulls{/number}', + pushed_at: '2012-08-23T10:38:25Z', + teams_url: 'https://api.github.com/repos/mralexgray/Amber/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/Amber/git/trees{/sha}', + created_at: '2012-08-23T10:38:24Z', + events_url: 'https://api.github.com/repos/mralexgray/Amber/events', + has_issues: true, + issues_url: + 'https://api.github.com/repos/mralexgray/Amber/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/Amber/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/Amber/merges', + mirror_url: null, + updated_at: '2013-01-11T22:25:35Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/Amber/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/Amber/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/Amber/compare/{base}...{head}', + description: 'Fork of the difficult-to-deal-with Amber.framework', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/Amber/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/Amber/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/Amber/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/Amber/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/Amber/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/Amber/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/Amber/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/Amber/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/Amber/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/Amber/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/Amber/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/Amber/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/Amber/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/Amber/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/Amber/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/Amber/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/Amber/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/Amber/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/Amber/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/Amber/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/Amber/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 10809060, + url: 'https://api.github.com/repos/mralexgray/Amethyst', + fork: true, + name: 'Amethyst', + size: 12623, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: + 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/Amethyst.git', + license: { + key: 'mit', + url: 'https://api.github.com/licenses/mit', + name: 'MIT License', + node_id: 'MDc6TGljZW5zZTEz', + spdx_id: 'MIT', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkxMDgwOTA2MA==', + private: false, + ssh_url: 'git@github.com:mralexgray/Amethyst.git', + svn_url: 'https://github.com/mralexgray/Amethyst', + archived: false, + disabled: false, + has_wiki: true, + homepage: 'http://ianyh.github.io/Amethyst/', + html_url: 'https://github.com/mralexgray/Amethyst', + keys_url: + 'https://api.github.com/repos/mralexgray/Amethyst/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/Amethyst/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/Amethyst/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/Amethyst.git', + forks_url: 'https://api.github.com/repos/mralexgray/Amethyst/forks', + full_name: 'mralexgray/Amethyst', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/Amethyst/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/Amethyst/pulls{/number}', + pushed_at: '2013-06-18T02:54:11Z', + teams_url: 'https://api.github.com/repos/mralexgray/Amethyst/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/Amethyst/git/trees{/sha}', + created_at: '2013-06-20T00:34:22Z', + events_url: 'https://api.github.com/repos/mralexgray/Amethyst/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/Amethyst/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/Amethyst/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/Amethyst/merges', + mirror_url: null, + updated_at: '2013-06-20T00:34:22Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/Amethyst/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/Amethyst/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/Amethyst/compare/{base}...{head}', + description: 'Tiling window manager for OS X.', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/Amethyst/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/Amethyst/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/Amethyst/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/Amethyst/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/Amethyst/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/Amethyst/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/Amethyst/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/Amethyst/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/Amethyst/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/Amethyst/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/Amethyst/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/Amethyst/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/Amethyst/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/Amethyst/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/Amethyst/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/Amethyst/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/Amethyst/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/Amethyst/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/Amethyst/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/Amethyst/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/Amethyst/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 3684286, + url: 'https://api.github.com/repos/mralexgray/Animated-Paths', + fork: true, + name: 'Animated-Paths', + size: 411, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: + 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/Animated-Paths.git', + license: { + key: 'other', + url: null, + name: 'Other', + node_id: 'MDc6TGljZW5zZTA=', + spdx_id: 'NOASSERTION', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkzNjg0Mjg2', + private: false, + ssh_url: 'git@github.com:mralexgray/Animated-Paths.git', + svn_url: 'https://github.com/mralexgray/Animated-Paths', + archived: false, + disabled: false, + has_wiki: true, + homepage: + 'http://oleb.net/blog/2010/12/animating-drawing-of-cgpath-with-cashapelayer/', + html_url: 'https://github.com/mralexgray/Animated-Paths', + keys_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/keys{/key_id}', + language: 'Objective-C', + tags_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/tags', + watchers: 2, + blobs_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/Animated-Paths.git', + forks_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/forks', + full_name: 'mralexgray/Animated-Paths', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/pulls{/number}', + pushed_at: '2010-12-30T20:56:51Z', + teams_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/git/trees{/sha}', + created_at: '2012-03-11T02:56:38Z', + events_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/merges', + mirror_url: null, + updated_at: '2013-01-08T04:12:21Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/compare/{base}...{head}', + description: + 'Demo project: Animating the drawing of a CGPath with CAShapeLayer.strokeEnd', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/stargazers', + watchers_count: 2, + deployments_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/issues/events{/number}', + stargazers_count: 2, + subscription_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/Animated-Paths/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 16662874, + url: 'https://api.github.com/repos/mralexgray/AnsiLove.framework', + fork: true, + name: 'AnsiLove.framework', + size: 3780, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: + 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/AnsiLove.framework.git', + license: { + key: 'other', + url: null, + name: 'Other', + node_id: 'MDc6TGljZW5zZTA=', + spdx_id: 'NOASSERTION', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkxNjY2Mjg3NA==', + private: false, + ssh_url: 'git@github.com:mralexgray/AnsiLove.framework.git', + svn_url: 'https://github.com/mralexgray/AnsiLove.framework', + archived: false, + disabled: false, + has_wiki: false, + homepage: 'http://byteproject.net', + html_url: 'https://github.com/mralexgray/AnsiLove.framework', + keys_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/keys{/key_id}', + language: 'M', + tags_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/AnsiLove.framework.git', + forks_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/forks', + full_name: 'mralexgray/AnsiLove.framework', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/pulls{/number}', + pushed_at: '2013-10-04T14:08:38Z', + teams_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/git/trees{/sha}', + created_at: '2014-02-09T08:30:27Z', + events_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/merges', + mirror_url: null, + updated_at: '2015-01-13T20:41:46Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/compare/{base}...{head}', + description: 'Cocoa Framework for rendering ANSi / ASCII art', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/AnsiLove.framework/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 5189563, + url: 'https://api.github.com/repos/mralexgray/ANTrackBar', + fork: true, + name: 'ANTrackBar', + size: 94, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: + 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/ANTrackBar.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnk1MTg5NTYz', + private: false, + ssh_url: 'git@github.com:mralexgray/ANTrackBar.git', + svn_url: 'https://github.com/mralexgray/ANTrackBar', + archived: false, + disabled: false, + has_wiki: true, + homepage: '', + html_url: 'https://github.com/mralexgray/ANTrackBar', + keys_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/keys{/key_id}', + language: 'Objective-C', + tags_url: 'https://api.github.com/repos/mralexgray/ANTrackBar/tags', + watchers: 2, + blobs_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/ANTrackBar.git', + forks_url: 'https://api.github.com/repos/mralexgray/ANTrackBar/forks', + full_name: 'mralexgray/ANTrackBar', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/ANTrackBar/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/pulls{/number}', + pushed_at: '2012-03-09T01:40:02Z', + teams_url: 'https://api.github.com/repos/mralexgray/ANTrackBar/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/git/trees{/sha}', + created_at: '2012-07-26T08:17:22Z', + events_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/merges', + mirror_url: null, + updated_at: '2013-01-11T10:29:56Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/compare/{base}...{head}', + description: + 'An easy-to-use Cocoa seek bar with a pleasing appearance', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/stargazers', + watchers_count: 2, + deployments_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/issues/events{/number}', + stargazers_count: 2, + subscription_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/ANTrackBar/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 16240152, + url: 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C', + fork: true, + name: 'AOP-in-Objective-C', + size: 340, + forks: 1, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: + 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/AOP-in-Objective-C.git', + license: null, + node_id: 'MDEwOlJlcG9zaXRvcnkxNjI0MDE1Mg==', + private: false, + ssh_url: 'git@github.com:mralexgray/AOP-in-Objective-C.git', + svn_url: 'https://github.com/mralexgray/AOP-in-Objective-C', + archived: false, + disabled: false, + has_wiki: true, + homepage: 'http://innoli.hu/en/opensource/', + html_url: 'https://github.com/mralexgray/AOP-in-Objective-C', + keys_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/keys{/key_id}', + language: 'Objective-C', + tags_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/AOP-in-Objective-C.git', + forks_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/forks', + full_name: 'mralexgray/AOP-in-Objective-C', + has_pages: false, + hooks_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/pulls{/number}', + pushed_at: '2014-02-12T16:23:20Z', + teams_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/git/trees{/sha}', + created_at: '2014-01-25T21:18:04Z', + events_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/labels{/name}', + merges_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/merges', + mirror_url: null, + updated_at: '2014-06-19T19:38:12Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/compare/{base}...{head}', + description: + 'An NSProxy based library for easily enabling AOP like functionality in Objective-C.', + forks_count: 1, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/languages', + default_branch: 'travis-coveralls', + milestones_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/AOP-in-Objective-C/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 13141936, + url: 'https://api.github.com/repos/mralexgray/Apaxy', + fork: true, + name: 'Apaxy', + size: 113, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: + 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/Apaxy.git', + license: { + key: 'unlicense', + url: 'https://api.github.com/licenses/unlicense', + name: 'The Unlicense', + node_id: 'MDc6TGljZW5zZTE1', + spdx_id: 'Unlicense', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkxMzE0MTkzNg==', + private: false, + ssh_url: 'git@github.com:mralexgray/Apaxy.git', + svn_url: 'https://github.com/mralexgray/Apaxy', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/Apaxy', + keys_url: + 'https://api.github.com/repos/mralexgray/Apaxy/keys{/key_id}', + language: 'CSS', + tags_url: 'https://api.github.com/repos/mralexgray/Apaxy/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/Apaxy/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/Apaxy.git', + forks_url: 'https://api.github.com/repos/mralexgray/Apaxy/forks', + full_name: 'mralexgray/Apaxy', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/Apaxy/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/Apaxy/pulls{/number}', + pushed_at: '2013-08-02T16:01:32Z', + teams_url: 'https://api.github.com/repos/mralexgray/Apaxy/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/Apaxy/git/trees{/sha}', + created_at: '2013-09-27T05:05:35Z', + events_url: 'https://api.github.com/repos/mralexgray/Apaxy/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/Apaxy/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/Apaxy/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/Apaxy/merges', + mirror_url: null, + updated_at: '2018-02-16T21:40:24Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/Apaxy/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/Apaxy/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/Apaxy/compare/{base}...{head}', + description: + 'A simple, customisable theme for your Apache directory listing.', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/Apaxy/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/Apaxy/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/Apaxy/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/Apaxy/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/Apaxy/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/Apaxy/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/Apaxy/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/Apaxy/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/Apaxy/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/Apaxy/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/Apaxy/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/Apaxy/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/Apaxy/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/Apaxy/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/Apaxy/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/Apaxy/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/Apaxy/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/Apaxy/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/Apaxy/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/Apaxy/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/Apaxy/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + { + id: 20027360, + url: 'https://api.github.com/repos/mralexgray/app', + fork: true, + name: 'app', + size: 1890, + forks: 0, + owner: { + id: 262517, + url: 'https://api.github.com/users/mralexgray', + type: 'User', + login: 'mralexgray', + node_id: 'MDQ6VXNlcjI2MjUxNw==', + html_url: 'https://github.com/mralexgray', + gists_url: + 'https://api.github.com/users/mralexgray/gists{/gist_id}', + repos_url: 'https://api.github.com/users/mralexgray/repos', + avatar_url: 'https://avatars.githubusercontent.com/u/262517?v=4', + events_url: + 'https://api.github.com/users/mralexgray/events{/privacy}', + site_admin: false, + gravatar_id: '', + starred_url: + 'https://api.github.com/users/mralexgray/starred{/owner}{/repo}', + followers_url: 'https://api.github.com/users/mralexgray/followers', + following_url: + 'https://api.github.com/users/mralexgray/following{/other_user}', + organizations_url: 'https://api.github.com/users/mralexgray/orgs', + subscriptions_url: + 'https://api.github.com/users/mralexgray/subscriptions', + received_events_url: + 'https://api.github.com/users/mralexgray/received_events', + }, + topics: [], + git_url: 'git://github.com/mralexgray/app.git', + license: { + key: 'other', + url: null, + name: 'Other', + node_id: 'MDc6TGljZW5zZTA=', + spdx_id: 'NOASSERTION', + }, + node_id: 'MDEwOlJlcG9zaXRvcnkyMDAyNzM2MA==', + private: false, + ssh_url: 'git@github.com:mralexgray/app.git', + svn_url: 'https://github.com/mralexgray/app', + archived: false, + disabled: false, + has_wiki: true, + homepage: null, + html_url: 'https://github.com/mralexgray/app', + keys_url: 'https://api.github.com/repos/mralexgray/app/keys{/key_id}', + language: 'JavaScript', + tags_url: 'https://api.github.com/repos/mralexgray/app/tags', + watchers: 0, + blobs_url: + 'https://api.github.com/repos/mralexgray/app/git/blobs{/sha}', + clone_url: 'https://github.com/mralexgray/app.git', + forks_url: 'https://api.github.com/repos/mralexgray/app/forks', + full_name: 'mralexgray/app', + has_pages: false, + hooks_url: 'https://api.github.com/repos/mralexgray/app/hooks', + pulls_url: + 'https://api.github.com/repos/mralexgray/app/pulls{/number}', + pushed_at: '2014-05-20T19:51:38Z', + teams_url: 'https://api.github.com/repos/mralexgray/app/teams', + trees_url: + 'https://api.github.com/repos/mralexgray/app/git/trees{/sha}', + created_at: '2014-05-21T15:54:20Z', + events_url: 'https://api.github.com/repos/mralexgray/app/events', + has_issues: false, + issues_url: + 'https://api.github.com/repos/mralexgray/app/issues{/number}', + labels_url: + 'https://api.github.com/repos/mralexgray/app/labels{/name}', + merges_url: 'https://api.github.com/repos/mralexgray/app/merges', + mirror_url: null, + updated_at: '2014-05-21T15:54:22Z', + visibility: 'public', + archive_url: + 'https://api.github.com/repos/mralexgray/app/{archive_format}{/ref}', + commits_url: + 'https://api.github.com/repos/mralexgray/app/commits{/sha}', + compare_url: + 'https://api.github.com/repos/mralexgray/app/compare/{base}...{head}', + description: 'Instant mobile web app creation', + forks_count: 0, + is_template: false, + open_issues: 0, + branches_url: + 'https://api.github.com/repos/mralexgray/app/branches{/branch}', + comments_url: + 'https://api.github.com/repos/mralexgray/app/comments{/number}', + contents_url: + 'https://api.github.com/repos/mralexgray/app/contents/{+path}', + git_refs_url: + 'https://api.github.com/repos/mralexgray/app/git/refs{/sha}', + git_tags_url: + 'https://api.github.com/repos/mralexgray/app/git/tags{/sha}', + has_projects: true, + releases_url: + 'https://api.github.com/repos/mralexgray/app/releases{/id}', + statuses_url: + 'https://api.github.com/repos/mralexgray/app/statuses/{sha}', + allow_forking: true, + assignees_url: + 'https://api.github.com/repos/mralexgray/app/assignees{/user}', + downloads_url: + 'https://api.github.com/repos/mralexgray/app/downloads', + has_downloads: true, + languages_url: + 'https://api.github.com/repos/mralexgray/app/languages', + default_branch: 'master', + milestones_url: + 'https://api.github.com/repos/mralexgray/app/milestones{/number}', + stargazers_url: + 'https://api.github.com/repos/mralexgray/app/stargazers', + watchers_count: 0, + deployments_url: + 'https://api.github.com/repos/mralexgray/app/deployments', + git_commits_url: + 'https://api.github.com/repos/mralexgray/app/git/commits{/sha}', + subscribers_url: + 'https://api.github.com/repos/mralexgray/app/subscribers', + contributors_url: + 'https://api.github.com/repos/mralexgray/app/contributors', + issue_events_url: + 'https://api.github.com/repos/mralexgray/app/issues/events{/number}', + stargazers_count: 0, + subscription_url: + 'https://api.github.com/repos/mralexgray/app/subscription', + collaborators_url: + 'https://api.github.com/repos/mralexgray/app/collaborators{/collaborator}', + issue_comment_url: + 'https://api.github.com/repos/mralexgray/app/issues/comments{/number}', + notifications_url: + 'https://api.github.com/repos/mralexgray/app/notifications{?since,all,participating}', + open_issues_count: 0, + web_commit_signoff_required: false, + }, + ], + trait1: 'new-val', + }, + library: { + name: 'http', + }, + }, + rudderId: 'daf823fb-e8d3-413a-8313-d34cd756f968', + messageId: 'c864b4cd-8f07-4922-b3d0-82ef04c987d3', + timestamp: '2020-02-02T00:23:09.544Z', + 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', + }, + PayloadSize: 95943, + LastJobStatus: { + JobID: 0, + JobState: '', + AttemptNum: 0, + ExecTime: '0001-01-01T00:00:00Z', + RetryTime: '0001-01-01T00:00:00Z', + ErrorCode: '', + ErrorResponse: null, + Parameters: null, + WorkspaceId: '', + }, + Parameters: { + record_id: null, + source_id: '2DTlLPQxignYp4ag9sISgGN2uY7', + event_name: '', + event_type: 'identify', + message_id: 'c864b4cd-8f07-4922-b3d0-82ef04c987d3', + received_at: '2022-08-18T08:43:13.521+05:30', + workspaceId: '2DTlBMipxWfJZzZ1SsjELQWvkwd', + transform_at: 'router', + source_job_id: '', + destination_id: '2DTozIMGtBwTGNJtuvdPByFSL2Z', + gateway_job_id: 6, + source_task_id: '', + source_batch_id: '', + source_category: '', + source_job_run_id: '', + source_task_run_id: '', + source_definition_id: '2DTlJaW1jHhM8B27Et2CMTZoxZF', + destination_definition_id: '', + }, + WorkspaceId: '2DTlBMipxWfJZzZ1SsjELQWvkwd', + }, + workerAssignedTime: '2022-08-18T08:43:16.586825+05:30', + }, + ], + batched: false, + statusCode: 400, + error: 'payload size limit exceeded', + }, + ], + }, + }, + }, + }, +]; diff --git a/test/integrations/destinations/leanplum/processor/data.ts b/test/integrations/destinations/leanplum/processor/data.ts new file mode 100644 index 0000000000..a866b035a8 --- /dev/null +++ b/test/integrations/destinations/leanplum/processor/data.ts @@ -0,0 +1,1708 @@ +export const data = [ + { + name: 'leanplum', + description: 'Test 0', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + anonymousId: '5094f5704b9cf2b3', + channel: 'mobile', + 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', + }, + library: { name: 'com.rudderstack.android.sdk.core', version: '1.0.1-beta.1' }, + locale: 'en-US', + network: { carrier: 'Android', bluetooth: false, cellular: true, wifi: true }, + os: { name: 'Android', version: '8.1.0' }, + screen: { density: 420, height: 1794, width: 1080 }, + timezone: 'Asia/Kolkata', + traits: { anonymousId: '5094f5704b9cf2b3' }, + userAgent: + 'Dalvik/2.1.0 (Linux; U; Android 8.1.0; Android SDK built for x86 Build/OSM1.180201.007)', + }, + event: 'MainActivity', + integrations: { All: true }, + messageId: 'id1', + properties: { name: 'MainActivity', automatic: true }, + originalTimestamp: '2020-03-12T09:05:03.421Z', + type: 'screen', + sentAt: '2020-03-12T09:05:13.042Z', + }, + destination: { + Config: { + applicationId: 'leanplum_application_id', + clientKey: 'leanplum_client_key', + isDevelop: true, + useNativeSDK: false, + sendEvents: false, + }, + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://api.leanplum.com/api', + headers: { 'Content-Type': 'application/json' }, + params: { action: 'start' }, + body: { + JSON: { + apiVersion: '1.0.6', + appId: 'leanplum_application_id', + clientKey: 'leanplum_client_key', + userId: '5094f5704b9cf2b3', + deviceId: '5094f5704b9cf2b3', + appVersion: '1.0', + systemName: 'Android', + systemVersion: '8.1.0', + deviceName: 'generic_x86', + deviceModel: 'Android SDK built for x86', + userAttributes: { anonymousId: '5094f5704b9cf2b3' }, + locale: 'en-US', + timezone: 'Asia/Kolkata', + time: 1584003903, + devMode: true, + }, + XML: {}, + JSON_ARRAY: {}, + FORM: {}, + }, + files: {}, + userId: '5094f5704b9cf2b3', + }, + statusCode: 200, + }, + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://api.leanplum.com/api', + headers: { 'Content-Type': 'application/json' }, + params: { action: 'advance' }, + body: { + JSON: { + apiVersion: '1.0.6', + appId: 'leanplum_application_id', + clientKey: 'leanplum_client_key', + userId: '5094f5704b9cf2b3', + state: 'MainActivity', + deviceId: '5094f5704b9cf2b3', + time: 1584003903, + devMode: true, + }, + XML: {}, + JSON_ARRAY: {}, + FORM: {}, + }, + files: {}, + userId: '5094f5704b9cf2b3', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'leanplum', + description: 'Test 1', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + anonymousId: '5094f5704b9cf2b3', + channel: 'mobile', + 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', + }, + library: { name: 'com.rudderstack.android.sdk.core', version: '1.0.1-beta.1' }, + locale: 'en-US', + network: { carrier: 'Android', bluetooth: false, cellular: true, wifi: true }, + os: { name: 'Android', version: '8.1.0' }, + screen: { density: 420, height: 1794, width: 1080 }, + timezone: 'Asia/Kolkata', + traits: { anonymousId: '5094f5704b9cf2b3' }, + userAgent: + 'Dalvik/2.1.0 (Linux; U; Android 8.1.0; Android SDK built for x86 Build/OSM1.180201.007)', + }, + event: 'MainActivity', + integrations: { All: true }, + messageId: 'id2', + properties: { name: 'MainActivity', automatic: true }, + originalTimestamp: '2020-03-12T09:05:03.421Z', + type: 'screen', + sentAt: '2020-03-12T09:05:13.042Z', + }, + destination: { + Config: { + applicationId: 'leanplum_application_id', + clientKey: 'leanplum_client_key__', + isDevelop: true, + useNativeSDK: false, + sendEvents: false, + }, + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://api.leanplum.com/api', + headers: { 'Content-Type': 'application/json' }, + params: { action: 'start' }, + body: { + JSON: { + apiVersion: '1.0.6', + appId: 'leanplum_application_id', + clientKey: 'leanplum_client_key__', + userId: '5094f5704b9cf2b3', + deviceId: '5094f5704b9cf2b3', + appVersion: '1.0', + systemName: 'Android', + systemVersion: '8.1.0', + deviceName: 'generic_x86', + deviceModel: 'Android SDK built for x86', + userAttributes: { anonymousId: '5094f5704b9cf2b3' }, + locale: 'en-US', + timezone: 'Asia/Kolkata', + time: 1584003903, + devMode: true, + }, + XML: {}, + JSON_ARRAY: {}, + FORM: {}, + }, + files: {}, + userId: '5094f5704b9cf2b3', + }, + statusCode: 200, + }, + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://api.leanplum.com/api', + headers: { 'Content-Type': 'application/json' }, + params: { action: 'advance' }, + body: { + JSON: { + apiVersion: '1.0.6', + appId: 'leanplum_application_id', + clientKey: 'leanplum_client_key__', + userId: '5094f5704b9cf2b3', + state: 'MainActivity', + deviceId: '5094f5704b9cf2b3', + time: 1584003903, + devMode: true, + }, + XML: {}, + JSON_ARRAY: {}, + FORM: {}, + }, + files: {}, + userId: '5094f5704b9cf2b3', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'leanplum', + description: 'Test 2', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + anonymousId: '5094f5704b9cf2b3', + channel: 'mobile', + 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', + }, + library: { name: 'com.rudderstack.android.sdk.core', version: '1.0.1-beta.1' }, + locale: 'en-US', + network: { carrier: 'Android', bluetooth: false, cellular: true, wifi: true }, + os: { name: 'Android', version: '8.1.0' }, + screen: { density: 420, height: 1794, width: 1080 }, + timezone: 'Asia/Kolkata', + traits: { anonymousId: '5094f5704b9cf2b3' }, + userAgent: + 'Dalvik/2.1.0 (Linux; U; Android 8.1.0; Android SDK built for x86 Build/OSM1.180201.007)', + }, + event: 'MainActivity', + integrations: { All: true }, + messageId: 'id3', + properties: { name: 'MainActivity', automatic: true }, + originalTimestamp: '2020-03-12T09:05:03.421Z', + type: 'screen', + sentAt: '2020-03-12T09:05:13.042Z', + }, + destination: { + Config: { + applicationId: 'leanplum_application_id', + clientKey: 'leanplum_client_key', + isDevelop: true, + useNativeSDK: false, + sendEvents: false, + }, + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://api.leanplum.com/api', + headers: { 'Content-Type': 'application/json' }, + params: { action: 'start' }, + body: { + JSON: { + apiVersion: '1.0.6', + appId: 'leanplum_application_id', + clientKey: 'leanplum_client_key', + userId: '5094f5704b9cf2b3', + deviceId: '5094f5704b9cf2b3', + appVersion: '1.0', + systemName: 'Android', + systemVersion: '8.1.0', + deviceName: 'generic_x86', + deviceModel: 'Android SDK built for x86', + userAttributes: { anonymousId: '5094f5704b9cf2b3' }, + locale: 'en-US', + timezone: 'Asia/Kolkata', + time: 1584003903, + devMode: true, + }, + XML: {}, + JSON_ARRAY: {}, + FORM: {}, + }, + files: {}, + userId: '5094f5704b9cf2b3', + }, + statusCode: 200, + }, + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://api.leanplum.com/api', + headers: { 'Content-Type': 'application/json' }, + params: { action: 'advance' }, + body: { + JSON: { + apiVersion: '1.0.6', + appId: 'leanplum_application_id', + clientKey: 'leanplum_client_key', + userId: '5094f5704b9cf2b3', + state: 'MainActivity', + deviceId: '5094f5704b9cf2b3', + time: 1584003903, + devMode: true, + }, + XML: {}, + JSON_ARRAY: {}, + FORM: {}, + }, + files: {}, + userId: '5094f5704b9cf2b3', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'leanplum', + description: 'Test 3', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + anonymousId: '5094f5704b9cf2b3', + channel: 'mobile', + 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', + }, + library: { name: 'com.rudderstack.android.sdk.core', version: '1.0.1-beta.1' }, + locale: 'en-US', + network: { carrier: 'Android', bluetooth: false, cellular: true, wifi: true }, + os: { name: 'Android', version: '8.1.0' }, + screen: { density: 420, height: 1794, width: 1080 }, + timezone: 'Asia/Kolkata', + traits: { anonymousId: '5094f5704b9cf2b3' }, + userAgent: + 'Dalvik/2.1.0 (Linux; U; Android 8.1.0; Android SDK built for x86 Build/OSM1.180201.007)', + }, + event: 'MainActivity', + integrations: { All: true }, + messageId: 'id3', + properties: { name: 'MainActivity', automatic: true }, + originalTimestamp: '2020-03-12T09:05:03.421Z', + type: 'page', + sentAt: '2020-03-12T09:05:13.042Z', + }, + destination: { + Config: { + applicationId: 'leanplum_application_id', + clientKey: 'leanplum_client_key', + isDevelop: true, + useNativeSDK: false, + sendEvents: false, + }, + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://api.leanplum.com/api', + headers: { 'Content-Type': 'application/json' }, + params: { action: 'start' }, + body: { + JSON: { + apiVersion: '1.0.6', + appId: 'leanplum_application_id', + clientKey: 'leanplum_client_key', + userId: '5094f5704b9cf2b3', + deviceId: '5094f5704b9cf2b3', + appVersion: '1.0', + systemName: 'Android', + systemVersion: '8.1.0', + deviceName: 'generic_x86', + deviceModel: 'Android SDK built for x86', + userAttributes: { anonymousId: '5094f5704b9cf2b3' }, + locale: 'en-US', + timezone: 'Asia/Kolkata', + time: 1584003903, + devMode: true, + }, + XML: {}, + JSON_ARRAY: {}, + FORM: {}, + }, + files: {}, + userId: '5094f5704b9cf2b3', + }, + statusCode: 200, + }, + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://api.leanplum.com/api', + headers: { 'Content-Type': 'application/json' }, + params: { action: 'advance' }, + body: { + JSON: { + apiVersion: '1.0.6', + appId: 'leanplum_application_id', + clientKey: 'leanplum_client_key', + userId: '5094f5704b9cf2b3', + state: 'MainActivity', + deviceId: '5094f5704b9cf2b3', + time: 1584003903, + devMode: true, + }, + XML: {}, + JSON_ARRAY: {}, + FORM: {}, + }, + files: {}, + userId: '5094f5704b9cf2b3', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'leanplum', + description: 'Test 4', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + anonymousId: '5094f5704b9cf2b3', + channel: 'mobile', + name: 'Test Page Name', + 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', + }, + library: { name: 'com.rudderstack.android.sdk.core', version: '1.0.1-beta.1' }, + locale: 'en-US', + network: { carrier: 'Android', bluetooth: false, cellular: true, wifi: true }, + os: { name: 'Android', version: '8.1.0' }, + screen: { density: 420, height: 1794, width: 1080 }, + timezone: 'Asia/Kolkata', + traits: { anonymousId: '5094f5704b9cf2b3' }, + userAgent: + 'Dalvik/2.1.0 (Linux; U; Android 8.1.0; Android SDK built for x86 Build/OSM1.180201.007)', + }, + event: 'MainActivity', + integrations: { All: true }, + messageId: 'id3', + properties: { name: 'MainActivity', automatic: true }, + originalTimestamp: '2020-03-12T09:05:03.421Z', + type: 'page', + sentAt: '2020-03-12T09:05:13.042Z', + }, + destination: { + Config: { + applicationId: 'leanplum_application_id', + clientKey: 'leanplum_client_key', + isDevelop: true, + useNativeSDK: false, + sendEvents: false, + }, + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://api.leanplum.com/api', + headers: { 'Content-Type': 'application/json' }, + params: { action: 'start' }, + body: { + JSON: { + apiVersion: '1.0.6', + appId: 'leanplum_application_id', + clientKey: 'leanplum_client_key', + userId: '5094f5704b9cf2b3', + deviceId: '5094f5704b9cf2b3', + appVersion: '1.0', + systemName: 'Android', + systemVersion: '8.1.0', + deviceName: 'generic_x86', + deviceModel: 'Android SDK built for x86', + userAttributes: { anonymousId: '5094f5704b9cf2b3' }, + locale: 'en-US', + timezone: 'Asia/Kolkata', + time: 1584003903, + devMode: true, + }, + XML: {}, + JSON_ARRAY: {}, + FORM: {}, + }, + files: {}, + userId: '5094f5704b9cf2b3', + }, + statusCode: 200, + }, + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://api.leanplum.com/api', + headers: { 'Content-Type': 'application/json' }, + params: { action: 'advance' }, + body: { + JSON: { + apiVersion: '1.0.6', + appId: 'leanplum_application_id', + clientKey: 'leanplum_client_key', + userId: '5094f5704b9cf2b3', + state: 'Test Page Name', + deviceId: '5094f5704b9cf2b3', + time: 1584003903, + devMode: true, + }, + XML: {}, + JSON_ARRAY: {}, + FORM: {}, + }, + files: {}, + userId: '5094f5704b9cf2b3', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'leanplum', + description: 'Test 5', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + anonymousId: '5094f5704b9cf2b3', + channel: 'mobile', + 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', + }, + library: { name: 'com.rudderstack.android.sdk.core', version: '1.0.1-beta.1' }, + locale: 'en-US', + network: { carrier: 'Android', bluetooth: false, cellular: true, wifi: true }, + os: { name: 'Android', version: '8.1.0' }, + screen: { density: 420, height: 1794, width: 1080 }, + timezone: 'Asia/Kolkata', + traits: { anonymousId: '5094f5704b9cf2b3' }, + userAgent: + 'Dalvik/2.1.0 (Linux; U; Android 8.1.0; Android SDK built for x86 Build/OSM1.180201.007)', + }, + event: 'MainActivity', + integrations: { All: true }, + messageId: 'id4', + properties: { name: 'MainActivity', automatic: true }, + originalTimestamp: '2020-03-12T09:05:03.421Z', + type: 'screen', + sentAt: '2020-03-12T09:05:13.042Z', + }, + destination: { + Config: { + applicationId: 'leanplum_application_id', + clientKey: 'leanplum_client_key', + isDevelop: true, + useNativeSDK: false, + sendEvents: false, + }, + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://api.leanplum.com/api', + headers: { 'Content-Type': 'application/json' }, + params: { action: 'start' }, + body: { + JSON: { + apiVersion: '1.0.6', + appId: 'leanplum_application_id', + clientKey: 'leanplum_client_key', + userId: '5094f5704b9cf2b3', + deviceId: '5094f5704b9cf2b3', + appVersion: '1.0', + systemName: 'Android', + systemVersion: '8.1.0', + deviceName: 'generic_x86', + deviceModel: 'Android SDK built for x86', + userAttributes: { anonymousId: '5094f5704b9cf2b3' }, + locale: 'en-US', + timezone: 'Asia/Kolkata', + time: 1584003903, + devMode: true, + }, + XML: {}, + JSON_ARRAY: {}, + FORM: {}, + }, + files: {}, + userId: '5094f5704b9cf2b3', + }, + statusCode: 200, + }, + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://api.leanplum.com/api', + headers: { 'Content-Type': 'application/json' }, + params: { action: 'advance' }, + body: { + JSON: { + apiVersion: '1.0.6', + appId: 'leanplum_application_id', + clientKey: 'leanplum_client_key', + userId: '5094f5704b9cf2b3', + state: 'MainActivity', + deviceId: '5094f5704b9cf2b3', + time: 1584003903, + devMode: true, + }, + XML: {}, + JSON_ARRAY: {}, + FORM: {}, + }, + files: {}, + userId: '5094f5704b9cf2b3', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'leanplum', + description: 'Test 6', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + anonymousId: '5094f5704b9cf2b3', + channel: 'mobile', + 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', + }, + library: { name: 'com.rudderstack.android.sdk.core', version: '1.0.1-beta.1' }, + locale: 'en-US', + network: { carrier: 'Android', bluetooth: false, cellular: true, wifi: true }, + os: { name: 'Android', version: '8.1.0' }, + screen: { density: 420, height: 1794, width: 1080 }, + timezone: 'Asia/Kolkata', + traits: { anonymousId: '5094f5704b9cf2b3' }, + userAgent: + 'Dalvik/2.1.0 (Linux; U; Android 8.1.0; Android SDK built for x86 Build/OSM1.180201.007)', + }, + event: 'MainActivity', + integrations: { All: true }, + messageId: 'id5', + properties: { automatic: true }, + originalTimestamp: '2020-03-12T09:05:03.421Z', + type: 'screen', + sentAt: '2020-03-12T09:05:13.042Z', + }, + destination: { + Config: { + applicationId: 'leanplum_application_id', + clientKey: 'leanplum_client_key', + isDevelop: true, + useNativeSDK: false, + sendEvents: false, + }, + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://api.leanplum.com/api', + headers: { 'Content-Type': 'application/json' }, + params: { action: 'start' }, + body: { + JSON: { + apiVersion: '1.0.6', + appId: 'leanplum_application_id', + clientKey: 'leanplum_client_key', + userId: '5094f5704b9cf2b3', + deviceId: '5094f5704b9cf2b3', + appVersion: '1.0', + systemName: 'Android', + systemVersion: '8.1.0', + deviceName: 'generic_x86', + deviceModel: 'Android SDK built for x86', + userAttributes: { anonymousId: '5094f5704b9cf2b3' }, + locale: 'en-US', + timezone: 'Asia/Kolkata', + time: 1584003903, + devMode: true, + }, + XML: {}, + JSON_ARRAY: {}, + FORM: {}, + }, + files: {}, + userId: '5094f5704b9cf2b3', + }, + statusCode: 200, + }, + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://api.leanplum.com/api', + headers: { 'Content-Type': 'application/json' }, + params: { action: 'advance' }, + body: { + JSON: { + apiVersion: '1.0.6', + appId: 'leanplum_application_id', + clientKey: 'leanplum_client_key', + userId: '5094f5704b9cf2b3', + state: 'MainActivity', + deviceId: '5094f5704b9cf2b3', + time: 1584003903, + devMode: true, + }, + XML: {}, + JSON_ARRAY: {}, + FORM: {}, + }, + files: {}, + userId: '5094f5704b9cf2b3', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'leanplum', + description: 'Test 7', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + anonymousId: '5094f5704b9cf2b3', + channel: 'mobile', + 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', + }, + library: { name: 'com.rudderstack.android.sdk.core', version: '1.0.1-beta.1' }, + locale: 'en-US', + network: { carrier: 'Android', bluetooth: false, cellular: true, wifi: true }, + os: { name: 'Android', version: '8.1.0' }, + screen: { density: 420, height: 1794, width: 1080 }, + timezone: 'Asia/Kolkata', + traits: { anonymousId: '5094f5704b9cf2b3' }, + userAgent: + 'Dalvik/2.1.0 (Linux; U; Android 8.1.0; Android SDK built for x86 Build/OSM1.180201.007)', + }, + integrations: { All: true }, + messageId: 'id6', + properties: { automatic: true }, + originalTimestamp: '2020-03-12T09:05:03.421Z', + type: 'screen', + sentAt: '2020-03-12T09:05:13.042Z', + }, + destination: { + Config: { + applicationId: 'leanplum_application_id', + clientKey: 'leanplum_client_key', + isDevelop: true, + useNativeSDK: false, + sendEvents: false, + }, + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + error: "Missing required value from [\"properties.name\",\"event\"]", + statTags: { + destType: 'LEANPLUM', + errorCategory: 'dataValidation', + errorType: 'instrumentation', + feature: 'processor', + implementation: 'native', + module: 'destination', + }, + statusCode: 400, + }, + ], + }, + }, + }, + { + name: 'leanplum', + description: 'Test 8', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + channel: 'web', + context: { + app: { + build: '1.0.0', + name: 'RudderLabs JavaScript SDK', + namespace: 'com.rudderlabs.javascript', + 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 }, + traits: { + id: 'some_developer_id', + createAt: '2019-10-14T09:03:17.562Z', + address: { country: 'USA', city: 'NY' }, + country: 'India', + city: 'Delhi', + }, + }, + type: 'identify', + messageId: '84e26acc-56a5-4835-8233-591137fca468', + originalTimestamp: '2019-10-14T09:03:17.562Z', + anonymousId: '00000000000000000000000000', + integrations: { All: true }, + sentAt: '2019-10-14T09:03:22.563Z', + }, + destination: { + Config: { + applicationId: 'leanplum_application_id', + clientKey: 'leanplum_client_key', + isDevelop: true, + useNativeSDK: false, + sendEvents: false, + }, + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://api.leanplum.com/api', + headers: { 'Content-Type': 'application/json' }, + params: { action: 'setUserAttributes' }, + body: { + JSON: { + apiVersion: '1.0.6', + appId: 'leanplum_application_id', + clientKey: 'leanplum_client_key', + userId: '00000000000000000000000000', + newUserId: 'some_developer_id', + userAttributes: { + id: 'some_developer_id', + createAt: '2019-10-14T09:03:17.562Z', + address: { country: 'USA', city: 'NY' }, + country: 'India', + city: 'Delhi', + }, + created: 1571043798, + locale: 'en-US', + country: 'USA', + city: 'NY', + time: 1571043798, + devMode: true, + }, + XML: {}, + JSON_ARRAY: {}, + FORM: {}, + }, + files: {}, + userId: '00000000000000000000000000', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'leanplum', + description: 'Test 9', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + anonymousId: '5094f5704b9cf2b3', + channel: 'mobile', + 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', + }, + library: { name: 'com.rudderstack.android.sdk.core', version: '1.0.1-beta.1' }, + locale: 'en-US', + network: { carrier: 'Android', bluetooth: false, cellular: true, wifi: true }, + os: { name: 'Android', version: '8.1.0' }, + screen: { density: 420, height: 1794, width: 1080 }, + timezone: 'Asia/Kolkata', + traits: { anonymousId: '5094f5704b9cf2b3' }, + userAgent: + 'Dalvik/2.1.0 (Linux; U; Android 8.1.0; Android SDK built for x86 Build/OSM1.180201.007)', + }, + event: 'MainActivity', + integrations: { All: true }, + messageId: 'id1', + properties: { name: 'MainActivity', automatic: true }, + originalTimestamp: '2020-03-12T09:05:03.421Z', + type: 'screen', + sentAt: '2020-03-12T09:05:13.042Z', + }, + destination: { + Config: { + applicationId: 'leanplum_application_id', + clientKey: 'leanplum_client_key', + isDevelop: true, + useNativeSDK: false, + sendEvents: false, + }, + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://api.leanplum.com/api', + headers: { 'Content-Type': 'application/json' }, + params: { action: 'start' }, + body: { + JSON: { + apiVersion: '1.0.6', + appId: 'leanplum_application_id', + clientKey: 'leanplum_client_key', + userId: '5094f5704b9cf2b3', + deviceId: '5094f5704b9cf2b3', + appVersion: '1.0', + systemName: 'Android', + systemVersion: '8.1.0', + deviceName: 'generic_x86', + deviceModel: 'Android SDK built for x86', + userAttributes: { anonymousId: '5094f5704b9cf2b3' }, + locale: 'en-US', + timezone: 'Asia/Kolkata', + time: 1584003903, + devMode: true, + }, + XML: {}, + JSON_ARRAY: {}, + FORM: {}, + }, + files: {}, + userId: '5094f5704b9cf2b3', + }, + statusCode: 200, + }, + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://api.leanplum.com/api', + headers: { 'Content-Type': 'application/json' }, + params: { action: 'advance' }, + body: { + JSON: { + apiVersion: '1.0.6', + appId: 'leanplum_application_id', + clientKey: 'leanplum_client_key', + userId: '5094f5704b9cf2b3', + state: 'MainActivity', + deviceId: '5094f5704b9cf2b3', + time: 1584003903, + devMode: true, + }, + XML: {}, + JSON_ARRAY: {}, + FORM: {}, + }, + files: {}, + userId: '5094f5704b9cf2b3', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'leanplum', + description: 'Test 10', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + anonymousId: '5094f5704b9cf2b3', + channel: 'mobile', + 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', + }, + library: { name: 'com.rudderstack.android.sdk.core', version: '1.0.1-beta.1' }, + locale: 'en-US', + network: { carrier: 'Android', bluetooth: false, cellular: true, wifi: true }, + os: { name: 'Android', version: '8.1.0' }, + screen: { density: 420, height: 1794, width: 1080 }, + timezone: 'Asia/Kolkata', + traits: { anonymousId: '5094f5704b9cf2b3' }, + userAgent: + 'Dalvik/2.1.0 (Linux; U; Android 8.1.0; Android SDK built for x86 Build/OSM1.180201.007)', + }, + event: 'MainActivity', + integrations: { All: true }, + messageId: 'id1', + properties: { automatic: true }, + originalTimestamp: '2020-03-12T09:05:03.421Z', + type: 'screen', + sentAt: '2020-03-12T09:05:13.042Z', + }, + destination: { + Config: { + applicationId: 'leanplum_application_id', + clientKey: 'leanplum_client_key', + isDevelop: true, + useNativeSDK: false, + sendEvents: false, + }, + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://api.leanplum.com/api', + headers: { 'Content-Type': 'application/json' }, + params: { action: 'start' }, + body: { + JSON: { + apiVersion: '1.0.6', + appId: 'leanplum_application_id', + clientKey: 'leanplum_client_key', + userId: '5094f5704b9cf2b3', + deviceId: '5094f5704b9cf2b3', + appVersion: '1.0', + systemName: 'Android', + systemVersion: '8.1.0', + deviceName: 'generic_x86', + deviceModel: 'Android SDK built for x86', + userAttributes: { anonymousId: '5094f5704b9cf2b3' }, + locale: 'en-US', + timezone: 'Asia/Kolkata', + time: 1584003903, + devMode: true, + }, + XML: {}, + JSON_ARRAY: {}, + FORM: {}, + }, + files: {}, + userId: '5094f5704b9cf2b3', + }, + statusCode: 200, + }, + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://api.leanplum.com/api', + headers: { 'Content-Type': 'application/json' }, + params: { action: 'advance' }, + body: { + JSON: { + apiVersion: '1.0.6', + appId: 'leanplum_application_id', + clientKey: 'leanplum_client_key', + userId: '5094f5704b9cf2b3', + state: 'MainActivity', + deviceId: '5094f5704b9cf2b3', + time: 1584003903, + devMode: true, + }, + XML: {}, + JSON_ARRAY: {}, + FORM: {}, + }, + files: {}, + userId: '5094f5704b9cf2b3', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'leanplum', + description: 'Test 11', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + anonymousId: '5094f5704b9cf2b3', + channel: 'mobile', + 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', + }, + library: { name: 'com.rudderstack.android.sdk.core', version: '1.0.1-beta.1' }, + locale: 'en-US', + network: { carrier: 'Android', bluetooth: false, cellular: true, wifi: true }, + os: { name: 'Android', version: '8.1.0' }, + screen: { density: 420, height: 1794, width: 1080 }, + timezone: 'Asia/Kolkata', + traits: { anonymousId: '5094f5704b9cf2b3' }, + userAgent: + 'Dalvik/2.1.0 (Linux; U; Android 8.1.0; Android SDK built for x86 Build/OSM1.180201.007)', + }, + integrations: { All: true }, + messageId: 'id1', + properties: { automatic: true }, + originalTimestamp: '2020-03-12T09:05:03.421Z', + type: 'screen', + sentAt: '2020-03-12T09:05:13.042Z', + }, + destination: { + Config: { + applicationId: 'leanplum_application_id', + clientKey: 'leanplum_client_key', + isDevelop: true, + useNativeSDK: false, + sendEvents: false, + }, + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + error: "Missing required value from [\"properties.name\",\"event\"]", + statTags: { + destType: 'LEANPLUM', + errorCategory: 'dataValidation', + errorType: 'instrumentation', + feature: 'processor', + implementation: 'native', + module: 'destination', + }, + statusCode: 400, + }, + ], + }, + }, + }, + { + name: 'leanplum', + description: 'Test 12', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + anonymousId: '5094f5704b9cf2b3', + channel: 'mobile', + 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', + }, + library: { name: 'com.rudderstack.android.sdk.core', version: '1.0.1-beta.1' }, + locale: 'en-US', + network: { carrier: 'Android', bluetooth: false, cellular: true, wifi: true }, + os: { name: 'Android', version: '8.1.0' }, + screen: { density: 420, height: 1794, width: 1080 }, + timezone: 'Asia/Kolkata', + traits: { anonymousId: '5094f5704b9cf2b3' }, + userAgent: + 'Dalvik/2.1.0 (Linux; U; Android 8.1.0; Android SDK built for x86 Build/OSM1.180201.007)', + }, + event: 'account: logged out', + integrations: { All: true }, + messageId: 'id1', + properties: { name: 'MainActivity', automatic: true }, + originalTimestamp: '2020-03-12T09:05:03.421Z', + type: 'track', + sentAt: '2020-03-12T09:05:13.042Z', + }, + destination: { + Config: { + applicationId: 'leanplum_application_id', + clientKey: 'leanplum_client_key', + isDevelop: true, + useNativeSDK: false, + sendEvents: false, + }, + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://api.leanplum.com/api', + headers: { 'Content-Type': 'application/json' }, + params: { action: 'start' }, + body: { + JSON: { + apiVersion: '1.0.6', + appId: 'leanplum_application_id', + clientKey: 'leanplum_client_key', + userId: '5094f5704b9cf2b3', + deviceId: '5094f5704b9cf2b3', + appVersion: '1.0', + systemName: 'Android', + systemVersion: '8.1.0', + deviceName: 'generic_x86', + deviceModel: 'Android SDK built for x86', + userAttributes: { anonymousId: '5094f5704b9cf2b3' }, + locale: 'en-US', + timezone: 'Asia/Kolkata', + time: 1584003903, + devMode: true, + }, + XML: {}, + JSON_ARRAY: {}, + FORM: {}, + }, + files: {}, + userId: '5094f5704b9cf2b3', + }, + statusCode: 200, + }, + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://api.leanplum.com/api', + headers: { 'Content-Type': 'application/json' }, + params: { action: 'track' }, + body: { + JSON: { + apiVersion: '1.0.6', + appId: 'leanplum_application_id', + clientKey: 'leanplum_client_key', + userId: '5094f5704b9cf2b3', + event: 'account: logged out', + deviceId: '5094f5704b9cf2b3', + params: { name: 'MainActivity', automatic: true }, + time: 1584003903, + devMode: true, + }, + XML: {}, + JSON_ARRAY: {}, + FORM: {}, + }, + files: {}, + userId: '5094f5704b9cf2b3', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'leanplum', + description: 'Test 13', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + anonymousId: '5094f5704b9cf2b3', + channel: 'mobile', + 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', + }, + library: { name: 'com.rudderstack.android.sdk.core', version: '1.0.1-beta.1' }, + locale: 'en-US', + network: { carrier: 'Android', bluetooth: false, cellular: true, wifi: true }, + os: { name: 'Android', version: '8.1.0' }, + screen: { density: 420, height: 1794, width: 1080 }, + timezone: 'Asia/Kolkata', + traits: { anonymousId: '5094f5704b9cf2b3' }, + userAgent: + 'Dalvik/2.1.0 (Linux; U; Android 8.1.0; Android SDK built for x86 Build/OSM1.180201.007)', + }, + event: 'account: logged out', + integrations: { All: true }, + messageId: 'id1', + properties: { name: 'MainActivity', automatic: true, total: 2.45, currency: 'USD' }, + originalTimestamp: '2020-03-12T09:05:03.421Z', + type: 'track', + sentAt: '2020-03-12T09:05:13.042Z', + }, + destination: { + Config: { + applicationId: 'leanplum_application_id', + clientKey: 'leanplum_client_key', + isDevelop: true, + useNativeSDK: false, + sendEvents: false, + }, + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://api.leanplum.com/api', + headers: { 'Content-Type': 'application/json' }, + params: { action: 'start' }, + body: { + JSON: { + apiVersion: '1.0.6', + appId: 'leanplum_application_id', + clientKey: 'leanplum_client_key', + userId: '5094f5704b9cf2b3', + deviceId: '5094f5704b9cf2b3', + appVersion: '1.0', + systemName: 'Android', + systemVersion: '8.1.0', + deviceName: 'generic_x86', + deviceModel: 'Android SDK built for x86', + userAttributes: { anonymousId: '5094f5704b9cf2b3' }, + locale: 'en-US', + timezone: 'Asia/Kolkata', + time: 1584003903, + devMode: true, + }, + XML: {}, + JSON_ARRAY: {}, + FORM: {}, + }, + files: {}, + userId: '5094f5704b9cf2b3', + }, + statusCode: 200, + }, + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://api.leanplum.com/api', + headers: { 'Content-Type': 'application/json' }, + params: { action: 'track' }, + body: { + JSON: { + apiVersion: '1.0.6', + appId: 'leanplum_application_id', + clientKey: 'leanplum_client_key', + userId: '5094f5704b9cf2b3', + event: 'account: logged out', + deviceId: '5094f5704b9cf2b3', + params: { name: 'MainActivity', automatic: true, total: 2.45, currency: 'USD' }, + value: 2.45, + currencyCode: 'USD', + time: 1584003903, + devMode: true, + }, + XML: {}, + JSON_ARRAY: {}, + FORM: {}, + }, + files: {}, + userId: '5094f5704b9cf2b3', + }, + statusCode: 200, + }, + ], + }, + }, + }, +]; diff --git a/test/integrations/destinations/leanplum/router/data.ts b/test/integrations/destinations/leanplum/router/data.ts new file mode 100644 index 0000000000..db75a7fdc4 --- /dev/null +++ b/test/integrations/destinations/leanplum/router/data.ts @@ -0,0 +1,370 @@ +export const data = [ + { + name: 'leanplum', + description: 'Test 0', + feature: 'router', + module: 'destination', + version: 'v0', + input: { + request: { + body: { + input: [ + { + message: { + anonymousId: '5094f5704b9cf2b3', + channel: 'mobile', + 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', + }, + library: { + name: 'com.rudderstack.android.sdk.core', + version: '1.0.1-beta.1', + }, + locale: 'en-US', + network: { + carrier: 'Android', + bluetooth: false, + cellular: true, + wifi: true, + }, + os: { + name: 'Android', + version: '8.1.0', + }, + screen: { + density: 420, + height: 1794, + width: 1080, + }, + timezone: 'Asia/Kolkata', + traits: { + anonymousId: '5094f5704b9cf2b3', + }, + userAgent: + 'Dalvik/2.1.0 (Linux; U; Android 8.1.0; Android SDK built for x86 Build/OSM1.180201.007)', + }, + event: 'MainActivity', + integrations: { + All: true, + }, + messageId: 'id1', + properties: { + name: 'MainActivity', + automatic: true, + }, + originalTimestamp: '2020-03-12T09:05:03.421Z', + type: 'screen', + sentAt: '2020-03-12T09:05:13.042Z', + }, + metadata: { + jobId: 1, + }, + destination: { + Config: { + applicationId: 'leanplum_application_id', + clientKey: 'leanplum_client_key', + isDevelop: true, + useNativeSDK: false, + sendEvents: false, + }, + }, + }, + ], + destType: 'leanplum', + }, + method: 'POST', + }, + }, + output: { + response: { + status: 200, + body: { + output: [ + { + batchedRequest: [ + { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://api.leanplum.com/api', + headers: { + 'Content-Type': 'application/json', + }, + params: { + action: 'start', + }, + body: { + JSON: { + appId: 'leanplum_application_id', + clientKey: 'leanplum_client_key', + apiVersion: '1.0.6', + userId: '5094f5704b9cf2b3', + deviceId: '5094f5704b9cf2b3', + appVersion: '1.0', + systemName: 'Android', + systemVersion: '8.1.0', + deviceName: 'generic_x86', + deviceModel: 'Android SDK built for x86', + userAttributes: { + anonymousId: '5094f5704b9cf2b3', + }, + locale: 'en-US', + timezone: 'Asia/Kolkata', + time: 1584003903, + devMode: true, + }, + XML: {}, + JSON_ARRAY: {}, + FORM: {}, + }, + files: {}, + userId: '5094f5704b9cf2b3', + }, + { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://api.leanplum.com/api', + headers: { + 'Content-Type': 'application/json', + }, + params: { + action: 'advance', + }, + body: { + JSON: { + appId: 'leanplum_application_id', + clientKey: 'leanplum_client_key', + apiVersion: '1.0.6', + userId: '5094f5704b9cf2b3', + state: 'MainActivity', + deviceId: '5094f5704b9cf2b3', + time: 1584003903, + devMode: true, + }, + XML: {}, + JSON_ARRAY: {}, + FORM: {}, + }, + files: {}, + userId: '5094f5704b9cf2b3', + }, + ], + metadata: [ + { + jobId: 1, + }, + ], + batched: false, + statusCode: 200, + destination: { + Config: { + applicationId: 'leanplum_application_id', + clientKey: 'leanplum_client_key', + isDevelop: true, + useNativeSDK: false, + sendEvents: false, + }, + }, + }, + ], + }, + }, + }, + }, + { + name: 'leanplum', + description: 'Test 1', + feature: 'router', + module: 'destination', + version: 'v0', + input: { + request: { + body: { + input: [ + { + message: { + anonymousId: '5094f5704b9cf2b3', + channel: 'mobile', + 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', + }, + library: { + name: 'com.rudderstack.android.sdk.core', + version: '1.0.1-beta.1', + }, + locale: 'en-US', + network: { + carrier: 'Android', + bluetooth: false, + cellular: true, + wifi: true, + }, + os: { + name: 'Android', + version: '8.1.0', + }, + screen: { + density: 420, + height: 1794, + width: 1080, + }, + timezone: 'Asia/Kolkata', + traits: { + anonymousId: '5094f5704b9cf2b3', + }, + userAgent: + 'Dalvik/2.1.0 (Linux; U; Android 8.1.0; Android SDK built for x86 Build/OSM1.180201.007)', + }, + event: 'MainActivity', + integrations: { + All: true, + }, + messageId: 'id2', + properties: { + name: 'MainActivity', + automatic: true, + }, + originalTimestamp: '2020-03-12T09:05:03.421Z', + type: 'screen', + sentAt: '2020-03-12T09:05:13.042Z', + }, + metadata: { + jobId: 2, + }, + destination: { + Config: { + applicationId: 'leanplum_application_id', + clientKey: 'leanplum_client_key__', + isDevelop: true, + useNativeSDK: false, + sendEvents: false, + }, + }, + }, + ], + destType: 'leanplum', + }, + method: 'POST', + }, + }, + output: { + response: { + status: 200, + body: { + output: [ + { + batchedRequest: [ + { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://api.leanplum.com/api', + headers: { + 'Content-Type': 'application/json', + }, + params: { + action: 'start', + }, + body: { + JSON: { + appId: 'leanplum_application_id', + clientKey: 'leanplum_client_key__', + apiVersion: '1.0.6', + userId: '5094f5704b9cf2b3', + deviceId: '5094f5704b9cf2b3', + appVersion: '1.0', + systemName: 'Android', + systemVersion: '8.1.0', + deviceName: 'generic_x86', + deviceModel: 'Android SDK built for x86', + userAttributes: { + anonymousId: '5094f5704b9cf2b3', + }, + locale: 'en-US', + timezone: 'Asia/Kolkata', + time: 1584003903, + devMode: true, + }, + XML: {}, + JSON_ARRAY: {}, + FORM: {}, + }, + files: {}, + userId: '5094f5704b9cf2b3', + }, + { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://api.leanplum.com/api', + headers: { + 'Content-Type': 'application/json', + }, + params: { + action: 'advance', + }, + body: { + JSON: { + appId: 'leanplum_application_id', + clientKey: 'leanplum_client_key__', + apiVersion: '1.0.6', + userId: '5094f5704b9cf2b3', + state: 'MainActivity', + deviceId: '5094f5704b9cf2b3', + time: 1584003903, + devMode: true, + }, + XML: {}, + JSON_ARRAY: {}, + FORM: {}, + }, + files: {}, + userId: '5094f5704b9cf2b3', + }, + ], + metadata: [ + { + jobId: 2, + }, + ], + batched: false, + statusCode: 200, + destination: { + Config: { + applicationId: 'leanplum_application_id', + clientKey: 'leanplum_client_key__', + isDevelop: true, + useNativeSDK: false, + sendEvents: false, + }, + }, + }, + ], + }, + }, + }, + }, +]; diff --git a/test/integrations/destinations/lemnisk/processor/data.ts b/test/integrations/destinations/lemnisk/processor/data.ts new file mode 100644 index 0000000000..9127e247c8 --- /dev/null +++ b/test/integrations/destinations/lemnisk/processor/data.ts @@ -0,0 +1,1088 @@ +export const data = [ + { + name: 'lemnisk', + description: 'Error: Event Type is required ', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + userId: 'user123', + event: 'Product Reviewed', + properties: { review_body: 'Average product, expected much more.' }, + context: { + 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', + }, + timestamp: '2020-02-02T00:23:09.544Z', + messageId: '1578564113557-af022c68-429e-4af4-b99b-2b9174056383', + }, + destination: { + id: '2JAdls99p6UxoFNSKGwvh0aIt7E', + name: 'Lemnisk Marketing Automation', + enabled: true, + Config: { + plWriteKey: 'pl_writeKey', + pl: 'http://10.11.36.17:8080/analyze/analyze.php', + passKey: '', + apiKey: '', + diapi: '', + cloudMode: 'web', + srcId: '', + diapiWriteKey: '', + }, + destinationDefinition: { + config: { + transformAt: 'processor', + transformAtV1: 'processor', + saveDestinationResponse: true, + includeKeys: [ + 'apiKey', + 'passKey', + 'cloudMode', + 'diapi', + 'pl', + 'diapiWriteKey', + 'plWriteKey', + 'srcId', + ], + excludeKeys: [], + supportedSourceTypes: [ + 'android', + 'ios', + 'web', + 'unity', + 'amp', + 'cloud', + 'reactnative', + 'flutter', + 'cordova', + 'warehouse', + ], + supportedMessageTypes: ['track', 'identify', 'page'], + destConfig: { + defaultConfig: [ + 'apiKey', + 'passKey', + 'cloudMode', + 'diapi', + 'pl', + 'diapiWriteKey', + 'plWriteKey', + 'deviceModeWriteKey', + 'srcId', + ], + }, + secretKeys: ['apiKey', 'passKey', 'plWriteKey', 'diapiWriteKey'], + }, + responseRules: null, + id: '1j9dYVEplxUC5swbXkpK9fYT7uk', + name: 'LEMNISK_MARKETING_AUTOMATION', + displayName: 'Lemnisk Marketing Automation', + createdAt: '2022-12-12T21:58:08.637Z', + }, + rootStore: null, + isProcessorEnabled: true, + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + error: 'Event type is required', + statTags: { + destType: 'LEMNISK', + errorCategory: 'dataValidation', + errorType: 'instrumentation', + feature: 'processor', + implementation: 'native', + module: 'destination', + }, + statusCode: 400, + }, + ], + }, + }, + }, + { + name: 'lemnisk', + description: 'Error: Pl Track: Invalid Configuration', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + type: 'track', + properties: { + product_id: 'ab1234', + rating: 3, + review_body: 'Average product, expected much more.', + review_id: '12345', + }, + event: 'Product Reviewed', + context: { + library: { name: 'RudderLabs JavaScript SDK', version: '2.9.1' }, + 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', + }, + timestamp: '2020-02-02T00:23:09.544Z', + messageId: '1578564113557-af022c68-429e-4af4-b99b-2b9174056383', + }, + destination: { + id: '2JAdls99p6UxoFNSKGwvh0aIt7E', + name: 'Lemnisk Marketing Automation', + enabled: true, + Config: { + plWriteKey: 'pl_writeKey', + pl: '', + passKey: '', + apiKey: '', + diapi: '', + cloudMode: 'web', + srcId: '', + diapiWriteKey: '', + }, + destinationDefinition: { + config: { + transformAt: 'processor', + transformAtV1: 'processor', + saveDestinationResponse: true, + includeKeys: [ + 'apiKey', + 'passKey', + 'cloudMode', + 'diapi', + 'pl', + 'diapiWriteKey', + 'plWriteKey', + 'srcId', + ], + excludeKeys: [], + supportedSourceTypes: [ + 'android', + 'ios', + 'web', + 'unity', + 'amp', + 'cloud', + 'reactnative', + 'flutter', + 'cordova', + 'warehouse', + ], + supportedMessageTypes: ['track', 'identify', 'page'], + destConfig: { + defaultConfig: [ + 'apiKey', + 'passKey', + 'cloudMode', + 'diapi', + 'pl', + 'diapiWriteKey', + 'plWriteKey', + 'deviceModeWriteKey', + 'srcId', + ], + }, + secretKeys: ['apiKey', 'passKey', 'plWriteKey', 'diapiWriteKey'], + }, + responseRules: null, + id: '1j9dYVEplxUC5swbXkpK9fYT7uk', + name: 'LEMNISK_MARKETING_AUTOMATION', + displayName: 'Lemnisk Marketing Automation', + createdAt: '2022-12-12T21:58:08.637Z', + }, + rootStore: null, + isProcessorEnabled: true, + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + error: 'Configuration for Web Mode requires write key and region url', + statTags: { + destType: 'LEMNISK', + errorCategory: 'dataValidation', + errorType: 'configuration', + feature: 'processor', + implementation: 'native', + module: 'destination', + }, + statusCode: 400, + }, + ], + }, + }, + }, + { + name: 'lemnisk', + description: 'Error: Invalid Configs for Diapi', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + anonymousId: 'anon-id-new', + context: { + ip: '14.5.67.21', + library: { name: 'http' }, + traits: { + firstName: 'test', + lastName: 'rudderlabs', + role: 'Manager', + address: 'Flat No 58 ABC building XYZ Area near PQRS , 354408', + hasPurchased: 'yes', + email: 'abc@xyz.com', + title: 'Mr', + phone: '9876543212', + state: 'Uttar Pradesh', + zipcode: '243001', + prospectOrCustomer: 'Prospect', + country: 'India', + website: 'abc.com', + subscriptionStatus: 'New', + }, + }, + messageId: '25ea6605-c788-4cab-8fed-2cf0b831c4a8', + originalTimestamp: '2020-02-02T00:23:09.544Z', + receivedAt: '2022-08-17T10:40:21.162+05:30', + request_ip: '[::1]', + rudderId: 'daf823fb-e8d3-413a-8313-d34cd756f968', + sentAt: '2022-08-17T10:40:21.728+05:30', + timestamp: '2020-02-02T05:53:08.977+05:30', + type: 'track', + userId: 'identified user id', + }, + destination: { + id: '2JAdls99p6UxoFNSKGwvh0aIt7E', + name: 'Lemnisk Marketing Automation', + enabled: true, + Config: { + plWriteKey: '', + pl: '', + passKey: '1234', + apiKey: '', + diapi: 'https://crux.lemnisk.co/v3/data', + cloudMode: 'server', + srcId: '1', + diapiWriteKey: '', + }, + destinationDefinition: { + config: { + transformAt: 'processor', + transformAtV1: 'processor', + saveDestinationResponse: true, + includeKeys: [ + 'apiKey', + 'passKey', + 'cloudMode', + 'diapi', + 'pl', + 'diapiWriteKey', + 'plWriteKey', + 'srcId', + ], + excludeKeys: [], + supportedSourceTypes: [ + 'android', + 'ios', + 'web', + 'unity', + 'amp', + 'cloud', + 'reactnative', + 'flutter', + 'cordova', + 'warehouse', + ], + supportedMessageTypes: ['track', 'identify', 'page'], + destConfig: { + defaultConfig: [ + 'apiKey', + 'passKey', + 'cloudMode', + 'diapi', + 'pl', + 'diapiWriteKey', + 'plWriteKey', + 'deviceModeWriteKey', + 'srcId', + ], + }, + secretKeys: ['apiKey', 'passKey', 'plWriteKey', 'diapiWriteKey'], + }, + responseRules: null, + id: '1j9dYVEplxUC5swbXkpK9fYT7uk', + name: 'LEMNISK_MARKETING_AUTOMATION', + displayName: 'Lemnisk Marketing Automation', + createdAt: '2022-12-12T21:58:08.637Z', + }, + rootStore: null, + isProcessorEnabled: true, + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + error: 'Configuration for Server Mode requires Api key, Pass Key and region url', + statTags: { + destType: 'LEMNISK', + errorCategory: 'dataValidation', + errorType: 'configuration', + feature: 'processor', + implementation: 'native', + module: 'destination', + }, + statusCode: 400, + }, + ], + }, + }, + }, + { + name: 'lemnisk', + description: 'Diapi Platform: Track Call', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + type: 'track', + properties: { + product_id: 'ab1234', + rating: 3, + review_body: 'Average product, expected much more.', + review_id: '12345', + }, + event: 'Product Reviewed', + context: { + library: { name: 'RudderLabs JavaScript SDK', version: '2.9.1' }, + traits: { email: 'a@example.com' }, + 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', + }, + timestamp: '2020-02-02T00:23:09.544Z', + messageId: '1578564113557-af022c68-429e-4af4-b99b-2b9174056383', + userId: 'user123', + }, + destination: { + id: '2JAdls99p6UxoFNSKGwvh0aIt7E', + name: 'Lemnisk Marketing Automation', + enabled: true, + Config: { + plWriteKey: '', + pl: '', + passKey: '1234', + apiKey: 'abcd', + diapi: 'https://crux.lemnisk.co/v3/data', + cloudMode: 'server', + srcId: '1', + diapiWriteKey: 'diapi_write_key', + }, + destinationDefinition: { + config: { + transformAt: 'processor', + transformAtV1: 'processor', + saveDestinationResponse: true, + includeKeys: [ + 'apiKey', + 'passKey', + 'cloudMode', + 'diapi', + 'pl', + 'diapiWriteKey', + 'plWriteKey', + 'srcId', + ], + excludeKeys: [], + supportedSourceTypes: [ + 'android', + 'ios', + 'web', + 'unity', + 'amp', + 'cloud', + 'reactnative', + 'flutter', + 'cordova', + 'warehouse', + ], + supportedMessageTypes: ['track', 'identify', 'page'], + destConfig: { + defaultConfig: [ + 'apiKey', + 'passKey', + 'cloudMode', + 'diapi', + 'pl', + 'diapiWriteKey', + 'plWriteKey', + 'deviceModeWriteKey', + 'srcId', + ], + }, + secretKeys: ['apiKey', 'passKey', 'plWriteKey', 'diapiWriteKey'], + }, + responseRules: null, + id: '1j9dYVEplxUC5swbXkpK9fYT7uk', + name: 'LEMNISK_MARKETING_AUTOMATION', + displayName: 'Lemnisk Marketing Automation', + createdAt: '2022-12-12T21:58:08.637Z', + }, + rootStore: null, + isProcessorEnabled: true, + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://crux.lemnisk.co/v3/data', + headers: { + 'Content-Type': 'application/json', + 'x-api-passKey': '1234', + 'x-api-key': 'abcd', + }, + params: {}, + body: { + JSON: { + type: 'track', + properties: { + product_id: 'ab1234', + rating: 3, + review_body: 'Average product, expected much more.', + review_id: '12345', + }, + WriteKey: 'diapi_write_key', + eventname: 'Product Reviewed', + userId: 'user123', + email: 'a@example.com', + srcid: '1', + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + userId: 'user123', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'lemnisk', + description: 'Error: Message type not supported', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + anonymousId: 'anon-id-new', + context: { + ip: '14.5.67.21', + library: { name: 'http' }, + traits: { state: 'uttar pradesh' }, + }, + messageId: '25ea6605-c788-4cab-8fed-2cf0b831c4a8', + originalTimestamp: '2020-02-02T00:23:09.544Z', + receivedAt: '2022-08-17T10:40:21.162+05:30', + request_ip: '[::1]', + rudderId: 'daf823fb-e8d3-413a-8313-d34cd756f968', + sentAt: '2022-08-17T10:40:21.728+05:30', + timestamp: '2020-02-02T05:53:08.977+05:30', + userId: 'identified user id', + type: 'Alias', + }, + destination: { + id: '2JAdls99p6UxoFNSKGwvh0aIt7E', + name: 'Lemnisk Marketing Automation', + enabled: true, + Config: { + plWriteKey: 'pl_writeKey', + pl: 'http://10.11.36.17:8080/analyze/analyze.php', + passKey: '', + apiKey: '', + diapi: '', + cloudMode: 'web', + srcId: '', + diapiWriteKey: '', + }, + destinationDefinition: { + config: { + transformAt: 'processor', + transformAtV1: 'processor', + saveDestinationResponse: true, + includeKeys: [ + 'apiKey', + 'passKey', + 'cloudMode', + 'diapi', + 'pl', + 'diapiWriteKey', + 'plWriteKey', + 'srcId', + ], + excludeKeys: [], + supportedSourceTypes: [ + 'android', + 'ios', + 'web', + 'unity', + 'amp', + 'cloud', + 'reactnative', + 'flutter', + 'cordova', + 'warehouse', + ], + supportedMessageTypes: ['track', 'identify', 'page'], + destConfig: { + defaultConfig: [ + 'apiKey', + 'passKey', + 'cloudMode', + 'diapi', + 'pl', + 'diapiWriteKey', + 'plWriteKey', + 'deviceModeWriteKey', + 'srcId', + ], + }, + secretKeys: ['apiKey', 'passKey', 'plWriteKey', 'diapiWriteKey'], + }, + responseRules: null, + id: '1j9dYVEplxUC5swbXkpK9fYT7uk', + name: 'LEMNISK_MARKETING_AUTOMATION', + displayName: 'Lemnisk Marketing Automation', + createdAt: '2022-12-12T21:58:08.637Z', + }, + rootStore: null, + isProcessorEnabled: true, + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + error: 'Event type alias is not supported in Web Cloud Mode', + statTags: { + destType: 'LEMNISK', + errorCategory: 'dataValidation', + errorType: 'instrumentation', + feature: 'processor', + implementation: 'native', + module: 'destination', + }, + statusCode: 400, + }, + ], + }, + }, + }, + { + name: 'lemnisk', + description: ' Page Call -> pl Platform ', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + anonymousId: 'anon-id-new', + channel: 'mobile', + context: { + app: { build: '4', name: 'RuddCDN' }, + page: { referrer: 'google.com' }, + device: { id: '3f034872-5e28-45a1-9eda-ce22a3e36d1a', name: 'generic_x86_arm' }, + library: { name: 'com.rudderstack.android.sdk.core', version: '1.0.6' }, + 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', + category: 'Profile', + messageId: '1601322811899-d9c7dd00-50dc-4364-95c8-e89423eb3cfb', + originalTimestamp: '2020-09-28T19:53:31.900Z', + properties: { title: 'Home | RudderStack', url: 'http://www.rudderstack.com' }, + receivedAt: '2020-09-29T14:50:43.005+05:30', + sentAt: '2020-09-28T19:53:44.998Z', + timestamp: '2020-09-29T14:50:29.907+05:30', + type: 'page', + }, + destination: { + id: '2JAdls99p6UxoFNSKGwvh0aIt7E', + name: 'Lemnisk Marketing Automation', + enabled: true, + Config: { + plWriteKey: 'pl_writeKey', + pl: 'http://10.11.36.17:8080/analyze/analyze.php', + passKey: '', + apiKey: '', + diapi: '', + cloudMode: 'web', + srcId: '', + diapiWriteKey: '', + }, + destinationDefinition: { + config: { + transformAt: 'processor', + transformAtV1: 'processor', + saveDestinationResponse: true, + includeKeys: [ + 'apiKey', + 'passKey', + 'cloudMode', + 'diapi', + 'pl', + 'diapiWriteKey', + 'plWriteKey', + 'srcId', + ], + excludeKeys: [], + supportedSourceTypes: [ + 'android', + 'ios', + 'web', + 'unity', + 'amp', + 'cloud', + 'reactnative', + 'flutter', + 'cordova', + 'warehouse', + ], + supportedMessageTypes: ['track', 'identify', 'page'], + destConfig: { + defaultConfig: [ + 'apiKey', + 'passKey', + 'cloudMode', + 'diapi', + 'pl', + 'diapiWriteKey', + 'plWriteKey', + 'deviceModeWriteKey', + 'srcId', + ], + }, + secretKeys: ['apiKey', 'passKey', 'plWriteKey', 'diapiWriteKey'], + }, + responseRules: null, + id: '1j9dYVEplxUC5swbXkpK9fYT7uk', + name: 'LEMNISK_MARKETING_AUTOMATION', + displayName: 'Lemnisk Marketing Automation', + createdAt: '2022-12-12T21:58:08.637Z', + }, + rootStore: null, + isProcessorEnabled: true, + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'http://10.11.36.17:8080/analyze/analyze.php', + headers: { 'Content-Type': 'application/json' }, + params: {}, + body: { + JSON: { + type: 'page', + context: { + app: { build: '4', name: 'RuddCDN' }, + page: { referrer: 'google.com' }, + device: { id: '3f034872-5e28-45a1-9eda-ce22a3e36d1a', name: 'generic_x86_arm' }, + library: { name: 'com.rudderstack.android.sdk.core', version: '1.0.6' }, + os: { name: 'Android', version: '9' }, + timezone: 'Asia/Kolkata', + traits: { customProp: 'customValue' }, + userAgent: { + ua: 'Dalvik/2.1.0 (Linux; U; Android 9; AOSP on IA Emulator Build/PSR1.180720.117)', + }, + }, + properties: { title: 'Home | RudderStack', url: 'http://www.rudderstack.com' }, + name: 'Home', + id: 'anon-id-new', + userId: 'anon-id-new', + messageId: '1601322811899-d9c7dd00-50dc-4364-95c8-e89423eb3cfb', + originalTimestamp: '2020-09-29T14:50:29.907+05:30', + writeKey: 'pl_writeKey', + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + userId: 'anon-id-new', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'lemnisk', + description: ' Identify Call -> pl Platform ', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + anonymousId: 'anon-id-new', + channel: 'mobile', + context: { + userAgent: + 'Dalvik/2.1.0 (Linux; U; Android 9; AOSP on IA Emulator Build/PSR1.180720.117)', + }, + event: 'Visited Home', + messageId: '1601322811899-d9c7dd00-50dc-4364-95c8-e89423eb3cfb', + originalTimestamp: '2020-09-28T19:53:31.900Z', + traits: { name: 'Home | RudderStack', url: 'http://www.rudderstack.com' }, + receivedAt: '2020-09-29T14:50:43.005+05:30', + sentAt: '2020-09-28T19:53:44.998Z', + timestamp: '2020-09-29T14:50:29.907+05:30', + type: 'identify', + }, + destination: { + id: '2JAdls99p6UxoFNSKGwvh0aIt7E', + name: 'Lemnisk Marketing Automation', + enabled: true, + Config: { + plWriteKey: 'pl_writeKey', + pl: 'http://10.11.36.17:8080/analyze/analyze.php', + passKey: '', + apiKey: '', + diapi: '', + cloudMode: 'web', + srcId: '', + diapiWriteKey: '', + }, + destinationDefinition: { + config: { + transformAt: 'processor', + transformAtV1: 'processor', + saveDestinationResponse: true, + includeKeys: [ + 'apiKey', + 'passKey', + 'cloudMode', + 'diapi', + 'pl', + 'diapiWriteKey', + 'plWriteKey', + 'srcId', + ], + excludeKeys: [], + supportedSourceTypes: [ + 'android', + 'ios', + 'web', + 'unity', + 'amp', + 'cloud', + 'reactnative', + 'flutter', + 'cordova', + 'warehouse', + ], + supportedMessageTypes: ['track', 'identify', 'page'], + destConfig: { + defaultConfig: [ + 'apiKey', + 'passKey', + 'cloudMode', + 'diapi', + 'pl', + 'diapiWriteKey', + 'plWriteKey', + 'deviceModeWriteKey', + 'srcId', + ], + }, + secretKeys: ['apiKey', 'passKey', 'plWriteKey', 'diapiWriteKey'], + }, + responseRules: null, + id: '1j9dYVEplxUC5swbXkpK9fYT7uk', + name: 'LEMNISK_MARKETING_AUTOMATION', + displayName: 'Lemnisk Marketing Automation', + createdAt: '2022-12-12T21:58:08.637Z', + }, + rootStore: null, + isProcessorEnabled: true, + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'http://10.11.36.17:8080/analyze/analyze.php', + headers: { 'Content-Type': 'application/json' }, + params: {}, + body: { + JSON: { + type: 'identify', + context: { + userAgent: { + ua: 'Dalvik/2.1.0 (Linux; U; Android 9; AOSP on IA Emulator Build/PSR1.180720.117)', + }, + }, + customerProperties: { + name: 'Home | RudderStack', + url: 'http://www.rudderstack.com', + }, + id: 'anon-id-new', + userId: 'anon-id-new', + messageId: '1601322811899-d9c7dd00-50dc-4364-95c8-e89423eb3cfb', + originalTimestamp: '2020-09-29T14:50:29.907+05:30', + writeKey: 'pl_writeKey', + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + userId: 'anon-id-new', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'lemnisk', + description: ' Track Call -> pl Platform ', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + anonymousId: 'anon-id-new', + channel: 'mobile', + context: { + app: { build: '4', name: 'RuddCDN' }, + page: { referrer: 'google.com' }, + device: { id: '3f034872-5e28-45a1-9eda-ce22a3e36d1a', name: 'generic_x86_arm' }, + library: { name: 'com.rudderstack.android.sdk.core', version: '1.0.6' }, + 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)', + }, + event: 'Visited Home', + messageId: '1601322811899-d9c7dd00-50dc-4364-95c8-e89423eb3cfb', + originalTimestamp: '2020-09-28T19:53:31.900Z', + properties: { title: 'Home | RudderStack', url: 'http://www.rudderstack.com' }, + receivedAt: '2020-09-29T14:50:43.005+05:30', + sentAt: '2020-09-28T19:53:44.998Z', + timestamp: '2020-09-29T14:50:29.907+05:30', + type: 'track', + }, + destination: { + id: '2JAdls99p6UxoFNSKGwvh0aIt7E', + name: 'Lemnisk Marketing Automation', + enabled: true, + Config: { + plWriteKey: 'pl_writeKey', + pl: 'http://10.11.36.17:8080/analyze/analyze.php', + passKey: '', + apiKey: '', + diapi: '', + cloudMode: 'web', + srcId: '', + diapiWriteKey: '', + }, + destinationDefinition: { + config: { + transformAt: 'processor', + transformAtV1: 'processor', + saveDestinationResponse: true, + includeKeys: [ + 'apiKey', + 'passKey', + 'cloudMode', + 'diapi', + 'pl', + 'diapiWriteKey', + 'plWriteKey', + 'srcId', + ], + excludeKeys: [], + supportedSourceTypes: [ + 'android', + 'ios', + 'web', + 'unity', + 'amp', + 'cloud', + 'reactnative', + 'flutter', + 'cordova', + 'warehouse', + ], + supportedMessageTypes: ['track', 'identify', 'page'], + destConfig: { + defaultConfig: [ + 'apiKey', + 'passKey', + 'cloudMode', + 'diapi', + 'pl', + 'diapiWriteKey', + 'plWriteKey', + 'deviceModeWriteKey', + 'srcId', + ], + }, + secretKeys: ['apiKey', 'passKey', 'plWriteKey', 'diapiWriteKey'], + }, + responseRules: null, + id: '1j9dYVEplxUC5swbXkpK9fYT7uk', + name: 'LEMNISK_MARKETING_AUTOMATION', + displayName: 'Lemnisk Marketing Automation', + createdAt: '2022-12-12T21:58:08.637Z', + }, + rootStore: null, + isProcessorEnabled: true, + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'http://10.11.36.17:8080/analyze/analyze.php', + headers: { 'Content-Type': 'application/json' }, + params: {}, + body: { + JSON: { + type: 'track', + context: { + app: { build: '4', name: 'RuddCDN' }, + page: { referrer: 'google.com' }, + device: { id: '3f034872-5e28-45a1-9eda-ce22a3e36d1a', name: 'generic_x86_arm' }, + library: { name: 'com.rudderstack.android.sdk.core', version: '1.0.6' }, + os: { name: 'Android', version: '9' }, + timezone: 'Asia/Kolkata', + traits: { customProp: 'customValue' }, + userAgent: { + ua: 'Dalvik/2.1.0 (Linux; U; Android 9; AOSP on IA Emulator Build/PSR1.180720.117)', + }, + }, + properties: { title: 'Home | RudderStack', url: 'http://www.rudderstack.com' }, + event: 'Visited Home', + id: 'anon-id-new', + userId: 'anon-id-new', + messageId: '1601322811899-d9c7dd00-50dc-4364-95c8-e89423eb3cfb', + originalTimestamp: '2020-09-29T14:50:29.907+05:30', + writeKey: 'pl_writeKey', + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + userId: 'anon-id-new', + }, + statusCode: 200, + }, + ], + }, + }, + }, +]; diff --git a/test/integrations/destinations/lemnisk/router/data.ts b/test/integrations/destinations/lemnisk/router/data.ts new file mode 100644 index 0000000000..1a1b84f180 --- /dev/null +++ b/test/integrations/destinations/lemnisk/router/data.ts @@ -0,0 +1,664 @@ +export const data = [ + { + name: 'lemnisk', + description: 'Test 0', + feature: 'router', + module: 'destination', + version: 'v0', + input: { + request: { + body: { + input: [ + { + message: { + anonymousId: 'anon-id-new', + context: { + ip: '14.5.67.21', + library: { + name: 'http', + }, + }, + type: 'identify', + }, + destination: { + id: '2JAdls99p6UxoFNSKGwvh0aIt7E', + name: 'Lemnisk Marketing Automation', + enabled: true, + Config: { + plWriteKey: '', + pl: 'https://crux.lemnisk.co/v2/data', + passKey: '', + apiKey: '', + diapi: ' ', + cloudMode: 'web', + srcId: '', + diapiWriteKey: '', + }, + destinationDefinition: { + config: { + transformAt: 'processor', + transformAtV1: 'processor', + saveDestinationResponse: true, + includeKeys: [ + 'apiKey', + 'passKey', + 'cloudMode', + 'diapi', + 'pl', + 'diapiWriteKey', + 'plWriteKey', + 'srcId', + ], + excludeKeys: [], + supportedSourceTypes: [ + 'android', + 'ios', + 'web', + 'unity', + 'amp', + 'cloud', + 'reactnative', + 'flutter', + 'cordova', + 'warehouse', + ], + supportedMessageTypes: ['track', 'identify', 'page'], + destConfig: { + defaultConfig: [ + 'apiKey', + 'passKey', + 'cloudMode', + 'diapi', + 'pl', + 'diapiWriteKey', + 'plWriteKey', + 'deviceModeWriteKey', + 'srcId', + ], + }, + secretKeys: ['apiKey', 'passKey', 'plWriteKey', 'diapiWriteKey'], + }, + responseRules: null, + id: '1j9dYVEplxUC5swbXkpK9fYT7uk', + name: 'LEMNISK_MARKETING_AUTOMATION', + displayName: 'Lemnisk Marketing Automation', + createdAt: '2022-12-12T21:58:08.637Z', + }, + rootStore: null, + isProcessorEnabled: true, + }, + metadata: { + jobId: 1, + }, + }, + { + message: { + anonymousId: 'anon-id-new', + channel: 'mobile', + context: { + userAgent: + 'Dalvik/2.1.0 (Linux; U; Android 9; AOSP on IA Emulator Build/PSR1.180720.117)', + }, + event: 'Visited Home', + messageId: '1601322811899-d9c7dd00-50dc-4364-95c8-e89423eb3cfb', + originalTimestamp: '2020-09-29T14:50:29.907+05:30', + traits: { + name: 'Home | RudderStack', + url: 'http://www.rudderstack.com', + }, + receivedAt: '2020-09-29T14:50:43.005+05:30', + sentAt: '2020-09-28T19:53:44.998Z', + timestamp: '2020-09-29T14:50:29.907+05:30', + type: 'identify', + }, + destination: { + id: '2JAdls99p6UxoFNSKGwvh0aIt7E', + name: 'Lemnisk Marketing Automation', + enabled: true, + Config: { + plWriteKey: 'pl_writeKey', + pl: 'http://10.11.36.17:8080/analyze/analyze.php', + passKey: '', + apiKey: '', + diapi: '', + cloudMode: 'web', + srcId: '', + diapiWriteKey: '', + }, + destinationDefinition: { + config: { + transformAt: 'processor', + transformAtV1: 'processor', + saveDestinationResponse: true, + includeKeys: [ + 'apiKey', + 'passKey', + 'cloudMode', + 'diapi', + 'pl', + 'diapiWriteKey', + 'plWriteKey', + 'srcId', + ], + excludeKeys: [], + supportedSourceTypes: [ + 'android', + 'ios', + 'web', + 'unity', + 'amp', + 'cloud', + 'reactnative', + 'flutter', + 'cordova', + 'warehouse', + ], + supportedMessageTypes: ['track', 'identify', 'page'], + destConfig: { + defaultConfig: [ + 'apiKey', + 'passKey', + 'cloudMode', + 'diapi', + 'pl', + 'diapiWriteKey', + 'plWriteKey', + 'deviceModeWriteKey', + 'srcId', + ], + }, + secretKeys: ['apiKey', 'passKey', 'plWriteKey', 'diapiWriteKey'], + }, + responseRules: null, + id: '1j9dYVEplxUC5swbXkpK9fYT7uk', + name: 'LEMNISK_MARKETING_AUTOMATION', + displayName: 'Lemnisk Marketing Automation', + createdAt: '2022-12-12T21:58:08.637Z', + }, + rootStore: null, + isProcessorEnabled: true, + }, + metadata: { + anonymousId: '12345', + destinationId: '1ZQVSU9SXNg6KYgZALaqjAO3PIL', + destinationType: 'DISCORD', + jobId: 123, + messageId: '4aaecff2-a513-4bbf-9824-c471f4ac9777', + sourceId: '1YhwKyDcKstudlGxkeN5p2wgsrp', + }, + }, + { + message: { + anonymousId: 'anon-id-new', + channel: 'mobile', + context: { + app: { + build: '4', + name: 'RuddCDN', + }, + page: { + referrer: 'google.com', + }, + device: { + id: '3f034872-5e28-45a1-9eda-ce22a3e36d1a', + name: 'generic_x86_arm', + }, + library: { + name: 'com.rudderstack.android.sdk.core', + version: '1.0.6', + }, + 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)', + }, + event: 'Visited Home', + messageId: '1601322811899-d9c7dd00-50dc-4364-95c8-e89423eb3cfb', + originalTimestamp: '2020-09-28T19:53:31.900Z', + properties: { + title: 'Home | RudderStack', + url: 'http://www.rudderstack.com', + }, + receivedAt: '2020-09-29T14:50:43.005+05:30', + sentAt: '2020-09-28T19:53:44.998Z', + timestamp: '2020-09-29T14:50:29.907+05:30', + type: 'track', + }, + destination: { + id: '2JAdls99p6UxoFNSKGwvh0aIt7E', + name: 'Lemnisk Marketing Automation', + enabled: true, + Config: { + plWriteKey: 'pl_writeKey', + pl: 'http://10.11.36.17:8080/analyze/analyze.php', + passKey: '', + apiKey: '', + diapi: '', + cloudMode: 'web', + srcId: '', + diapiWriteKey: '', + }, + destinationDefinition: { + config: { + transformAt: 'processor', + transformAtV1: 'processor', + saveDestinationResponse: true, + includeKeys: [ + 'apiKey', + 'passKey', + 'cloudMode', + 'diapi', + 'pl', + 'diapiWriteKey', + 'plWriteKey', + 'srcId', + ], + excludeKeys: [], + supportedSourceTypes: [ + 'android', + 'ios', + 'web', + 'unity', + 'amp', + 'cloud', + 'reactnative', + 'flutter', + 'cordova', + 'warehouse', + ], + supportedMessageTypes: ['track', 'identify', 'page'], + destConfig: { + defaultConfig: [ + 'apiKey', + 'passKey', + 'cloudMode', + 'diapi', + 'pl', + 'diapiWriteKey', + 'plWriteKey', + 'deviceModeWriteKey', + 'srcId', + ], + }, + secretKeys: ['apiKey', 'passKey', 'plWriteKey', 'diapiWriteKey'], + }, + responseRules: null, + id: '1j9dYVEplxUC5swbXkpK9fYT7uk', + name: 'LEMNISK_MARKETING_AUTOMATION', + displayName: 'Lemnisk Marketing Automation', + createdAt: '2022-12-12T21:58:08.637Z', + }, + rootStore: null, + isProcessorEnabled: true, + }, + metadata: { + anonymousId: '00000000000000000000000000', + destinationId: '1ZQVSU9SXNg6KYgZALaqjAO3PIL', + destinationType: 'DISCORD', + jobId: 129, + messageId: '8b8d5937-09bc-49dc-a35e-8cd6370575f8', + sourceId: '1YhwKyDcKstudlGxkeN5p2wgsrp', + }, + }, + ], + destType: 'lemnisk', + }, + method: 'POST', + }, + }, + output: { + response: { + status: 200, + body: { + output: [ + { + destination: { + id: '2JAdls99p6UxoFNSKGwvh0aIt7E', + name: 'Lemnisk Marketing Automation', + enabled: true, + Config: { + plWriteKey: '', + pl: 'https://crux.lemnisk.co/v2/data', + passKey: '', + apiKey: '', + diapi: ' ', + cloudMode: 'web', + srcId: '', + diapiWriteKey: '', + }, + destinationDefinition: { + config: { + transformAt: 'processor', + transformAtV1: 'processor', + saveDestinationResponse: true, + includeKeys: [ + 'apiKey', + 'passKey', + 'cloudMode', + 'diapi', + 'pl', + 'diapiWriteKey', + 'plWriteKey', + 'srcId', + ], + excludeKeys: [], + supportedSourceTypes: [ + 'android', + 'ios', + 'web', + 'unity', + 'amp', + 'cloud', + 'reactnative', + 'flutter', + 'cordova', + 'warehouse', + ], + supportedMessageTypes: ['track', 'identify', 'page'], + destConfig: { + defaultConfig: [ + 'apiKey', + 'passKey', + 'cloudMode', + 'diapi', + 'pl', + 'diapiWriteKey', + 'plWriteKey', + 'deviceModeWriteKey', + 'srcId', + ], + }, + secretKeys: ['apiKey', 'passKey', 'plWriteKey', 'diapiWriteKey'], + }, + responseRules: null, + id: '1j9dYVEplxUC5swbXkpK9fYT7uk', + name: 'LEMNISK_MARKETING_AUTOMATION', + displayName: 'Lemnisk Marketing Automation', + createdAt: '2022-12-12T21:58:08.637Z', + }, + rootStore: null, + isProcessorEnabled: true, + }, + metadata: [ + { + jobId: 1, + }, + ], + statTags: { + destType: 'LEMNISK', + feature: 'router', + implementation: 'native', + module: 'destination', + errorCategory: 'dataValidation', + errorType: 'configuration', + }, + batched: false, + statusCode: 400, + error: 'Configuration for Web Mode requires write key and region url', + }, + { + batchedRequest: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'http://10.11.36.17:8080/analyze/analyze.php', + headers: { + 'Content-Type': 'application/json', + }, + params: {}, + body: { + JSON: { + type: 'identify', + context: { + userAgent: { + ua: 'Dalvik/2.1.0 (Linux; U; Android 9; AOSP on IA Emulator Build/PSR1.180720.117)', + }, + }, + customerProperties: { + name: 'Home | RudderStack', + url: 'http://www.rudderstack.com', + }, + id: 'anon-id-new', + userId: 'anon-id-new', + messageId: '1601322811899-d9c7dd00-50dc-4364-95c8-e89423eb3cfb', + originalTimestamp: '2020-09-29T14:50:29.907+05:30', + writeKey: 'pl_writeKey', + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + userId: 'anon-id-new', + }, + destination: { + id: '2JAdls99p6UxoFNSKGwvh0aIt7E', + name: 'Lemnisk Marketing Automation', + enabled: true, + Config: { + plWriteKey: 'pl_writeKey', + pl: 'http://10.11.36.17:8080/analyze/analyze.php', + passKey: '', + apiKey: '', + diapi: '', + cloudMode: 'web', + srcId: '', + diapiWriteKey: '', + }, + destinationDefinition: { + config: { + transformAt: 'processor', + transformAtV1: 'processor', + saveDestinationResponse: true, + includeKeys: [ + 'apiKey', + 'passKey', + 'cloudMode', + 'diapi', + 'pl', + 'diapiWriteKey', + 'plWriteKey', + 'srcId', + ], + excludeKeys: [], + supportedSourceTypes: [ + 'android', + 'ios', + 'web', + 'unity', + 'amp', + 'cloud', + 'reactnative', + 'flutter', + 'cordova', + 'warehouse', + ], + supportedMessageTypes: ['track', 'identify', 'page'], + destConfig: { + defaultConfig: [ + 'apiKey', + 'passKey', + 'cloudMode', + 'diapi', + 'pl', + 'diapiWriteKey', + 'plWriteKey', + 'deviceModeWriteKey', + 'srcId', + ], + }, + secretKeys: ['apiKey', 'passKey', 'plWriteKey', 'diapiWriteKey'], + }, + responseRules: null, + id: '1j9dYVEplxUC5swbXkpK9fYT7uk', + name: 'LEMNISK_MARKETING_AUTOMATION', + displayName: 'Lemnisk Marketing Automation', + createdAt: '2022-12-12T21:58:08.637Z', + }, + rootStore: null, + isProcessorEnabled: true, + }, + metadata: [ + { + anonymousId: '12345', + destinationId: '1ZQVSU9SXNg6KYgZALaqjAO3PIL', + destinationType: 'DISCORD', + jobId: 123, + messageId: '4aaecff2-a513-4bbf-9824-c471f4ac9777', + sourceId: '1YhwKyDcKstudlGxkeN5p2wgsrp', + }, + ], + batched: false, + statusCode: 200, + }, + { + batchedRequest: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'http://10.11.36.17:8080/analyze/analyze.php', + headers: { + 'Content-Type': 'application/json', + }, + params: {}, + body: { + JSON: { + type: 'track', + context: { + app: { + build: '4', + name: 'RuddCDN', + }, + page: { + referrer: 'google.com', + }, + device: { + id: '3f034872-5e28-45a1-9eda-ce22a3e36d1a', + name: 'generic_x86_arm', + }, + library: { + name: 'com.rudderstack.android.sdk.core', + version: '1.0.6', + }, + os: { + name: 'Android', + version: '9', + }, + timezone: 'Asia/Kolkata', + traits: { + customProp: 'customValue', + }, + userAgent: { + ua: 'Dalvik/2.1.0 (Linux; U; Android 9; AOSP on IA Emulator Build/PSR1.180720.117)', + }, + }, + properties: { + title: 'Home | RudderStack', + url: 'http://www.rudderstack.com', + }, + event: 'Visited Home', + id: 'anon-id-new', + userId: 'anon-id-new', + messageId: '1601322811899-d9c7dd00-50dc-4364-95c8-e89423eb3cfb', + originalTimestamp: '2020-09-29T14:50:29.907+05:30', + writeKey: 'pl_writeKey', + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + userId: 'anon-id-new', + }, + destination: { + id: '2JAdls99p6UxoFNSKGwvh0aIt7E', + name: 'Lemnisk Marketing Automation', + enabled: true, + Config: { + plWriteKey: 'pl_writeKey', + pl: 'http://10.11.36.17:8080/analyze/analyze.php', + passKey: '', + apiKey: '', + diapi: '', + cloudMode: 'web', + srcId: '', + diapiWriteKey: '', + }, + destinationDefinition: { + config: { + transformAt: 'processor', + transformAtV1: 'processor', + saveDestinationResponse: true, + includeKeys: [ + 'apiKey', + 'passKey', + 'cloudMode', + 'diapi', + 'pl', + 'diapiWriteKey', + 'plWriteKey', + 'srcId', + ], + excludeKeys: [], + supportedSourceTypes: [ + 'android', + 'ios', + 'web', + 'unity', + 'amp', + 'cloud', + 'reactnative', + 'flutter', + 'cordova', + 'warehouse', + ], + supportedMessageTypes: ['track', 'identify', 'page'], + destConfig: { + defaultConfig: [ + 'apiKey', + 'passKey', + 'cloudMode', + 'diapi', + 'pl', + 'diapiWriteKey', + 'plWriteKey', + 'deviceModeWriteKey', + 'srcId', + ], + }, + secretKeys: ['apiKey', 'passKey', 'plWriteKey', 'diapiWriteKey'], + }, + responseRules: null, + id: '1j9dYVEplxUC5swbXkpK9fYT7uk', + name: 'LEMNISK_MARKETING_AUTOMATION', + displayName: 'Lemnisk Marketing Automation', + createdAt: '2022-12-12T21:58:08.637Z', + }, + rootStore: null, + isProcessorEnabled: true, + }, + metadata: [ + { + anonymousId: '00000000000000000000000000', + destinationId: '1ZQVSU9SXNg6KYgZALaqjAO3PIL', + destinationType: 'DISCORD', + jobId: 129, + messageId: '8b8d5937-09bc-49dc-a35e-8cd6370575f8', + sourceId: '1YhwKyDcKstudlGxkeN5p2wgsrp', + }, + ], + batched: false, + statusCode: 200, + }, + ], + }, + }, + }, + }, +]; diff --git a/test/integrations/destinations/lytics/processor/data.ts b/test/integrations/destinations/lytics/processor/data.ts new file mode 100644 index 0000000000..e04b1aa413 --- /dev/null +++ b/test/integrations/destinations/lytics/processor/data.ts @@ -0,0 +1,1360 @@ +export const data = [ + { + name: 'lytics', + description: 'Test 0', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + anonymousId: '4eb021e9-a2af-4926-ae82-fe996d12f3c5', + channel: 'web', + context: { + 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', + timestamp: '2020-10-16T08:10:12.782Z', + 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', + }, + { + 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', + type: 'track', + userId: 'rudder123', + }, + destination: { + DestinationDefinition: { Config: { cdkEnabled: true } }, + Config: { apiKey: 'dummyApiKey', stream: 'default' }, + Enabled: true, + Transformations: [], + IsProcessorEnabled: true, + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://api.lytics.io/collect/json/default?access_token=dummyApiKey', + headers: { 'Content-Type': 'application/json' }, + params: {}, + body: { + JSON: { + _e: 'Order Completed', + checkout_id: 'what is checkout id here??', + coupon: 'APPARELSALE', + currency: 'GBP', + order_id: 'transactionId', + 'products[0].brand': '', + 'products[0].category': 'Merch', + 'products[0].currency': 'GBP', + 'products[0].image_url': 'https://www.example.com/product/bacon-jam.jpg', + 'products[0].name': 'Food/Drink', + 'products[0].position': 1, + 'products[0].price': 3, + 'products[0].product_id': 'product-bacon-jam', + 'products[0].quantity': 2, + 'products[0].sku': 'sku-1', + 'products[0].typeOfProduct': 'Food', + 'products[0].url': 'https://www.example.com/product/bacon-jam', + 'products[0].value': 6, + 'products[0].variant': 'Extra topped', + 'products[1].brand': 'Levis', + 'products[1].category': 'Merch', + 'products[1].currency': 'GBP', + 'products[1].image_url': 'https://www.example.com/product/t-shirt.jpg', + 'products[1].name': 'T-Shirt', + 'products[1].position': 2, + 'products[1].price': 12.99, + 'products[1].product_id': 'product-t-shirt', + 'products[1].quantity': 1, + 'products[1].sku': 'sku-2', + 'products[1].typeOfProduct': 'Shirt', + 'products[1].url': 'https://www.example.com/product/t-shirt', + 'products[1].value': 12.99, + 'products[1].variant': 'White', + 'products[2].brand': 'Levis', + 'products[2].category': 'Merch', + 'products[2].coupon': 'APPARELSALE', + 'products[2].currency': 'GBP', + 'products[2].image_url': 'https://www.example.com/product/offer-t-shirt.jpg', + 'products[2].name': 'T-Shirt-on-offer', + 'products[2].position': 1, + 'products[2].price': 12.99, + 'products[2].product_id': 'offer-t-shirt', + 'products[2].quantity': 1, + 'products[2].sku': 'sku-3', + 'products[2].typeOfProduct': 'Shirt', + 'products[2].url': 'https://www.example.com/product/offer-t-shirt', + 'products[2].value': 12.99, + 'products[2].variant': 'Black', + revenue: 31.98, + shipping: 4, + value: 31.98, + }, + XML: {}, + JSON_ARRAY: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'lytics', + description: 'Test 1', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + anonymousId: '4eb021e9-a2af-4926-ae82-fe996d12f3c5', + channel: 'web', + context: { + 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', + }, + integrations: { All: true }, + messageId: 'e108eb05-f6cd-4624-ba8c-568f2e2b3f92', + originalTimestamp: '2020-10-16T08:26:14.938Z', + receivedAt: '2020-10-16T13:56:14.945+05:30', + request_ip: '[::1]', + sentAt: '2020-10-16T08:26:14.939Z', + timestamp: '2020-10-16T13:56:14.944+05:30', + type: 'identify', + userId: 'rudder123', + }, + destination: { + DestinationDefinition: { Config: { cdkEnabled: true } }, + Config: { apiKey: 'dummyApiKey', stream: 'default' }, + Enabled: true, + Transformations: [], + IsProcessorEnabled: true, + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://api.lytics.io/collect/json/default?access_token=dummyApiKey', + headers: { 'Content-Type': 'application/json' }, + params: {}, + body: { + JSON: { + user_id: 'rudder123', + 'company.id': 'abc123', + createdAt: 'Thu Mar 24 2016 17:46:45 GMT+0000 (UTC)', + email: 'rudderTest@gmail.com', + name: 'Rudder Test', + plan: 'Enterprise', + }, + XML: {}, + JSON_ARRAY: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'lytics', + description: 'Test 2', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + anonymousId: '4eb021e9-a2af-4926-ae82-fe996d12f3c5', + channel: 'web', + 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', + }, + 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: { + DestinationDefinition: { Config: { cdkEnabled: true } }, + Config: { apiKey: 'dummyApiKey', stream: 'default' }, + Enabled: true, + Transformations: [], + IsProcessorEnabled: true, + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://api.lytics.io/collect/json/default?access_token=dummyApiKey', + headers: { 'Content-Type': 'application/json' }, + params: {}, + body: { + JSON: { + user_id: 'rudder123', + 'company.id': 'abc123', + createdAt: 'Thu Mar 24 2016 17:46:45 GMT+0000 (UTC)', + email: 'rudderTest@gmail.com', + name: 'Rudder Test', + plan: 'Enterprise', + }, + XML: {}, + JSON_ARRAY: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'lytics', + description: 'Test 3', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + anonymousId: '4eb021e9-a2af-4926-ae82-fe996d12f3c5', + channel: 'web', + context: { + 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', + }, + integrations: { All: true }, + messageId: 'a61357dd-e29e-4033-b1af-029625947fec', + originalTimestamp: '2020-10-16T09:05:11.001Z', + receivedAt: '2020-10-16T14:35:11.014+05:30', + request_ip: '[::1]', + sentAt: '2020-10-16T09:05:11.002Z', + timestamp: '2020-10-16T14:35:11.013+05:30', + type: 'identify', + userId: 'rudder123', + }, + destination: { + DestinationDefinition: { Config: { cdkEnabled: true } }, + Config: { apiKey: 'dummyApiKey', stream: 'default' }, + Enabled: true, + Transformations: [], + IsProcessorEnabled: true, + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://api.lytics.io/collect/json/default?access_token=dummyApiKey', + headers: { 'Content-Type': 'application/json' }, + params: {}, + body: { + JSON: { + user_id: 'rudder123', + 'company.id': 'abc123', + createdAt: 'Thu Mar 24 2016 17:46:45 GMT+0000 (UTC)', + email: 'rudderTest@gmail.com', + name: 'Rudder Test', + plan: 'Enterprise', + }, + XML: {}, + JSON_ARRAY: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'lytics', + description: 'Test 4', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + anonymousId: '4eb021e9-a2af-4926-ae82-fe996d12f3c5', + channel: 'web', + context: { + 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', + }, + integrations: { All: true }, + messageId: '9eb2f7c0-d896-494e-b105-60f604ce2906', + originalTimestamp: '2020-10-16T09:09:31.465Z', + receivedAt: '2020-10-16T14:39:31.468+05:30', + request_ip: '[::1]', + sentAt: '2020-10-16T09:09:31.466Z', + timestamp: '2020-10-16T14:39:31.467+05:30', + type: 'identify', + userId: 'rudder123', + }, + destination: { + DestinationDefinition: { Config: { cdkEnabled: true } }, + Config: { apiKey: 'dummyApiKey', stream: 'default' }, + Enabled: true, + Transformations: [], + IsProcessorEnabled: true, + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://api.lytics.io/collect/json/default?access_token=dummyApiKey', + headers: { 'Content-Type': 'application/json' }, + params: {}, + body: { + JSON: { + user_id: 'rudder123', + 'company.id': 'abc123', + createdAt: 'Thu Mar 24 2016 17:46:45 GMT+0000 (UTC)', + email: 'rudderTest@gmail.com', + name: 'Rudder Test', + plan: 'Enterprise', + }, + XML: {}, + JSON_ARRAY: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'lytics', + description: 'Test 5', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + anonymousId: '4eb021e9-a2af-4926-ae82-fe996d12f3c5', + channel: 'web', + context: { + 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', + }, + integrations: { All: true }, + messageId: '9eb2f7c0-d896-494e-b105-60f604ce2906', + originalTimestamp: '2020-10-16T09:09:31.465Z', + receivedAt: '2020-10-16T14:39:31.468+05:30', + request_ip: '[::1]', + sentAt: '2020-10-16T09:09:31.466Z', + timestamp: '2020-10-16T14:39:31.467+05:30', + type: 'identify', + userId: 'rudder123', + }, + destination: { + DestinationDefinition: { Config: { cdkEnabled: true } }, + Config: { apiKey: 'dummyApiKey', stream: 'default' }, + Enabled: true, + Transformations: [], + IsProcessorEnabled: true, + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://api.lytics.io/collect/json/default?access_token=dummyApiKey', + headers: { 'Content-Type': 'application/json' }, + params: {}, + body: { + JSON: { + user_id: 'rudder123', + 'company.id': 'abc123', + createdAt: 'Thu Mar 24 2016 17:46:45 GMT+0000 (UTC)', + email: 'rudderTest@gmail.com', + name: 'Rudder Test', + plan: 'Enterprise', + }, + XML: {}, + JSON_ARRAY: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'lytics', + description: 'Test 6', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + anonymousId: '4eb021e9-a2af-4926-ae82-fe996d12f3c5', + channel: 'web', + context: { + 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', + }, + integrations: { All: true }, + messageId: '9eb2f7c0-d896-494e-b105-60f604ce2906', + originalTimestamp: '2020-10-16T09:09:31.465Z', + receivedAt: '2020-10-16T14:39:31.468+05:30', + request_ip: '[::1]', + sentAt: '2020-10-16T09:09:31.466Z', + timestamp: '2020-10-16T14:39:31.467+05:30', + userId: 'rudder123', + }, + metadata: { destinationID: 'ewksfdgDFSdvzsdmwsdfvcxj' }, + destination: { + DestinationDefinition: { Config: { cdkEnabled: true } }, + Config: { apiKey: 'dummyApiKey', stream: 'default' }, + Enabled: true, + Transformations: [], + IsProcessorEnabled: true, + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + error: + 'Unknown error occurred. Original error: "type" is a required field and it must be a string', + metadata: { destinationID: 'ewksfdgDFSdvzsdmwsdfvcxj' }, + statTags: { + destType: 'LYTICS', + errorCategory: 'transformation', + feature: 'processor', + implementation: 'cdkV1', + module: 'destination', + }, + statusCode: 400, + }, + ], + }, + }, + }, + { + name: 'lytics', + description: 'Test 7', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + anonymousId: '4eb021e9-a2af-4926-ae82-fe996d12f3c5', + channel: 'web', + context: { + 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', + }, + integrations: { All: true }, + messageId: '9eb2f7c0-d896-494e-b105-60f604ce2906', + originalTimestamp: '2020-10-16T09:09:31.465Z', + receivedAt: '2020-10-16T14:39:31.468+05:30', + request_ip: '[::1]', + sentAt: '2020-10-16T09:09:31.466Z', + timestamp: '2020-10-16T14:39:31.467+05:30', + type: 'gone', + userId: 'rudder123', + }, + metadata: { destinationID: 'ewksfdgDFSdvzsdmwsdfvcxj' }, + destination: { + DestinationDefinition: { Config: { cdkEnabled: true } }, + Config: { apiKey: 'dummyApiKey', stream: 'default' }, + Enabled: true, + Transformations: [], + IsProcessorEnabled: true, + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + error: 'Bad event. Original error: message type "gone" not supported for "lytics"', + metadata: { destinationID: 'ewksfdgDFSdvzsdmwsdfvcxj' }, + statTags: { + destType: 'LYTICS', + errorCategory: 'dataValidation', + errorType: 'instrumentation', + feature: 'processor', + implementation: 'cdkV1', + module: 'destination', + }, + statusCode: 400, + }, + ], + }, + }, + }, + { + name: 'lytics', + description: 'Test 8', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + channel: 'web', + context: { + 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', + }, + { + 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: { + DestinationDefinition: { Config: { cdkEnabled: true } }, + Config: { apiKey: 'dummyApiKey', stream: 'default' }, + Enabled: true, + Transformations: [], + IsProcessorEnabled: true, + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://api.lytics.io/collect/json/default?access_token=dummyApiKey', + headers: { 'Content-Type': 'application/json' }, + params: {}, + body: { + JSON: { + _e: 'Order Completed', + checkout_id: 'what is checkout id here??', + coupon: 'APPARELSALE', + currency: 'GBP', + order_id: 'transactionId', + 'products[0].brand': '', + 'products[0].category': 'Merch', + 'products[0].currency': 'GBP', + 'products[0].image_url': 'https://www.example.com/product/bacon-jam.jpg', + 'products[0].name': 'Food/Drink', + 'products[0].position': 1, + 'products[0].price': 3, + 'products[0].product_id': 'product-bacon-jam', + 'products[0].quantity': 2, + 'products[0].sku': 'sku-1', + 'products[0].typeOfProduct': 'Food', + 'products[0].url': 'https://www.example.com/product/bacon-jam', + 'products[0].value': 6, + 'products[0].variant': 'Extra topped', + 'products[1].brand': 'Levis', + 'products[1].category': 'Merch', + 'products[1].currency': 'GBP', + 'products[1].image_url': 'https://www.example.com/product/t-shirt.jpg', + 'products[1].name': 'T-Shirt', + 'products[1].position': 2, + 'products[1].price': 12.99, + 'products[1].product_id': 'product-t-shirt', + 'products[1].quantity': 1, + 'products[1].sku': 'sku-2', + 'products[1].typeOfProduct': 'Shirt', + 'products[1].url': 'https://www.example.com/product/t-shirt', + 'products[1].value': 12.99, + 'products[1].variant': 'White', + 'products[2].brand': 'Levis', + 'products[2].category': 'Merch', + 'products[2].coupon': 'APPARELSALE', + 'products[2].currency': 'GBP', + 'products[2].image_url': 'https://www.example.com/product/offer-t-shirt.jpg', + 'products[2].name': 'T-Shirt-on-offer', + 'products[2].position': 1, + 'products[2].price': 12.99, + 'products[2].product_id': 'offer-t-shirt', + 'products[2].quantity': 1, + 'products[2].sku': 'sku-3', + 'products[2].typeOfProduct': 'Shirt', + 'products[2].url': 'https://www.example.com/product/offer-t-shirt', + 'products[2].value': 12.99, + 'products[2].variant': 'Black', + revenue: 31.98, + shipping: 4, + value: 31.98, + }, + XML: {}, + JSON_ARRAY: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'lytics', + description: 'Test 9', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + channel: 'web', + context: { + app: { + build: '1.0.0', + name: 'RudderLabs JavaScript SDK', + namespace: 'com.rudderlabs.javascript', + version: '1.0.0', + }, + traits: { + email: 'testhubspot2@email.com', + name: 'Test Hubspot', + anonymousId: '12345', + }, + library: { name: 'RudderLabs JavaScript SDK', version: '1.0.0' }, + userAgent: + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36', + locale: 'en-GB', + ip: '0.0.0.0', + os: { name: '', version: '' }, + screen: { density: 2 }, + }, + type: 'screen', + messageId: 'e8585d9a-7137-4223-b295-68ab1b17dad7', + originalTimestamp: '2019-10-15T09:35:31.289Z', + anonymousId: '00000000000000000000000000', + userId: '12345', + properties: { path: '', referrer: '', search: '', title: '', url: '' }, + integrations: { All: true }, + name: 'ApplicationLoaded', + sentAt: '2019-10-14T11:15:53.296Z', + destination_props: { AF: { af_uid: 'afUid' } }, + }, + destination: { + DestinationDefinition: { Config: { cdkEnabled: true } }, + Config: { apiKey: 'dummyApiKey', stream: 'default' }, + Enabled: true, + Transformations: [], + IsProcessorEnabled: true, + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://api.lytics.io/collect/json/default?access_token=dummyApiKey', + headers: { 'Content-Type': 'application/json' }, + params: {}, + body: { + JSON: { + event: 'ApplicationLoaded', + path: '', + referrer: '', + search: '', + title: '', + url: '', + }, + XML: {}, + JSON_ARRAY: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'lytics', + description: 'Test 10', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + channel: 'web', + context: { + app: { + build: '1.0.0', + name: 'RudderLabs JavaScript SDK', + namespace: 'com.rudderlabs.javascript', + version: '1.0.0', + }, + traits: { + email: 'testhubspot2@email.com', + name: 'Test Hubspot', + anonymousId: '12345', + }, + library: { name: 'RudderLabs JavaScript SDK', version: '1.0.0' }, + userAgent: + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36', + locale: 'en-GB', + ip: '0.0.0.0', + os: { name: '', version: '' }, + screen: { density: 2 }, + }, + type: 'page', + messageId: 'e8585d9a-7137-4223-b295-68ab1b17dad7', + originalTimestamp: '2019-10-15T09:35:31.289Z', + anonymousId: '00000000000000000000000000', + userId: '12345', + properties: { path: '', referrer: '', search: '', title: '', url: '' }, + integrations: { All: true }, + name: 'ApplicationLoaded', + sentAt: '2019-10-14T11:15:53.296Z', + destination_props: { AF: { af_uid: 'afUid' } }, + }, + destination: { + DestinationDefinition: { Config: { cdkEnabled: true } }, + Config: { apiKey: 'dummyApiKey', stream: 'default' }, + Enabled: true, + Transformations: [], + IsProcessorEnabled: true, + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://api.lytics.io/collect/json/default?access_token=dummyApiKey', + headers: { 'Content-Type': 'application/json' }, + params: {}, + body: { + JSON: { + event: 'ApplicationLoaded', + path: '', + referrer: '', + search: '', + title: '', + url: '', + }, + XML: {}, + JSON_ARRAY: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'lytics', + description: 'Test 11', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + anonymousId: '4eb021e9-a2af-4926-ae82-fe996d12f3c5', + channel: 'web', + context: { + 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', + firstName: 'Rudderstack', + lastname: 'Test', + }, + 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: 'e108eb05-f6cd-4624-ba8c-568f2e2b3f92', + originalTimestamp: '2020-10-16T08:26:14.938Z', + receivedAt: '2020-10-16T13:56:14.945+05:30', + request_ip: '[::1]', + sentAt: '2020-10-16T08:26:14.939Z', + timestamp: '2020-10-16T13:56:14.944+05:30', + type: 'identify', + userId: 'rudder123', + }, + destination: { + DestinationDefinition: { Config: { cdkEnabled: true } }, + Config: { apiKey: 'dummyApiKey', stream: 'default' }, + Enabled: true, + Transformations: [], + IsProcessorEnabled: true, + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://api.lytics.io/collect/json/default?access_token=dummyApiKey', + headers: { 'Content-Type': 'application/json' }, + params: {}, + body: { + JSON: { + user_id: 'rudder123', + 'company.id': 'abc123', + createdAt: 'Thu Mar 24 2016 17:46:45 GMT+0000 (UTC)', + email: 'rudderTest@gmail.com', + name: 'Rudder Test', + plan: 'Enterprise', + first_name: 'Rudderstack', + last_name: 'Test', + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, +]; diff --git a/test/integrations/destinations/lytics/router/data.ts b/test/integrations/destinations/lytics/router/data.ts new file mode 100644 index 0000000000..98aded20bf --- /dev/null +++ b/test/integrations/destinations/lytics/router/data.ts @@ -0,0 +1,351 @@ +export const data = [ + { + name: 'lytics', + description: 'Test 0', + feature: 'router', + module: 'destination', + version: 'v0', + input: { + request: { + body: { + input: [ + { + message: { + anonymousId: '4eb021e9-a2af-4926-ae82-fe996d12f3c5', + channel: 'web', + context: { + 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', + timestamp: '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', + }, + { + 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', + type: 'track', + userId: 'rudder123', + }, + metadata: { + jobId: 1, + }, + destination: { + Config: { + apiKey: 'dummyApiKey', + stream: 'default', + }, + Enabled: true, + Transformations: [], + IsProcessorEnabled: true, + }, + }, + { + message: { + anonymousId: '4eb021e9-a2af-4926-ae82-fe996d12f3c5', + channel: 'web', + context: { + 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', + }, + integrations: { + All: true, + }, + messageId: 'e108eb05-f6cd-4624-ba8c-568f2e2b3f92', + originalTimestamp: '2020-10-16T08:26:14.938Z', + receivedAt: '2020-10-16T13:56:14.945+05:30', + request_ip: '[::1]', + sentAt: '2020-10-16T08:26:14.939Z', + timestamp: '2020-10-16T13:56:14.944+05:30', + type: 'identify', + userId: 'rudder123', + }, + metadata: { + jobId: 2, + }, + destination: { + Config: { + apiKey: 'dummyApiKey', + stream: 'default', + }, + Enabled: true, + Transformations: [], + IsProcessorEnabled: true, + }, + }, + ], + destType: 'lytics', + }, + method: 'POST', + }, + }, + output: { + response: { + status: 200, + body: { + output: [ + { + batchedRequest: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://api.lytics.io/collect/json/default?access_token=dummyApiKey', + headers: { + 'Content-Type': 'application/json', + }, + params: {}, + body: { + JSON: { + _e: 'Order Completed', + checkout_id: 'what is checkout id here??', + coupon: 'APPARELSALE', + currency: 'GBP', + order_id: 'transactionId', + 'products[0].brand': '', + 'products[0].category': 'Merch', + 'products[0].currency': 'GBP', + 'products[0].image_url': 'https://www.example.com/product/bacon-jam.jpg', + 'products[0].name': 'Food/Drink', + 'products[0].position': 1, + 'products[0].price': 3, + 'products[0].product_id': 'product-bacon-jam', + 'products[0].quantity': 2, + 'products[0].sku': 'sku-1', + 'products[0].typeOfProduct': 'Food', + 'products[0].url': 'https://www.example.com/product/bacon-jam', + 'products[0].value': 6, + 'products[0].variant': 'Extra topped', + 'products[1].brand': 'Levis', + 'products[1].category': 'Merch', + 'products[1].currency': 'GBP', + 'products[1].image_url': 'https://www.example.com/product/t-shirt.jpg', + 'products[1].name': 'T-Shirt', + 'products[1].position': 2, + 'products[1].price': 12.99, + 'products[1].product_id': 'product-t-shirt', + 'products[1].quantity': 1, + 'products[1].sku': 'sku-2', + 'products[1].typeOfProduct': 'Shirt', + 'products[1].url': 'https://www.example.com/product/t-shirt', + 'products[1].value': 12.99, + 'products[1].variant': 'White', + 'products[2].brand': 'Levis', + 'products[2].category': 'Merch', + 'products[2].coupon': 'APPARELSALE', + 'products[2].currency': 'GBP', + 'products[2].image_url': 'https://www.example.com/product/offer-t-shirt.jpg', + 'products[2].name': 'T-Shirt-on-offer', + 'products[2].position': 1, + 'products[2].price': 12.99, + 'products[2].product_id': 'offer-t-shirt', + 'products[2].quantity': 1, + 'products[2].sku': 'sku-3', + 'products[2].typeOfProduct': 'Shirt', + 'products[2].url': 'https://www.example.com/product/offer-t-shirt', + 'products[2].value': 12.99, + 'products[2].variant': 'Black', + revenue: 31.98, + shipping: 4, + value: 31.98, + }, + XML: {}, + JSON_ARRAY: {}, + FORM: {}, + }, + files: {}, + }, + metadata: [ + { + jobId: 1, + }, + ], + batched: false, + statusCode: 200, + destination: { + Config: { + apiKey: 'dummyApiKey', + stream: 'default', + }, + Enabled: true, + Transformations: [], + IsProcessorEnabled: true, + }, + }, + { + batchedRequest: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://api.lytics.io/collect/json/default?access_token=dummyApiKey', + headers: { + 'Content-Type': 'application/json', + }, + params: {}, + body: { + JSON: { + user_id: 'rudder123', + 'company.id': 'abc123', + createdAt: 'Thu Mar 24 2016 17:46:45 GMT+0000 (UTC)', + email: 'rudderTest@gmail.com', + name: 'Rudder Test', + plan: 'Enterprise', + }, + XML: {}, + JSON_ARRAY: {}, + FORM: {}, + }, + files: {}, + }, + metadata: [ + { + jobId: 2, + }, + ], + batched: false, + statusCode: 200, + destination: { + Config: { + apiKey: 'dummyApiKey', + stream: 'default', + }, + Enabled: true, + Transformations: [], + IsProcessorEnabled: true, + }, + }, + ], + }, + }, + }, + }, +]; diff --git a/test/integrations/destinations/mailjet/processor/data.ts b/test/integrations/destinations/mailjet/processor/data.ts new file mode 100644 index 0000000000..71e06dc14e --- /dev/null +++ b/test/integrations/destinations/mailjet/processor/data.ts @@ -0,0 +1,229 @@ +export const data = [ + { + name: 'mailjet', + description: 'No Message type', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + userId: 'test@123', + context: { + traits: { + email: 'test@rudderstack.com', + username: 'Samle_putUserName', + firstName: 'uday', + }, + }, + integrations: { All: true, 'user.com': { lookup: 'email' } }, + }, + destination: { Config: { apiKey: 'dummyApiKey', apiSecret: 'dummyApiSecret' } }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + error: 'Event type is required', + statTags: { + destType: 'MAILJET', + errorCategory: 'dataValidation', + errorType: 'instrumentation', + feature: 'processor', + implementation: 'native', + module: 'destination', + }, + statusCode: 400, + }, + ], + }, + }, + }, + { + name: 'mailjet', + description: 'Unsupported Type', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + userId: 'test@123', + type: 'trackUser', + context: { + traits: { + email: 'test@rudderstack.com', + firstName: 'test', + lastName: 'rudderstack', + age: 15, + gender: 'male', + status: 'user', + city: 'Kalkata', + country: 'india', + tags: ['productuser'], + phone: '9225467887', + }, + }, + }, + destination: { Config: { apiKey: 'dummyApiKey', apiSecret: 'dummyApiSecret' } }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + error: 'Event type "trackuser" is not supported', + statTags: { + destType: 'MAILJET', + errorCategory: 'dataValidation', + errorType: 'instrumentation', + feature: 'processor', + implementation: 'native', + module: 'destination', + }, + statusCode: 400, + }, + ], + }, + }, + }, + { + name: 'mailjet', + description: 'MailJet identify call without an email', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + userId: 'test@123', + type: 'identify', + context: { + traits: { + firstName: 'test', + lastName: 'rudderstack', + age: 15, + gender: 'male', + status: 'user', + city: 'Kalkata', + country: 'india', + tags: ['productuser'], + phone: '9225467887', + }, + }, + }, + destination: { Config: { apiKey: 'dummyApiKey', apiSecret: 'dummyApiSecret' } }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + error: 'Missing required value from "email"', + statTags: { + destType: 'MAILJET', + errorCategory: 'dataValidation', + errorType: 'instrumentation', + feature: 'processor', + implementation: 'native', + module: 'destination', + }, + statusCode: 400, + }, + ], + }, + }, + }, + { + name: 'mailjet', + description: 'Mailjet identify call without batching', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + userId: 'user@45', + type: 'identify', + context: { + traits: { + age: '30', + email: 'test@user.com', + phone: '7267286346802347827', + userId: 'sajal', + city: 'gondal', + userCountry: 'india', + lastName: 'dev', + username: 'Samle_putUserName', + firstName: 'rudderlabs', + }, + }, + }, + destination: { + Config: { + apiKey: 'dummyApiKey', + apiSecret: 'dummyApiSecret', + listId: '58578', + contactPropertiesMapping: [{ from: 'userCountry', to: 'country' }], + }, + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: '', + headers: {}, + params: {}, + body: { + JSON: { email: 'test@user.com', properties: { country: 'india' } }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + listId: '58578', + action: 'addnoforce', + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, +]; diff --git a/test/integrations/destinations/mailjet/router/data.ts b/test/integrations/destinations/mailjet/router/data.ts new file mode 100644 index 0000000000..85c96629ff --- /dev/null +++ b/test/integrations/destinations/mailjet/router/data.ts @@ -0,0 +1,106 @@ +export const data = [ + { + name: 'mailjet', + description: 'Test 0', + feature: 'router', + module: 'destination', + version: 'v0', + input: { + request: { + body: { + input: [ + { + destination: { + Config: { + apiKey: 'dummyApiKey', + apiSecret: 'dummyApiSecret', + listId: '58578', + contactPropertiesMapping: [{ from: 'userCountry', to: 'country' }], + }, + }, + metadata: { + jobId: 1, + }, + message: { + userId: 'user@45', + type: 'identify', + context: { + traits: { + age: '30', + email: 'test@user.com', + phone: '7267286346802347827', + userId: 'sajal', + city: 'gondal', + userCountry: 'india', + lastName: 'dev', + username: 'Samle_putUserName', + firstName: 'rudderlabs', + }, + }, + }, + }, + ], + destType: 'mailjet', + }, + method: 'POST', + }, + }, + output: { + response: { + status: 200, + body: { + output: [ + { + batchedRequest: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://api.mailjet.com/v3/REST/contactslist/58578/managemanycontacts', + headers: { + 'Content-Type': 'application/json', + Authorization: 'Basic ZHVtbXlBcGlLZXk6ZHVtbXlBcGlTZWNyZXQ=', + }, + params: {}, + body: { + FORM: {}, + JSON: { + Action: 'addnoforce', + Contacts: [ + { + email: 'test@user.com', + properties: { country: 'india' }, + }, + ], + }, + JSON_ARRAY: {}, + XML: {}, + }, + files: {}, + }, + metadata: [ + { + jobId: 1, + }, + ], + batched: true, + statusCode: 200, + destination: { + Config: { + apiKey: 'dummyApiKey', + apiSecret: 'dummyApiSecret', + listId: '58578', + contactPropertiesMapping: [ + { + from: 'userCountry', + to: 'country', + }, + ], + }, + }, + }, + ], + }, + }, + }, + }, +]; diff --git a/test/integrations/destinations/mailmodo/processor/data.ts b/test/integrations/destinations/mailmodo/processor/data.ts new file mode 100644 index 0000000000..45a14e2a52 --- /dev/null +++ b/test/integrations/destinations/mailmodo/processor/data.ts @@ -0,0 +1,648 @@ +export const data = [ + { + name: 'mailmodo', + description: 'Track call', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + destination: { Config: { apiKey: 'dummyApiKey' } }, + message: { + event: 'trackevent', + type: 'track', + sentAt: '2022-01-20T13:39:21.033Z', + userId: 'user123456001', + channel: 'web', + context: { + os: { name: '', version: '' }, + app: { + name: 'RudderLabs JavaScript SDK', + build: '1.0.0', + version: '1.2.20', + namespace: 'com.rudderlabs.javascript', + }, + page: { + url: 'http://127.0.0.1:7307/Testing/App_for_LaunchDarkly/ourSdk.html', + path: '/Testing/App_for_LaunchDarkly/ourSdk.html', + title: 'Document', + search: '', + tab_url: 'http://127.0.0.1:7307/Testing/App_for_LaunchDarkly/ourSdk.html', + referrer: 'http://127.0.0.1:7307/Testing/App_for_LaunchDarkly/', + initial_referrer: '$direct', + referring_domain: '127.0.0.1:7307', + initial_referring_domain: '', + }, + locale: 'en-US', + screen: { width: 1440, height: 900, density: 2, innerWidth: 536, innerHeight: 689 }, + traits: { + city: 'Pune', + name: 'First User', + email: 'firstUser@testmail.com', + title: 'VP', + gender: 'female', + avatar: 'https://i.pravatar.cc/300', + }, + library: { name: 'RudderLabs JavaScript SDK', version: '1.2.20' }, + campaign: {}, + userAgent: + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36', + }, + rudderId: '553b5522-c575-40a7-8072-9741c5f9a647', + messageId: '831f1fa5-de84-4f22-880a-4c3f23fc3f04', + anonymousId: 'bf412108-0357-4330-b119-7305e767823c', + integrations: { All: true }, + originalTimestamp: '2022-01-20T13:39:21.032Z', + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://api.mailmodo.com/api/v1/addEvent', + headers: { mmApiKey: 'dummyApiKey', 'Content-Type': 'application/json' }, + params: {}, + body: { + JSON: { email: 'firstUser@testmail.com', event_name: 'trackevent' }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'mailmodo', + description: 'Providing empty API Key', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + destination: { Config: { apiKey: '' } }, + message: { + event: 'trackevent', + type: 'track', + sentAt: '2022-01-20T13:39:21.033Z', + userId: 'user123456001', + channel: 'web', + context: { + os: { name: '', version: '' }, + app: { + name: 'RudderLabs JavaScript SDK', + build: '1.0.0', + version: '1.2.20', + namespace: 'com.rudderlabs.javascript', + }, + page: { + url: 'http://127.0.0.1:7307/Testing/App_for_LaunchDarkly/ourSdk.html', + path: '/Testing/App_for_LaunchDarkly/ourSdk.html', + title: 'Document', + search: '', + tab_url: 'http://127.0.0.1:7307/Testing/App_for_LaunchDarkly/ourSdk.html', + referrer: 'http://127.0.0.1:7307/Testing/App_for_LaunchDarkly/', + initial_referrer: '$direct', + referring_domain: '127.0.0.1:7307', + initial_referring_domain: '', + }, + locale: 'en-US', + screen: { width: 1440, height: 900, density: 2, innerWidth: 536, innerHeight: 689 }, + traits: { + city: 'Pune', + name: 'First User', + email: 'firstUser@testmail.com', + title: 'VP', + gender: 'female', + avatar: 'https://i.pravatar.cc/300', + }, + library: { name: 'RudderLabs JavaScript SDK', version: '1.2.20' }, + campaign: {}, + userAgent: + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36', + }, + rudderId: '553b5522-c575-40a7-8072-9741c5f9a647', + messageId: '831f1fa5-de84-4f22-880a-4c3f23fc3f04', + anonymousId: 'bf412108-0357-4330-b119-7305e767823c', + integrations: { All: true }, + originalTimestamp: '2022-01-20T13:39:21.032Z', + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + error: 'API Key is not present, Aborting event', + statTags: { + destType: 'MAILMODO', + errorCategory: 'dataValidation', + errorType: 'configuration', + feature: 'processor', + implementation: 'native', + module: 'destination', + }, + statusCode: 400, + }, + ], + }, + }, + }, + { + name: 'mailmodo', + description: 'Not providing event type', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + destination: { Config: { apiKey: 'ahj' } }, + message: { + event: 'trackevent', + sentAt: '2022-01-20T13:39:21.033Z', + userId: 'user123456001', + channel: 'web', + context: { + os: { name: '', version: '' }, + app: { + name: 'RudderLabs JavaScript SDK', + build: '1.0.0', + version: '1.2.20', + namespace: 'com.rudderlabs.javascript', + }, + page: { + url: 'http://127.0.0.1:7307/Testing/App_for_LaunchDarkly/ourSdk.html', + path: '/Testing/App_for_LaunchDarkly/ourSdk.html', + title: 'Document', + search: '', + tab_url: 'http://127.0.0.1:7307/Testing/App_for_LaunchDarkly/ourSdk.html', + referrer: 'http://127.0.0.1:7307/Testing/App_for_LaunchDarkly/', + initial_referrer: '$direct', + referring_domain: '127.0.0.1:7307', + initial_referring_domain: '', + }, + locale: 'en-US', + screen: { width: 1440, height: 900, density: 2, innerWidth: 536, innerHeight: 689 }, + traits: { + city: 'Pune', + name: 'First User', + email: 'firstUser@testmail.com', + title: 'VP', + gender: 'female', + avatar: 'https://i.pravatar.cc/300', + }, + library: { name: 'RudderLabs JavaScript SDK', version: '1.2.20' }, + campaign: {}, + userAgent: + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36', + }, + rudderId: '553b5522-c575-40a7-8072-9741c5f9a647', + messageId: '831f1fa5-de84-4f22-880a-4c3f23fc3f04', + anonymousId: 'bf412108-0357-4330-b119-7305e767823c', + integrations: { All: true }, + originalTimestamp: '2022-01-20T13:39:21.032Z', + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + error: 'Event type is required', + statTags: { + destType: 'MAILMODO', + errorCategory: 'dataValidation', + errorType: 'instrumentation', + feature: 'processor', + implementation: 'native', + module: 'destination', + }, + statusCode: 400, + }, + ], + }, + }, + }, + { + name: 'mailmodo', + description: 'Page call- not supported', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + destination: { Config: { apiKey: 'dummyApiKey', listName: 'abcdef' } }, + message: { + type: 'page', + event: 'Email Opened', + sentAt: '2020-08-28T16:26:16.473Z', + context: { library: { name: 'analytics-node', version: '0.0.3' } }, + _metadata: { nodeVersion: '10.22.0' }, + messageId: + 'node-570110489d3e99b234b18af9a9eca9d4-6009779e-82d7-469d-aaeb-5ccf162b0453', + properties: { + subject: 'resume validate', + sendtime: '2020-01-01', + sendlocation: 'akashdeep@gmail.com', + }, + anonymousId: 'abcdeeeeeeeexxxx102', + originalTimestamp: '2020-08-28T16:26:06.468Z', + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + error: 'Event type page is not supported', + statTags: { + destType: 'MAILMODO', + errorCategory: 'dataValidation', + errorType: 'instrumentation', + feature: 'processor', + implementation: 'native', + module: 'destination', + }, + statusCode: 400, + }, + ], + }, + }, + }, + { + name: 'mailmodo', + description: 'Identify call- with empty listName', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + destination: { Config: { apiKey: 'dummyApiKey', listName: '' } }, + message: { + type: 'identify', + event: 'Email Opened', + sentAt: '2020-08-28T16:26:16.473Z', + context: { library: { name: 'analytics-node', version: '0.0.3' } }, + _metadata: { nodeVersion: '10.22.0' }, + messageId: + 'node-570110489d3e99b234b18af9a9eca9d4-6009779e-82d7-469d-aaeb-5ccf162b0453', + properties: { + email: 'test3@abc.com', + subject: 'resume validate', + sendtime: '2020-01-01', + sendlocation: 'akashdeep@gmail.com', + }, + anonymousId: 'abcdeeeeeeeexxxx102', + originalTimestamp: '2020-08-28T16:26:06.468Z', + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://api.mailmodo.com/api/v1/addToList/batch', + headers: { mmApiKey: 'dummyApiKey', 'Content-Type': 'application/json' }, + params: {}, + body: { + JSON: { listName: 'Rudderstack', values: [{ email: 'test3@abc.com' }] }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'mailmodo', + description: 'Identify call- with listName', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + destination: { Config: { apiKey: 'dummyApiKey', listName: 'abcdef' } }, + message: { + type: 'identify', + event: 'Email Opened', + sentAt: '2020-08-28T16:26:16.473Z', + context: { library: { name: 'analytics-node', version: '0.0.3' } }, + _metadata: { nodeVersion: '10.22.0' }, + messageId: + 'node-570110489d3e99b234b18af9a9eca9d4-6009779e-82d7-469d-aaeb-5ccf162b0453', + properties: { + email: 'test3@abc.com', + subject: 'resume validate', + sendtime: '2020-01-01', + sendlocation: 'akashdeep@gmail.com', + }, + anonymousId: 'abcdeeeeeeeexxxx102', + originalTimestamp: '2020-08-28T16:26:06.468Z', + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://api.mailmodo.com/api/v1/addToList/batch', + headers: { mmApiKey: 'dummyApiKey', 'Content-Type': 'application/json' }, + params: {}, + body: { + JSON: { listName: 'abcdef', values: [{ email: 'test3@abc.com' }] }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'mailmodo', + description: 'Identify call- without email', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + destination: { Config: { apiKey: 'dummyApiKey', listName: 'abcdef' } }, + message: { + type: 'identify', + event: 'Email Opened', + sentAt: '2020-08-28T16:26:16.473Z', + context: { library: { name: 'analytics-node', version: '0.0.3' } }, + _metadata: { nodeVersion: '10.22.0' }, + messageId: + 'node-570110489d3e99b234b18af9a9eca9d4-6009779e-82d7-469d-aaeb-5ccf162b0453', + properties: { + subject: 'resume validate', + sendtime: '2020-01-01', + sendlocation: 'akashdeep@gmail.com', + }, + anonymousId: 'abcdeeeeeeeexxxx102', + originalTimestamp: '2020-08-28T16:26:06.468Z', + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + error: + 'Missing required value from ["traits.email","context.traits.email","properties.email"]', + statTags: { + destType: 'MAILMODO', + errorCategory: 'dataValidation', + errorType: 'instrumentation', + feature: 'processor', + implementation: 'native', + module: 'destination', + }, + statusCode: 400, + }, + ], + }, + }, + }, + { + name: 'mailmodo', + description: 'Identify call- with user properties(address as an object)', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + destination: { Config: { apiKey: 'dummyApiKey', listName: 'abcdef' } }, + message: { + type: 'identify', + userId: 'identified user id', + anonymousId: 'anon-id-new', + context: { + traits: { trait1: 'new-val' }, + ip: '14.5.67.21', + library: { name: 'http' }, + }, + traits: { + email: 'testabc2@abcd.com', + name: 'Rudder Test', + firstName: 'Test', + lastName: 'Rudderlabs', + age: 21, + phone: '9876543210', + address: { street: 'A street', city: 'Vijayawada', country: 'India' }, + }, + timestamp: '2020-02-02T00:23:09.544Z', + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://api.mailmodo.com/api/v1/addToList/batch', + headers: { mmApiKey: 'dummyApiKey', 'Content-Type': 'application/json' }, + params: {}, + body: { + JSON: { + listName: 'abcdef', + values: [ + { + email: 'testabc2@abcd.com', + data: { + age: 21, + first_name: 'Test', + last_name: 'Rudderlabs', + name: 'Rudder Test', + phone: '9876543210', + trait1: 'new-val', + city: 'Vijayawada', + country: 'India', + address1: 'A street Vijayawada India ', + }, + }, + ], + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'mailmodo', + description: 'Identify call- with user properties(address as a string)', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + destination: { Config: { apiKey: 'dummyApiKey', listName: 'abcdef' } }, + message: { + type: 'identify', + userId: 'identified user id', + anonymousId: 'anon-id-new', + context: { + traits: { trait1: 'new-val' }, + ip: '14.5.67.21', + library: { name: 'http' }, + }, + traits: { + email: 'testabc2@abcd.com', + name: 'Rudder Test', + firstName: 'Test', + lastName: 'Rudderlabs', + age: 21, + phone: '9876543210', + address: 'welcome to home', + }, + timestamp: '2020-02-02T00:23:09.544Z', + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://api.mailmodo.com/api/v1/addToList/batch', + headers: { mmApiKey: 'dummyApiKey', 'Content-Type': 'application/json' }, + params: {}, + body: { + JSON: { + listName: 'abcdef', + values: [ + { + email: 'testabc2@abcd.com', + data: { + age: 21, + first_name: 'Test', + last_name: 'Rudderlabs', + name: 'Rudder Test', + phone: '9876543210', + trait1: 'new-val', + address1: 'welcome to home', + }, + }, + ], + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, +]; diff --git a/test/integrations/destinations/mailmodo/router/data.ts b/test/integrations/destinations/mailmodo/router/data.ts new file mode 100644 index 0000000000..c341259bbe --- /dev/null +++ b/test/integrations/destinations/mailmodo/router/data.ts @@ -0,0 +1,294 @@ +export const data = [ + { + name: 'mailmodo', + description: 'Test 0', + feature: 'router', + module: 'destination', + version: 'v0', + input: { + request: { + body: { + input: [ + { + message: { + type: 'identify', + event: 'Email Opened', + sentAt: '2020-08-28T16:26:16.473Z', + context: { + library: { + name: 'analytics-node', + version: '0.0.3', + }, + }, + _metadata: { + nodeVersion: '10.22.0', + }, + messageId: + 'node-570110489d3e99b234b18af9a9eca9d4-6009779e-82d7-469d-aaeb-5ccf162b0453', + properties: { + email: 'test@abc.com', + subject: 'resume validate', + sendtime: '2020-01-01', + sendlocation: 'akashdeep@gmail.com', + }, + anonymousId: 'abcdeeeeeeeexxxx102', + originalTimestamp: '2020-08-28T16:26:06.468Z', + }, + metadata: { + jobId: 2, + }, + destination: { + Config: { + apiKey: 'dummyApiKey', + listName: 'abc', + }, + Enabled: true, + }, + }, + { + message: { + 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', + }, + messageId: + 'node-570110489d3e99b234b18af9a9eca9d4-6009779e-82d7-469d-aaeb-5ccf162b0453', + properties: { + email: 'test@abc.com', + subject: 'resume validate', + sendtime: '2020-01-01', + sendlocation: 'akashdeep@gmail.com', + }, + anonymousId: 'abcdeeeeeeeexxxx102', + originalTimestamp: '2020-08-28T16:26:06.468Z', + }, + metadata: { + jobId: 3, + }, + destination: { + Config: { + apiKey: 'dummyApiKey', + listName: 'abc', + }, + Enabled: true, + }, + }, + { + message: { + type: 'identify', + userId: 'identified user id', + anonymousId: 'anon-id-new', + context: { + traits: { + trait1: 'new-val', + }, + ip: '14.5.67.21', + library: { + name: 'http', + }, + }, + traits: { + email: 'test@abc.com', + name: 'Rudder Test', + firstName: 'Test', + lastName: 'Rudderlabs', + age: 21, + phone: '9876543210', + }, + timestamp: '2020-02-02T00:23:09.544Z', + }, + metadata: { + jobId: 4, + }, + destination: { + Config: { + apiKey: 'dummyApiKey', + listName: 'abc', + }, + Enabled: true, + }, + }, + { + message: { + type: 'identify', + event: 'Email Opened', + sentAt: '2020-08-28T16:26:16.473Z', + context: { + library: { + name: 'analytics-node', + version: '0.0.3', + }, + }, + _metadata: { + nodeVersion: '10.22.0', + }, + messageId: + 'node-570110489d3e99b234b18af9a9eca9d4-6009779e-82d7-469d-aaeb-5ccf162b0453', + properties: { + subject: 'resume validate', + sendtime: '2020-01-01', + sendlocation: 'akashdeep@gmail.com', + }, + anonymousId: 'abcdeeeeeeeexxxx102', + originalTimestamp: '2020-08-28T16:26:06.468Z', + }, + metadata: { + jobId: 5, + }, + destination: { + Config: { + apiKey: 'dummyApiKey', + listName: '', + }, + Enabled: true, + }, + }, + ], + destType: 'mailmodo', + }, + method: 'POST', + }, + }, + output: { + response: { + status: 200, + body: { + output: [ + { + batchedRequest: { + body: { + XML: {}, + JSON_ARRAY: {}, + FORM: {}, + JSON: { + listName: 'abc', + values: [ + { + email: 'test@abc.com', + }, + { + email: 'test@abc.com', + data: { + name: 'Rudder Test', + first_name: 'Test', + last_name: 'Rudderlabs', + age: 21, + phone: '9876543210', + trait1: 'new-val', + }, + }, + ], + }, + }, + type: 'REST', + files: {}, + method: 'POST', + params: {}, + headers: { + mmApiKey: 'dummyApiKey', + 'Content-Type': 'application/json', + }, + version: '1', + endpoint: 'https://api.mailmodo.com/api/v1/addToList/batch', + }, + metadata: [ + { + jobId: 2, + }, + { + jobId: 4, + }, + ], + batched: true, + statusCode: 200, + destination: { + Config: { + apiKey: 'dummyApiKey', + listName: 'abc', + }, + Enabled: true, + }, + }, + { + batchedRequest: { + body: { + XML: {}, + JSON_ARRAY: {}, + FORM: {}, + JSON: { + email: 'test@abc.com', + event_name: 'Email Opened', + event_properties: { + email: 'test@abc.com', + sendlocation: 'akashdeep@gmail.com', + sendtime: '2020-01-01', + subject: 'resume validate', + }, + }, + }, + type: 'REST', + files: {}, + method: 'POST', + params: {}, + headers: { + mmApiKey: 'dummyApiKey', + 'Content-Type': 'application/json', + }, + version: '1', + endpoint: 'https://api.mailmodo.com/api/v1/addEvent', + }, + metadata: [ + { + jobId: 3, + }, + ], + batched: false, + statusCode: 200, + destination: { + Config: { + apiKey: 'dummyApiKey', + listName: 'abc', + }, + Enabled: true, + }, + }, + { + batched: false, + error: + 'Missing required value from ["traits.email","context.traits.email","properties.email"]', + metadata: [ + { + jobId: 5, + }, + ], + statTags: { + destType: 'MAILMODO', + errorCategory: 'dataValidation', + errorType: 'instrumentation', + feature: 'router', + implementation: 'native', + module: 'destination', + }, + statusCode: 400, + destination: { + Config: { + apiKey: 'dummyApiKey', + listName: '', + }, + Enabled: true, + }, + }, + ], + }, + }, + }, + }, +]; diff --git a/test/integrations/destinations/marketo_static_list/processor/data.ts b/test/integrations/destinations/marketo_static_list/processor/data.ts new file mode 100644 index 0000000000..51e4e87824 --- /dev/null +++ b/test/integrations/destinations/marketo_static_list/processor/data.ts @@ -0,0 +1,1194 @@ +export const data = [ + { + name: 'marketo_static_list', + description: 'adding and removing users and getting staticListId from externalId', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + destination: { + ID: '1zia9wKshXt80YksLmUdJnr7IHI', + Name: 'test_marketo', + DestinationDefinition: { + ID: '1iVQvTRMsPPyJzwol0ifH93QTQ6', + Name: 'MARKETO', + DisplayName: 'Marketo', + transformAt: 'processor', + transformAtV1: 'processor', + }, + Config: { + clientId: 'marketo_client_id_success', + clientSecret: 'marketo_client_secret_success', + accountId: 'marketo_acct_id_success', + staticListId: 3421, + }, + Enabled: true, + Transformations: [], + IsProcessorEnabled: true, + }, + message: { + userId: 'user 1', + anonymousId: 'anon-id-new', + event: 'event1', + type: 'audiencelist', + properties: { + listData: { + add: [{ id: 1 }, { id: 2 }, { id: 3 }], + remove: [{ id: 4 }, { id: 5 }, { id: 6 }], + }, + enablePartialFailure: true, + }, + context: { + ip: '14.5.67.21', + library: { name: 'http' }, + externalId: [{ type: 'marketoStaticListId', id: 1234 }], + }, + timestamp: '2020-02-02T00:23:09.544Z', + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: + 'https://marketo_acct_id_success.mktorest.com/rest/v1/lists/1234/leads.json?id=1&id=2&id=3', + headers: { + Authorization: 'Bearer access_token_success', + 'Content-Type': 'application/json', + }, + params: {}, + body: { JSON: {}, JSON_ARRAY: {}, XML: {}, FORM: {} }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + { + output: { + version: '1', + type: 'REST', + method: 'DELETE', + endpoint: + 'https://marketo_acct_id_success.mktorest.com/rest/v1/lists/1234/leads.json?id=4&id=5&id=6', + headers: { + Authorization: 'Bearer access_token_success', + 'Content-Type': 'application/json', + }, + params: {}, + body: { JSON: {}, JSON_ARRAY: {}, XML: {}, FORM: {} }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'marketo_static_list', + description: 'adding more than max limit users', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + destination: { + ID: '1zia9wKshXt80YksLmUdJnr7IHI', + Name: 'test_marketo', + DestinationDefinition: { + ID: '1iVQvTRMsPPyJzwol0ifH93QTQ6', + Name: 'MARKETO', + DisplayName: 'Marketo', + transformAt: 'processor', + transformAtV1: 'processor', + }, + Config: { + clientId: 'marketo_client_id_success', + clientSecret: 'marketo_client_secret_success', + accountId: 'marketo_acct_id_success', + staticListId: 1234, + }, + Enabled: true, + Transformations: [], + IsProcessorEnabled: true, + }, + message: { + userId: 'user 1', + anonymousId: 'anon-id-new', + event: 'event1', + type: 'audiencelist', + properties: { + listData: { + add: [ + { 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 }, + { 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 }, + ], + }, + enablePartialFailure: true, + }, + context: { ip: '14.5.67.21', library: { name: 'http' } }, + timestamp: '2020-02-02T00:23:09.544Z', + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + 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', + headers: { + Authorization: 'Bearer access_token_success', + 'Content-Type': 'application/json', + }, + params: {}, + body: { JSON: {}, JSON_ARRAY: {}, XML: {}, FORM: {} }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + { + output: { + version: '1', + 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', + headers: { + Authorization: 'Bearer access_token_success', + 'Content-Type': 'application/json', + }, + params: {}, + body: { JSON: {}, JSON_ARRAY: {}, XML: {}, FORM: {} }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'marketo_static_list', + description: 'removing more than max limit users', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + destination: { + ID: '1zia9wKshXt80YksLmUdJnr7IHI', + Name: 'test_marketo', + DestinationDefinition: { + ID: '1iVQvTRMsPPyJzwol0ifH93QTQ6', + Name: 'MARKETO', + DisplayName: 'Marketo', + transformAt: 'processor', + transformAtV1: 'processor', + }, + Config: { + clientId: 'marketo_client_id_success', + clientSecret: 'marketo_client_secret_success', + accountId: 'marketo_acct_id_success', + staticListId: 1234, + }, + Enabled: true, + Transformations: [], + IsProcessorEnabled: true, + }, + message: { + userId: 'user 1', + anonymousId: 'anon-id-new', + event: 'event1', + type: 'audiencelist', + properties: { + listData: { + remove: [ + { 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 }, + { 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 }, + ], + }, + enablePartialFailure: true, + }, + context: { ip: '14.5.67.21', library: { name: 'http' } }, + timestamp: '2020-02-02T00:23:09.544Z', + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + 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', + headers: { + Authorization: 'Bearer access_token_success', + 'Content-Type': 'application/json', + }, + params: {}, + body: { JSON: {}, JSON_ARRAY: {}, XML: {}, FORM: {} }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + { + output: { + version: '1', + 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', + headers: { + Authorization: 'Bearer access_token_success', + 'Content-Type': 'application/json', + }, + params: {}, + body: { JSON: {}, JSON_ARRAY: {}, XML: {}, FORM: {} }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'marketo_static_list', + description: 'unsupported message Type', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + destination: { + ID: '1zia9wKshXt80YksLmUdJnr7IHI', + Name: 'test_marketo', + DestinationDefinition: { + ID: '1iVQvTRMsPPyJzwol0ifH93QTQ6', + Name: 'MARKETO', + DisplayName: 'Marketo', + transformAt: 'processor', + transformAtV1: 'processor', + }, + Config: { + clientId: 'marketo_client_id_success', + clientSecret: 'marketo_client_secret_success', + accountId: 'marketo_acct_id_success', + staticListId: 1234, + }, + Enabled: true, + Transformations: [], + IsProcessorEnabled: true, + }, + message: { + userId: 'user 1', + anonymousId: 'anon-id-new', + event: 'event1', + type: 'track', + properties: { listData: { remove: [1] }, enablePartialFailure: true }, + context: { ip: '14.5.67.21', library: { name: 'http' } }, + timestamp: '2020-02-02T00:23:09.544Z', + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + error: 'Event type track is not supported', + statTags: { + destType: 'MARKETO_STATIC_LIST', + errorCategory: 'dataValidation', + errorType: 'instrumentation', + feature: 'processor', + implementation: 'native', + module: 'destination', + }, + statusCode: 400, + }, + ], + }, + }, + }, + { + name: 'marketo_static_list', + description: 'Invalid leadIds format ', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + destination: { + ID: '1zia9wKshXt80YksLmUdJnr7IHI', + Name: 'test_marketo', + DestinationDefinition: { + ID: '1iVQvTRMsPPyJzwol0ifH93QTQ6', + Name: 'MARKETO', + DisplayName: 'Marketo', + transformAt: 'processor', + transformAtV1: 'processor', + }, + Config: { + clientId: 'marketo_client_id_success', + clientSecret: 'marketo_client_secret_success', + accountId: 'marketo_acct_id_success', + staticListId: 1234, + }, + Enabled: true, + Transformations: [], + IsProcessorEnabled: true, + }, + message: { + userId: 'user 1', + anonymousId: 'anon-id-new', + event: 'event1', + type: 'audiencelist', + properties: { listData: { remove: 1 }, enablePartialFailure: true }, + context: { ip: '14.5.67.21', library: { name: 'http' } }, + timestamp: '2020-02-02T00:23:09.544Z', + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + error: 'Invalid leadIds format or no leadIds found neither to add nor to remove', + statTags: { + destType: 'MARKETO_STATIC_LIST', + errorCategory: 'dataValidation', + errorType: 'instrumentation', + feature: 'processor', + implementation: 'native', + module: 'destination', + }, + statusCode: 400, + }, + ], + }, + }, + }, + { + name: 'marketo_static_list', + description: 'Only adding with remove not an array', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + destination: { + ID: '1zia9wKshXt80YksLmUdJnr7IHI', + Name: 'test_marketo', + DestinationDefinition: { + ID: '1iVQvTRMsPPyJzwol0ifH93QTQ6', + Name: 'MARKETO', + DisplayName: 'Marketo', + transformAt: 'processor', + transformAtV1: 'processor', + }, + Config: { + clientId: 'marketo_client_id_success', + clientSecret: 'marketo_client_secret_success', + accountId: 'marketo_acct_id_success', + staticListId: 1234, + }, + Enabled: true, + Transformations: [], + IsProcessorEnabled: true, + }, + message: { + userId: 'user 1', + anonymousId: 'anon-id-new', + event: 'event1', + type: 'audiencelist', + properties: { listData: { add: [{ id: 1 }], remove: 2 }, enablePartialFailure: true }, + context: { ip: '14.5.67.21', library: { name: 'http' } }, + timestamp: '2020-02-02T00:23:09.544Z', + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: + 'https://marketo_acct_id_success.mktorest.com/rest/v1/lists/1234/leads.json?id=1', + headers: { + Authorization: 'Bearer access_token_success', + 'Content-Type': 'application/json', + }, + params: {}, + body: { JSON: {}, JSON_ARRAY: {}, XML: {}, FORM: {} }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, +]; diff --git a/test/integrations/destinations/marketo_static_list/router/data.ts b/test/integrations/destinations/marketo_static_list/router/data.ts new file mode 100644 index 0000000000..23b2ea8ea3 --- /dev/null +++ b/test/integrations/destinations/marketo_static_list/router/data.ts @@ -0,0 +1,1416 @@ +export const data = [ + { + name: 'marketo_static_list', + description: 'Test 0', + feature: 'router', + module: 'destination', + version: 'v0', + input: { + request: { + body: { + input: [ + { + destination: { + ID: '1zia9wKshXt80YksLmUdJnr7IHI', + Name: 'test_marketo', + DestinationDefinition: { + ID: '1iVQvTRMsPPyJzwol0ifH93QTQ6', + Name: 'MARKETO', + DisplayName: 'Marketo', + transformAt: 'processor', + transformAtV1: 'processor', + }, + Config: { + clientId: 'marketo_client_id_success', + clientSecret: 'marketo_client_secret_success', + accountId: 'marketo_acct_id_success', + staticListId: 1234, + }, + Enabled: true, + Transformations: [], + IsProcessorEnabled: true, + }, + message: { + userId: 'user 1', + anonymousId: 'anon-id-new', + event: 'event1', + type: 'audiencelist', + properties: { + listData: { + add: [ + { + id: 1, + }, + { + id: 2, + }, + { + id: 3, + }, + ], + remove: [ + { + id: 4, + }, + { + id: 5, + }, + { + id: 6, + }, + ], + }, + enablePartialFailure: true, + }, + context: { + ip: '14.5.67.21', + library: { + name: 'http', + }, + }, + timestamp: '2020-02-02T00:23:09.544Z', + }, + metadata: { + jobId: 1, + }, + }, + { + destination: { + ID: '1zia9wKshXt80YksLmUdJnr7IHI', + Name: 'test_marketo', + DestinationDefinition: { + ID: '1iVQvTRMsPPyJzwol0ifH93QTQ6', + Name: 'MARKETO', + DisplayName: 'Marketo', + transformAt: 'processor', + transformAtV1: 'processor', + }, + Config: { + clientId: 'marketo_client_id_success', + clientSecret: 'marketo_client_secret_success', + accountId: 'marketo_acct_id_success', + staticListId: 1234, + }, + Enabled: true, + Transformations: [], + IsProcessorEnabled: true, + }, + message: { + userId: 'user 1', + anonymousId: 'anon-id-new', + event: 'event1', + type: 'audiencelist', + properties: { + listData: { + add: [ + { + 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, + }, + { + 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, + }, + ], + }, + enablePartialFailure: true, + }, + context: { + ip: '14.5.67.21', + library: { + name: 'http', + }, + }, + timestamp: '2020-02-02T00:23:09.544Z', + }, + metadata: { + jobId: 2, + }, + }, + { + destination: { + ID: '1zia9wKshXt80YksLmUdJnr7IHI', + Name: 'test_marketo', + DestinationDefinition: { + ID: '1iVQvTRMsPPyJzwol0ifH93QTQ6', + Name: 'MARKETO', + DisplayName: 'Marketo', + transformAt: 'processor', + transformAtV1: 'processor', + }, + Config: { + clientId: 'marketo_client_id_success', + clientSecret: 'marketo_client_secret_success', + accountId: 'marketo_acct_id_success', + staticListId: 1234, + }, + Enabled: true, + Transformations: [], + IsProcessorEnabled: true, + }, + message: { + userId: 'user 1', + anonymousId: 'anon-id-new', + event: 'event1', + type: 'track', + properties: { + listData: { + remove: [1], + }, + enablePartialFailure: true, + }, + context: { + ip: '14.5.67.21', + library: { + name: 'http', + }, + }, + timestamp: '2020-02-02T00:23:09.544Z', + }, + metadata: { + jobId: 3, + }, + }, + ], + destType: 'marketo_static_list', + }, + method: 'POST', + }, + }, + output: { + response: { + status: 200, + body: { + output: [ + { + batchedRequest: [ + { + version: '1', + type: 'REST', + method: 'POST', + endpoint: + 'https://marketo_acct_id_success.mktorest.com/rest/v1/lists/1234/leads.json?id=1&id=2&id=3', + headers: { + Authorization: 'Bearer access_token_success', + 'Content-Type': 'application/json', + }, + params: {}, + body: { + JSON: {}, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + }, + { + version: '1', + type: 'REST', + method: 'DELETE', + endpoint: + 'https://marketo_acct_id_success.mktorest.com/rest/v1/lists/1234/leads.json?id=4&id=5&id=6', + headers: { + Authorization: 'Bearer access_token_success', + 'Content-Type': 'application/json', + }, + params: {}, + body: { + JSON: {}, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + }, + ], + metadata: [ + { + destInfo: { + authKey: '1zia9wKshXt80YksLmUdJnr7IHI', + }, + jobId: 1, + }, + ], + batched: false, + statusCode: 200, + destination: { + ID: '1zia9wKshXt80YksLmUdJnr7IHI', + Name: 'test_marketo', + DestinationDefinition: { + ID: '1iVQvTRMsPPyJzwol0ifH93QTQ6', + Name: 'MARKETO', + DisplayName: 'Marketo', + transformAt: 'processor', + transformAtV1: 'processor', + }, + Config: { + clientId: 'marketo_client_id_success', + clientSecret: 'marketo_client_secret_success', + accountId: 'marketo_acct_id_success', + staticListId: 1234, + }, + Enabled: true, + Transformations: [], + IsProcessorEnabled: true, + }, + }, + { + batchedRequest: [ + { + version: '1', + 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', + headers: { + Authorization: 'Bearer access_token_success', + 'Content-Type': 'application/json', + }, + params: {}, + body: { + JSON: {}, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + }, + { + version: '1', + 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', + headers: { + Authorization: 'Bearer access_token_success', + 'Content-Type': 'application/json', + }, + params: {}, + body: { + JSON: {}, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + }, + ], + metadata: [ + { + destInfo: { + authKey: '1zia9wKshXt80YksLmUdJnr7IHI', + }, + jobId: 2, + }, + ], + batched: false, + statusCode: 200, + destination: { + ID: '1zia9wKshXt80YksLmUdJnr7IHI', + Name: 'test_marketo', + DestinationDefinition: { + ID: '1iVQvTRMsPPyJzwol0ifH93QTQ6', + Name: 'MARKETO', + DisplayName: 'Marketo', + transformAt: 'processor', + transformAtV1: 'processor', + }, + Config: { + clientId: 'marketo_client_id_success', + clientSecret: 'marketo_client_secret_success', + accountId: 'marketo_acct_id_success', + staticListId: 1234, + }, + Enabled: true, + Transformations: [], + IsProcessorEnabled: true, + }, + }, + { + metadata: [ + { + destInfo: { + authKey: '1zia9wKshXt80YksLmUdJnr7IHI', + }, + jobId: 3, + }, + ], + destination: { + ID: '1zia9wKshXt80YksLmUdJnr7IHI', + Name: 'test_marketo', + DestinationDefinition: { + ID: '1iVQvTRMsPPyJzwol0ifH93QTQ6', + Name: 'MARKETO', + DisplayName: 'Marketo', + transformAt: 'processor', + transformAtV1: 'processor', + }, + Config: { + clientId: 'marketo_client_id_success', + clientSecret: 'marketo_client_secret_success', + accountId: 'marketo_acct_id_success', + staticListId: 1234, + }, + Enabled: true, + Transformations: [], + IsProcessorEnabled: true, + }, + batched: false, + statusCode: 400, + error: 'Event type track is not supported', + statTags: { + errorCategory: 'dataValidation', + errorType: 'instrumentation', + }, + }, + ], + }, + }, + }, + }, +]; diff --git a/test/integrations/destinations/moengage/processor/data.ts b/test/integrations/destinations/moengage/processor/data.ts new file mode 100644 index 0000000000..50b0361381 --- /dev/null +++ b/test/integrations/destinations/moengage/processor/data.ts @@ -0,0 +1,2780 @@ +export const data = [ + { + name: 'moengage', + description: 'Test 0', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + 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', + }, + 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', + }, + { + 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: 'W0ZHNMPI2O4KHJ48ZILZACRA', + apiKey: 'dummyApiKey', + eventDelivery: false, + eventDeliveryTS: 1602757086384, + region: 'US', + }, + 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/W0ZHNMPI2O4KHJ48ZILZACRA', + headers: { + 'Content-Type': 'application/json', + 'MOE-APPKEY': 'W0ZHNMPI2O4KHJ48ZILZACRA', + Authorization: 'Basic VzBaSE5NUEkyTzRLSEo0OFpJTFpBQ1JBOmR1bW15QXBpS2V5', + }, + params: {}, + body: { + JSON: { + customer_id: 'rudder123', + type: 'event', + actions: [ + { + action: 'Order Completed', + attributes: { + category: 'some category', + 'originalArray[0].nested_field': 'nested value', + 'originalArray[0].tags[0]': 'tag_1', + 'originalArray[0].tags[1]': 'tag_2', + 'originalArray[0].tags[2]': 'tag_3', + 'originalArray[1].nested_field': 'nested value', + 'originalArray[1].tags[0]': 'tag_1', + 'originalArray[1].tags[1]': 'tag_2', + 'originalArray[1].tags[2]': 'tag_3', + 'originalArray[2].nested_field': 'nested value', + 'originalArray[2].tags[0]': 'tag_1', + 'originalArray[2].tags[1]': 'tag_2', + 'originalArray[2].tags[2]': 'tag_3', + 'originalArray[3].nested_field': 'nested value', + 'originalArray[3].tags[0]': 'tag_1', + 'originalArray[3].tags[1]': 'tag_2', + 'originalArray[3].tags[2]': 'tag_3', + 'originalArray[4].nested_field': 'nested value', + 'originalArray[4].tags[0]': 'tag_1', + 'originalArray[4].tags[1]': 'tag_2', + 'originalArray[4].tags[2]': 'tag_3', + 'originalArray[5].nested_field': 'nested value', + 'originalArray[5].tags[0]': 'tag_1', + 'originalArray[5].tags[1]': 'tag_2', + 'originalArray[5].tags[2]': 'tag_3', + 'originalArray[6].nested_field': 'nested value', + 'originalArray[6].tags[0]': 'tag_1', + 'originalArray[6].tags[1]': 'tag_2', + 'originalArray[6].tags[2]': 'tag_3', + 'originalArray[7].nested_field': 'nested value', + 'originalArray[7].tags[0]': 'tag_1', + 'originalArray[7].tags[1]': 'tag_2', + 'originalArray[7].tags[2]': 'tag_3', + 'originalArray[8].nested_field': 'nested value', + 'originalArray[8].tags[0]': 'tag_1', + 'originalArray[8].tags[1]': 'tag_2', + 'originalArray[8].tags[2]': 'tag_3', + checkout_id: 'what is checkout id here??', + coupon: 'APPARELSALE', + currency: 'GBP', + order_id: 'transactionId', + 'products[0].brand': '', + 'products[0].category': 'Merch', + 'products[0].currency': 'GBP', + 'products[0].image_url': 'https://www.example.com/product/bacon-jam.jpg', + 'products[0].name': 'Food/Drink', + 'products[0].position': 1, + 'products[0].price': 3, + 'products[0].product_id': 'product-bacon-jam', + 'products[0].quantity': 2, + 'products[0].sku': 'sku-1', + 'products[0].typeOfProduct': 'Food', + 'products[0].url': 'https://www.example.com/product/bacon-jam', + 'products[0].value': 6, + 'products[0].variant': 'Extra topped', + 'products[1].brand': 'Levis', + 'products[1].category': 'Merch', + 'products[1].currency': 'GBP', + 'products[1].image_url': 'https://www.example.com/product/t-shirt.jpg', + 'products[1].name': 'T-Shirt', + 'products[1].position': 2, + 'products[1].price': 12.99, + 'products[1].product_id': 'product-t-shirt', + 'products[1].quantity': 1, + 'products[1].sku': 'sku-2', + 'products[1].typeOfProduct': 'Shirt', + 'products[1].url': 'https://www.example.com/product/t-shirt', + 'products[1].value': 12.99, + 'products[1].variant': 'White', + 'products[2].brand': 'Levis', + 'products[2].category': 'Merch', + 'products[2].coupon': 'APPARELSALE', + 'products[2].currency': 'GBP', + 'products[2].image_url': + 'https://www.example.com/product/offer-t-shirt.jpg', + 'products[2].name': 'T-Shirt-on-offer', + 'products[2].position': 1, + 'products[2].price': 12.99, + 'products[2].product_id': 'offer-t-shirt', + 'products[2].quantity': 1, + 'products[2].sku': 'sku-3', + 'products[2].typeOfProduct': 'Shirt', + 'products[2].url': 'https://www.example.com/product/offer-t-shirt', + 'products[2].value': 12.99, + 'products[2].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: 32400, + platform: 'web', + }, + ], + }, + XML: {}, + JSON_ARRAY: {}, + FORM: {}, + }, + files: {}, + userId: '4eb021e9-a2af-4926-ae82-fe996d12f3c5', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'moengage', + description: 'Test 1', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + anonymousId: '4eb021e9-a2af-4926-ae82-fe996d12f3c5', + channel: 'web', + context: { + 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', + }, + integrations: { All: true }, + messageId: 'e108eb05-f6cd-4624-ba8c-568f2e2b3f92', + originalTimestamp: '2020-10-16T08:26:14.938Z', + receivedAt: '2020-10-16T13:56:14.945+05:30', + request_ip: '[::1]', + sentAt: '2020-10-16T08:26:14.939Z', + timestamp: '2020-10-16T13:56:14.944+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: 'W0ZHNMPI2O4KHJ48ZILZACRA', + apiKey: 'dummyApiKey', + eventDelivery: false, + eventDeliveryTS: 1602757086384, + region: 'US', + }, + 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', + created_time: 'Thu Mar 24 2016 17:46:45 GMT+0000 (UTC)', + }, + customer_id: 'rudder123', + }, + }, + type: 'REST', + files: {}, + method: 'POST', + params: {}, + userId: '4eb021e9-a2af-4926-ae82-fe996d12f3c5', + headers: { + 'MOE-APPKEY': 'W0ZHNMPI2O4KHJ48ZILZACRA', + 'Content-Type': 'application/json', + Authorization: 'Basic VzBaSE5NUEkyTzRLSEo0OFpJTFpBQ1JBOmR1bW15QXBpS2V5', + }, + version: '1', + endpoint: 'https://api-01.moengage.com/v1/customer/W0ZHNMPI2O4KHJ48ZILZACRA', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'moengage', + description: 'Test 2', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + anonymousId: '4eb021e9-a2af-4926-ae82-fe996d12f3c5', + channel: 'web', + context: { + 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 }, + 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 }, + traits: { + CID: '4eb021e9-a2af-4926-ae82-fe996d12f3c5', + RC_DATE: '2021-03-22T12:36:34Z', + RC_NO_OF_SKUS: 1, + RC_PN_SKU_LIST: '9317', + }, + messageId: 'e108eb05-f6cd-4624-ba8c-568f2e2b3f92', + originalTimestamp: '2020-10-16T08:26:14.938Z', + receivedAt: '2020-10-16T13:56:14.945+05:30', + request_ip: '[::1]', + sentAt: '2020-10-16T08:26:14.939Z', + timestamp: '2020-10-16T13:56:14.944+05:30', + type: 'identify', + }, + 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: 'W0ZHNMPI2O4KHJ48ZILZACRA', + apiKey: 'dummyApiKey', + eventDelivery: false, + eventDeliveryTS: 1602757086384, + region: 'US', + }, + Enabled: true, + Transformations: [], + IsProcessorEnabled: true, + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + body: { + XML: {}, + JSON_ARRAY: {}, + FORM: {}, + JSON: { + type: 'customer', + attributes: { + CID: '4eb021e9-a2af-4926-ae82-fe996d12f3c5', + RC_DATE: '2021-03-22T12:36:34Z', + RC_NO_OF_SKUS: 1, + RC_PN_SKU_LIST: '9317', + }, + customer_id: '4eb021e9-a2af-4926-ae82-fe996d12f3c5', + }, + }, + type: 'REST', + files: {}, + method: 'POST', + params: {}, + userId: '4eb021e9-a2af-4926-ae82-fe996d12f3c5', + headers: { + 'MOE-APPKEY': 'W0ZHNMPI2O4KHJ48ZILZACRA', + 'Content-Type': 'application/json', + Authorization: 'Basic VzBaSE5NUEkyTzRLSEo0OFpJTFpBQ1JBOmR1bW15QXBpS2V5', + }, + version: '1', + endpoint: 'https://api-01.moengage.com/v1/customer/W0ZHNMPI2O4KHJ48ZILZACRA', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'moengage', + description: 'Test 3', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + anonymousId: '4eb021e9-a2af-4926-ae82-fe996d12f3c5', + channel: 'web', + 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', + }, + 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: 'W0ZHNMPI2O4KHJ48ZILZACRA', + apiKey: 'dummyApiKey', + eventDelivery: false, + eventDeliveryTS: 1602757086384, + region: 'US', + }, + 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', + created_time: 'Thu Mar 24 2016 17:46:45 GMT+0000 (UTC)', + }, + customer_id: 'rudder123', + }, + }, + type: 'REST', + files: {}, + method: 'POST', + params: {}, + userId: '4eb021e9-a2af-4926-ae82-fe996d12f3c5', + headers: { + 'MOE-APPKEY': 'W0ZHNMPI2O4KHJ48ZILZACRA', + 'Content-Type': 'application/json', + Authorization: 'Basic VzBaSE5NUEkyTzRLSEo0OFpJTFpBQ1JBOmR1bW15QXBpS2V5', + }, + version: '1', + endpoint: 'https://api-01.moengage.com/v1/customer/W0ZHNMPI2O4KHJ48ZILZACRA', + }, + 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', + }, + customer_id: 'rudder123', + }, + }, + type: 'REST', + files: {}, + method: 'POST', + params: {}, + userId: '4eb021e9-a2af-4926-ae82-fe996d12f3c5', + headers: { + 'MOE-APPKEY': 'W0ZHNMPI2O4KHJ48ZILZACRA', + 'Content-Type': 'application/json', + Authorization: 'Basic VzBaSE5NUEkyTzRLSEo0OFpJTFpBQ1JBOmR1bW15QXBpS2V5', + }, + version: '1', + endpoint: 'https://api-01.moengage.com/v1/device/W0ZHNMPI2O4KHJ48ZILZACRA', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'moengage', + description: 'Test 4', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + anonymousId: '4eb021e9-a2af-4926-ae82-fe996d12f3c5', + channel: 'web', + context: { + 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', + }, + integrations: { All: true }, + messageId: 'a61357dd-e29e-4033-b1af-029625947fec', + originalTimestamp: '2020-10-16T09:05:11.001Z', + receivedAt: '2020-10-16T14:35:11.014+05:30', + request_ip: '[::1]', + sentAt: '2020-10-16T09:05:11.002Z', + timestamp: '2020-10-16T14:35:11.013+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: 'W0ZHNMPI2O4KHJ48ZILZACRA', + apiKey: 'dummyApiKey', + eventDelivery: false, + eventDeliveryTS: 1602757086384, + region: 'EU', + }, + 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', + created_time: 'Thu Mar 24 2016 17:46:45 GMT+0000 (UTC)', + }, + customer_id: 'rudder123', + }, + }, + type: 'REST', + files: {}, + method: 'POST', + params: {}, + userId: '4eb021e9-a2af-4926-ae82-fe996d12f3c5', + headers: { + 'MOE-APPKEY': 'W0ZHNMPI2O4KHJ48ZILZACRA', + 'Content-Type': 'application/json', + Authorization: 'Basic VzBaSE5NUEkyTzRLSEo0OFpJTFpBQ1JBOmR1bW15QXBpS2V5', + }, + version: '1', + endpoint: 'https://api-02.moengage.com/v1/customer/W0ZHNMPI2O4KHJ48ZILZACRA', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'moengage', + description: 'Test 5', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + anonymousId: '4eb021e9-a2af-4926-ae82-fe996d12f3c5', + channel: 'web', + context: { + 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', + }, + integrations: { All: true }, + messageId: '9eb2f7c0-d896-494e-b105-60f604ce2906', + originalTimestamp: '2020-10-16T09:09:31.465Z', + receivedAt: '2020-10-16T14:39:31.468+05:30', + request_ip: '[::1]', + sentAt: '2020-10-16T09:09:31.466Z', + timestamp: '2020-10-16T14:39:31.467+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: 'W0ZHNMPI2O4KHJ48ZILZACRA', + apiKey: 'dummyApiKey', + eventDelivery: false, + eventDeliveryTS: 1602757086384, + region: 'IND', + }, + 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', + created_time: 'Thu Mar 24 2016 17:46:45 GMT+0000 (UTC)', + }, + customer_id: 'rudder123', + }, + }, + type: 'REST', + files: {}, + method: 'POST', + params: {}, + userId: '4eb021e9-a2af-4926-ae82-fe996d12f3c5', + headers: { + 'MOE-APPKEY': 'W0ZHNMPI2O4KHJ48ZILZACRA', + 'Content-Type': 'application/json', + Authorization: 'Basic VzBaSE5NUEkyTzRLSEo0OFpJTFpBQ1JBOmR1bW15QXBpS2V5', + }, + version: '1', + endpoint: 'https://api-03.moengage.com/v1/customer/W0ZHNMPI2O4KHJ48ZILZACRA', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'moengage', + description: 'Test 6', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + anonymousId: '4eb021e9-a2af-4926-ae82-fe996d12f3c5', + channel: 'web', + context: { + 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', + }, + integrations: { All: true }, + messageId: '9eb2f7c0-d896-494e-b105-60f604ce2906', + originalTimestamp: '2020-10-16T09:09:31.465Z', + receivedAt: '2020-10-16T14:39:31.468+05:30', + request_ip: '[::1]', + sentAt: '2020-10-16T09:09:31.466Z', + timestamp: '2020-10-16T14:39:31.467+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: 'W0ZHNMPI2O4KHJ48ZILZACRA', + apiKey: 'dummyApiKey', + eventDelivery: false, + eventDeliveryTS: 1602757086384, + region: 'AMA', + }, + Enabled: true, + Transformations: [], + IsProcessorEnabled: true, + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + error: 'The region is not valid', + statTags: { + destType: 'MOENGAGE', + errorCategory: 'dataValidation', + errorType: 'configuration', + feature: 'processor', + implementation: 'native', + module: 'destination', + }, + statusCode: 400, + }, + ], + }, + }, + }, + { + name: 'moengage', + description: 'Test 7', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + anonymousId: '4eb021e9-a2af-4926-ae82-fe996d12f3c5', + channel: 'web', + context: { + 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', + }, + integrations: { All: true }, + messageId: '9eb2f7c0-d896-494e-b105-60f604ce2906', + originalTimestamp: '2020-10-16T09:09:31.465Z', + receivedAt: '2020-10-16T14:39:31.468+05:30', + request_ip: '[::1]', + sentAt: '2020-10-16T09:09:31.466Z', + timestamp: '2020-10-16T14:39:31.467+05:30', + 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: 'W0ZHNMPI2O4KHJ48ZILZACRA', + apiKey: 'dummyApiKey', + eventDelivery: false, + eventDeliveryTS: 1602757086384, + region: 'IND', + }, + Enabled: true, + Transformations: [], + IsProcessorEnabled: true, + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + error: 'Event type is required', + statTags: { + destType: 'MOENGAGE', + errorCategory: 'dataValidation', + errorType: 'instrumentation', + feature: 'processor', + implementation: 'native', + module: 'destination', + }, + statusCode: 400, + }, + ], + }, + }, + }, + { + name: 'moengage', + description: 'Test 8', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + anonymousId: '4eb021e9-a2af-4926-ae82-fe996d12f3c5', + channel: 'web', + context: { + 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', + }, + integrations: { All: true }, + messageId: '9eb2f7c0-d896-494e-b105-60f604ce2906', + originalTimestamp: '2020-10-16T09:09:31.465Z', + receivedAt: '2020-10-16T14:39:31.468+05:30', + request_ip: '[::1]', + sentAt: '2020-10-16T09:09:31.466Z', + timestamp: '2020-10-16T14:39:31.467+05:30', + type: 'gone', + 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: 'W0ZHNMPI2O4KHJ48ZILZACRA', + apiKey: 'dummyApiKey', + eventDelivery: false, + eventDeliveryTS: 1602757086384, + region: 'IND', + }, + Enabled: true, + Transformations: [], + IsProcessorEnabled: true, + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + error: 'Event type gone is not supported', + statTags: { + destType: 'MOENGAGE', + errorCategory: 'dataValidation', + errorType: 'instrumentation', + feature: 'processor', + implementation: 'native', + module: 'destination', + }, + statusCode: 400, + }, + ], + }, + }, + }, + { + name: 'moengage', + description: 'Test 9', + 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: 'W0ZHNMPI2O4KHJ48ZILZACRA', + apiKey: 'dummyApiKey', + eventDelivery: false, + eventDeliveryTS: 1602757086384, + region: 'US', + }, + 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/W0ZHNMPI2O4KHJ48ZILZACRA', + headers: { + 'Content-Type': 'application/json', + 'MOE-APPKEY': 'W0ZHNMPI2O4KHJ48ZILZACRA', + Authorization: 'Basic VzBaSE5NUEkyTzRLSEo0OFpJTFpBQ1JBOmR1bW15QXBpS2V5', + }, + 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[0].nested_field': 'nested value', + 'originalArray[0].tags[0]': 'tag_1', + 'originalArray[0].tags[1]': 'tag_2', + 'originalArray[0].tags[2]': 'tag_3', + 'originalArray[1].nested_field': 'nested value', + 'originalArray[1].tags[0]': 'tag_1', + 'originalArray[1].tags[1]': 'tag_2', + 'originalArray[1].tags[2]': 'tag_3', + 'originalArray[2].nested_field': 'nested value', + 'originalArray[2].tags[0]': 'tag_1', + 'originalArray[2].tags[1]': 'tag_2', + 'originalArray[2].tags[2]': 'tag_3', + 'originalArray[3].nested_field': 'nested value', + 'originalArray[3].tags[0]': 'tag_1', + 'originalArray[3].tags[1]': 'tag_2', + 'originalArray[3].tags[2]': 'tag_3', + 'originalArray[4].nested_field': 'nested value', + 'originalArray[4].tags[0]': 'tag_1', + 'originalArray[4].tags[1]': 'tag_2', + 'originalArray[4].tags[2]': 'tag_3', + 'originalArray[5].nested_field': 'nested value', + 'originalArray[5].tags[0]': 'tag_1', + 'originalArray[5].tags[1]': 'tag_2', + 'originalArray[5].tags[2]': 'tag_3', + 'originalArray[6].nested_field': 'nested value', + 'originalArray[6].tags[0]': 'tag_1', + 'originalArray[6].tags[1]': 'tag_2', + 'originalArray[6].tags[2]': 'tag_3', + 'originalArray[7].nested_field': 'nested value', + 'originalArray[7].tags[0]': 'tag_1', + 'originalArray[7].tags[1]': 'tag_2', + 'originalArray[7].tags[2]': 'tag_3', + 'originalArray[7].tags[3]': 'tag_1', + 'originalArray[7].tags[4]': 'tag_2', + 'originalArray[7].tags[5]': 'tag_3', + 'originalArray[8].nested_field': 'nested value', + 'originalArray[8].tags[0]': 'tag_1', + 'originalArray[8].tags[1]': 'tag_2', + 'originalArray[8].tags[2]': 'tag_3', + 'originalArray[8].tags[3]': 'tag_1', + 'originalArray[8].tags[4]': 'tag_2', + 'originalArray[8].tags[5]': 'tag_3', + 'products[0].brand': '', + 'products[0].category': 'Merch', + 'products[0].currency': 'GBP', + 'products[0].image_url': 'https://www.example.com/product/bacon-jam.jpg', + 'products[0].name': 'Food/Drink', + 'products[0].position': 1, + 'products[0].price': 3, + 'products[0].product_id': 'product-bacon-jam', + 'products[0].quantity': 2, + 'products[0].sku': 'sku-1', + 'products[0].typeOfProduct': 'Food', + 'products[0].url': 'https://www.example.com/product/bacon-jam', + 'products[0].value': 6, + 'products[0].variant': 'Extra topped', + 'products[1].brand': 'Levis', + 'products[1].category': 'Merch', + 'products[1].currency': 'GBP', + 'products[1].image_url': 'https://www.example.com/product/t-shirt.jpg', + 'products[1].name': 'T-Shirt', + 'products[1].position': 2, + 'products[1].price': 12.99, + 'products[1].product_id': 'product-t-shirt', + 'products[1].quantity': 1, + 'products[1].sku': 'sku-2', + 'products[1].typeOfProduct': 'Shirt', + 'products[1].url': 'https://www.example.com/product/t-shirt', + 'products[1].value': 12.99, + 'products[1].variant': 'White', + 'products[2].brand': 'Levis', + 'products[2].category': 'Merch', + 'products[2].coupon': 'APPARELSALE', + 'products[2].currency': 'GBP', + 'products[2].image_url': + 'https://www.example.com/product/offer-t-shirt.jpg', + 'products[2].name': 'T-Shirt-on-offer', + 'products[2].position': 1, + 'products[2].price': 12.99, + 'products[2].product_id': 'offer-t-shirt', + 'products[2].quantity': 1, + 'products[2].sku': 'sku-3', + 'products[2].typeOfProduct': 'Shirt', + 'products[2].url': 'https://www.example.com/product/offer-t-shirt', + 'products[2].value': 12.99, + 'products[2].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, + }, + ], + }, + }, + }, + { + name: 'moengage', + description: 'Test 10', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + 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', + }, + { + 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: 'W0ZHNMPI2O4KHJ48ZILZACRA', + apiKey: 'dummyApiKey', + eventDelivery: false, + eventDeliveryTS: 1602757086384, + region: 'US', + }, + 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/W0ZHNMPI2O4KHJ48ZILZACRA', + headers: { + 'Content-Type': 'application/json', + 'MOE-APPKEY': 'W0ZHNMPI2O4KHJ48ZILZACRA', + Authorization: 'Basic VzBaSE5NUEkyTzRLSEo0OFpJTFpBQ1JBOmR1bW15QXBpS2V5', + }, + 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', + 'products[0].brand': '', + 'products[0].category': 'Merch', + 'products[0].currency': 'GBP', + 'products[0].image_url': 'https://www.example.com/product/bacon-jam.jpg', + 'products[0].name': 'Food/Drink', + 'products[0].position': 1, + 'products[0].price': 3, + 'products[0].product_id': 'product-bacon-jam', + 'products[0].quantity': 2, + 'products[0].sku': 'sku-1', + 'products[0].typeOfProduct': 'Food', + 'products[0].url': 'https://www.example.com/product/bacon-jam', + 'products[0].value': 6, + 'products[0].variant': 'Extra topped', + 'products[1].brand': 'Levis', + 'products[1].category': 'Merch', + 'products[1].currency': 'GBP', + 'products[1].image_url': 'https://www.example.com/product/t-shirt.jpg', + 'products[1].name': 'T-Shirt', + 'products[1].position': 2, + 'products[1].price': 12.99, + 'products[1].product_id': 'product-t-shirt', + 'products[1].quantity': 1, + 'products[1].sku': 'sku-2', + 'products[1].typeOfProduct': 'Shirt', + 'products[1].url': 'https://www.example.com/product/t-shirt', + 'products[1].value': 12.99, + 'products[1].variant': 'White', + 'products[2].brand': 'Levis', + 'products[2].category': 'Merch', + 'products[2].coupon': 'APPARELSALE', + 'products[2].currency': 'GBP', + 'products[2].image_url': + 'https://www.example.com/product/offer-t-shirt.jpg', + 'products[2].name': 'T-Shirt-on-offer', + 'products[2].position': 1, + 'products[2].price': 12.99, + 'products[2].product_id': 'offer-t-shirt', + 'products[2].quantity': 1, + 'products[2].sku': 'sku-3', + 'products[2].typeOfProduct': 'Shirt', + 'products[2].url': 'https://www.example.com/product/offer-t-shirt', + 'products[2].value': 12.99, + 'products[2].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', + platform: 'web', + }, + ], + }, + XML: {}, + JSON_ARRAY: {}, + FORM: {}, + }, + files: {}, + userId: '4eb021e9-a2af-4926-ae82-fe996d12f3c5', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'moengage', + description: 'Test 11', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + anonymousId: '4eb021e9-a2af-4926-ae82-fe996d12f3c5', + channel: 'web', + context: { + app: { + build: '1.0.0', + name: 'RudderLabs JavaScript SDK', + namespace: 'com.rudderlabs.javascript', + version: '1.1.6', + }, + device: { + id: '7e32188a4dab669f', + manufacturer: 'Google', + model: 'AOSP on IA Emulator', + name: 'generic_x86_arm', + token: 'desuhere', + type: 'ipados', + }, + 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', + }, + 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: 'W0ZHNMPI2O4KHJ48ZILZACRA', + apiKey: 'dummyApiKey', + eventDelivery: false, + eventDeliveryTS: 1602757086384, + region: 'US', + }, + 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', + created_time: 'Thu Mar 24 2016 17:46:45 GMT+0000 (UTC)', + }, + customer_id: 'rudder123', + }, + }, + type: 'REST', + files: {}, + method: 'POST', + params: {}, + userId: '4eb021e9-a2af-4926-ae82-fe996d12f3c5', + headers: { + 'MOE-APPKEY': 'W0ZHNMPI2O4KHJ48ZILZACRA', + 'Content-Type': 'application/json', + Authorization: 'Basic VzBaSE5NUEkyTzRLSEo0OFpJTFpBQ1JBOmR1bW15QXBpS2V5', + }, + version: '1', + endpoint: 'https://api-01.moengage.com/v1/customer/W0ZHNMPI2O4KHJ48ZILZACRA', + }, + statusCode: 200, + }, + { + output: { + body: { + XML: {}, + JSON_ARRAY: {}, + FORM: {}, + JSON: { + type: 'device', + device_id: '7e32188a4dab669f', + attributes: { + model: 'AOSP on IA Emulator', + push_id: 'desuhere', + platform: 'iOS', + app_version: '1.1.6', + }, + customer_id: 'rudder123', + }, + }, + type: 'REST', + files: {}, + method: 'POST', + params: {}, + userId: '4eb021e9-a2af-4926-ae82-fe996d12f3c5', + headers: { + 'MOE-APPKEY': 'W0ZHNMPI2O4KHJ48ZILZACRA', + 'Content-Type': 'application/json', + Authorization: 'Basic VzBaSE5NUEkyTzRLSEo0OFpJTFpBQ1JBOmR1bW15QXBpS2V5', + }, + version: '1', + endpoint: 'https://api-01.moengage.com/v1/device/W0ZHNMPI2O4KHJ48ZILZACRA', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'moengage', + description: 'Test 12', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + 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: '' }, + device: { + id: '7e32188a4dab669f', + manufacturer: 'Google', + model: 'AOSP on IA Emulator', + name: 'generic_x86_arm', + token: 'desuhere', + type: 'ipados', + }, + 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', + }, + { + 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', + }, + ], + category: 'some category', + originalArray: [ + { nested_field: 'nested value', tags: ['tag_1', 'tag_2', 'tag_3'] }, + { nested_field: 'nested value', tags: ['tag_1'] }, + { nested_field: 'nested value' }, + ], + 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: 'W0ZHNMPI2O4KHJ48ZILZACRA', + apiKey: 'dummyApiKey', + eventDelivery: false, + eventDeliveryTS: 1602757086384, + region: 'US', + }, + 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/W0ZHNMPI2O4KHJ48ZILZACRA', + headers: { + 'Content-Type': 'application/json', + 'MOE-APPKEY': 'W0ZHNMPI2O4KHJ48ZILZACRA', + Authorization: 'Basic VzBaSE5NUEkyTzRLSEo0OFpJTFpBQ1JBOmR1bW15QXBpS2V5', + }, + params: {}, + body: { + JSON: { + customer_id: 'rudder123', + device_id: '7e32188a4dab669f', + type: 'event', + actions: [ + { + action: 'Order Completed', + attributes: { + checkout_id: 'what is checkout id here??', + coupon: 'APPARELSALE', + currency: 'GBP', + order_id: 'transactionId', + 'products[0].brand': '', + 'products[0].category': 'Merch', + 'products[0].currency': 'GBP', + 'products[0].image_url': 'https://www.example.com/product/bacon-jam.jpg', + 'products[0].name': 'Food/Drink', + 'products[0].position': 1, + 'products[0].price': 3, + 'products[0].product_id': 'product-bacon-jam', + 'products[0].quantity': 2, + 'products[0].sku': 'sku-1', + 'products[0].typeOfProduct': 'Food', + 'products[0].url': 'https://www.example.com/product/bacon-jam', + 'products[0].value': 6, + 'products[0].variant': 'Extra topped', + 'products[1].brand': 'Levis', + 'products[1].category': 'Merch', + 'products[1].currency': 'GBP', + 'products[1].image_url': 'https://www.example.com/product/t-shirt.jpg', + 'products[1].name': 'T-Shirt', + 'products[1].position': 2, + 'products[1].price': 12.99, + 'products[1].product_id': 'product-t-shirt', + 'products[1].quantity': 1, + 'products[1].sku': 'sku-2', + 'products[1].typeOfProduct': 'Shirt', + 'products[1].url': 'https://www.example.com/product/t-shirt', + 'products[1].value': 12.99, + 'products[1].variant': 'White', + 'products[2].brand': 'Levis', + 'products[2].category': 'Merch', + 'products[2].coupon': 'APPARELSALE', + 'products[2].currency': 'GBP', + 'products[2].image_url': + 'https://www.example.com/product/offer-t-shirt.jpg', + 'products[2].name': 'T-Shirt-on-offer', + 'products[2].position': 1, + 'products[2].price': 12.99, + 'products[2].product_id': 'offer-t-shirt', + 'products[2].quantity': 1, + 'products[2].sku': 'sku-3', + 'products[2].typeOfProduct': 'Shirt', + 'products[2].url': 'https://www.example.com/product/offer-t-shirt', + 'products[2].value': 12.99, + 'products[2].variant': 'Black', + revenue: 31.98, + shipping: 4, + value: 31.98, + 'originalArray[0].nested_field': 'nested value', + 'originalArray[0].tags[0]': 'tag_1', + 'originalArray[0].tags[1]': 'tag_2', + 'originalArray[0].tags[2]': 'tag_3', + 'originalArray[1].nested_field': 'nested value', + 'originalArray[1].tags[0]': 'tag_1', + 'originalArray[2].nested_field': 'nested value', + category: 'some category', + }, + platform: 'iOS', + app_version: '1.1.6', + current_time: '2020-10-16T13:40:12.791+05:30', + }, + ], + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + userId: '4eb021e9-a2af-4926-ae82-fe996d12f3c5', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'moengage', + description: 'Test 13', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + 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: '' }, + device: { + id: '7e32188a4dab669f', + manufacturer: 'Google', + model: 'AOSP on IA Emulator', + name: 'generic_x86_arm', + token: 'desuhere', + type: 'ipados', + }, + 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', + }, + { + 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', + }, + ], + category: 'some category', + originalArray: { + nested_field: 'nested value', + tags: ['tag_1', 'tag_2', 'tag_3'], + key1: { + nested_field: 'nested value', + key11: 'val11', + key12: 'val12', + key13: { k1: 'v1', k2: 'v2' }, + key2: {}, + key3: [], + }, + }, + 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: 'W0ZHNMPI2O4KHJ48ZILZACRA', + apiKey: 'dummyApiKey', + eventDelivery: false, + eventDeliveryTS: 1602757086384, + region: 'US', + }, + 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/W0ZHNMPI2O4KHJ48ZILZACRA', + headers: { + 'Content-Type': 'application/json', + 'MOE-APPKEY': 'W0ZHNMPI2O4KHJ48ZILZACRA', + Authorization: 'Basic VzBaSE5NUEkyTzRLSEo0OFpJTFpBQ1JBOmR1bW15QXBpS2V5', + }, + params: {}, + body: { + JSON: { + customer_id: 'rudder123', + device_id: '7e32188a4dab669f', + type: 'event', + actions: [ + { + action: 'Order Completed', + attributes: { + checkout_id: 'what is checkout id here??', + coupon: 'APPARELSALE', + currency: 'GBP', + order_id: 'transactionId', + 'products[0].brand': '', + 'products[0].category': 'Merch', + 'products[0].currency': 'GBP', + 'products[0].image_url': 'https://www.example.com/product/bacon-jam.jpg', + 'products[0].name': 'Food/Drink', + 'products[0].position': 1, + 'products[0].price': 3, + 'products[0].product_id': 'product-bacon-jam', + 'products[0].quantity': 2, + 'products[0].sku': 'sku-1', + 'products[0].typeOfProduct': 'Food', + 'products[0].url': 'https://www.example.com/product/bacon-jam', + 'products[0].value': 6, + 'products[0].variant': 'Extra topped', + 'products[1].brand': 'Levis', + 'products[1].category': 'Merch', + 'products[1].currency': 'GBP', + 'products[1].image_url': 'https://www.example.com/product/t-shirt.jpg', + 'products[1].name': 'T-Shirt', + 'products[1].position': 2, + 'products[1].price': 12.99, + 'products[1].product_id': 'product-t-shirt', + 'products[1].quantity': 1, + 'products[1].sku': 'sku-2', + 'products[1].typeOfProduct': 'Shirt', + 'products[1].url': 'https://www.example.com/product/t-shirt', + 'products[1].value': 12.99, + 'products[1].variant': 'White', + 'products[2].brand': 'Levis', + 'products[2].category': 'Merch', + 'products[2].coupon': 'APPARELSALE', + 'products[2].currency': 'GBP', + 'products[2].image_url': + 'https://www.example.com/product/offer-t-shirt.jpg', + 'products[2].name': 'T-Shirt-on-offer', + 'products[2].position': 1, + 'products[2].price': 12.99, + 'products[2].product_id': 'offer-t-shirt', + 'products[2].quantity': 1, + 'products[2].sku': 'sku-3', + 'products[2].typeOfProduct': 'Shirt', + 'products[2].url': 'https://www.example.com/product/offer-t-shirt', + 'products[2].value': 12.99, + 'products[2].variant': 'Black', + revenue: 31.98, + shipping: 4, + value: 31.98, + 'originalArray.key1.key11': 'val11', + 'originalArray.key1.key12': 'val12', + 'originalArray.key1.key13.k1': 'v1', + 'originalArray.key1.key13.k2': 'v2', + 'originalArray.key1.nested_field': 'nested value', + 'originalArray.nested_field': 'nested value', + 'originalArray.tags[0]': 'tag_1', + 'originalArray.tags[1]': 'tag_2', + 'originalArray.tags[2]': 'tag_3', + 'originalArray.key1.key2': {}, + 'originalArray.key1.key3': [], + category: 'some category', + }, + platform: 'iOS', + app_version: '1.1.6', + current_time: '2020-10-16T13:40:12.791+05:30', + }, + ], + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + userId: '4eb021e9-a2af-4926-ae82-fe996d12f3c5', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'moengage', + description: 'Test 14', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + messageId: 'adc7c2d0-0ebf-4593-b878-a0eb75932820', + originalTimestamp: '2023-03-09T00:09:53.235+05:30', + previousId: '4eb021e9-a2af-4926-ae82-fe996d12f3c5', + receivedAt: '2023-03-09T00:09:51.292+05:30', + request_ip: '[::1]', + rudderId: '1703da0d-2472-459c-9bf0-4e7b66b4673a', + sentAt: '2023-03-09T00:09:53.235+05:30', + timestamp: '2023-03-09T00:09:51.291+05:30', + type: 'alias', + userId: '12345', + }, + 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: 'W0ZHNMPI2O4KHJ48ZILZACRA', + apiKey: 'dummyApiKey', + eventDelivery: false, + eventDeliveryTS: 1602757086384, + region: 'US', + }, + Enabled: true, + Transformations: [], + IsProcessorEnabled: true, + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + body: { + XML: {}, + FORM: {}, + JSON: { + merge_data: [ + { merged_user: '4eb021e9-a2af-4926-ae82-fe996d12f3c5', retained_user: '12345' }, + ], + }, + JSON_ARRAY: {}, + }, + type: 'REST', + files: {}, + method: 'POST', + userId: '12345', + params: {}, + headers: { + 'Content-Type': 'application/json', + Authorization: 'Basic VzBaSE5NUEkyTzRLSEo0OFpJTFpBQ1JBOmR1bW15QXBpS2V5', + }, + version: '1', + endpoint: + 'https://api-01.moengage.com/v1/customer/merge?app_id=W0ZHNMPI2O4KHJ48ZILZACRA', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'moengage', + description: 'Test 15', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + messageId: 'adc7c2d0-0ebf-4593-b878-a0eb75932820', + originalTimestamp: '2023-03-09T00:09:53.235+05:30', + receivedAt: '2023-03-09T00:09:51.292+05:30', + request_ip: '[::1]', + rudderId: '1703da0d-2472-459c-9bf0-4e7b66b4673a', + sentAt: '2023-03-09T00:09:53.235+05:30', + timestamp: '2023-03-09T00:09:51.291+05:30', + type: 'alias', + userId: '12345', + }, + 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: 'W0ZHNMPI2O4KHJ48ZILZACRA', + apiKey: 'dummyApiKey', + eventDelivery: false, + eventDeliveryTS: 1602757086384, + region: 'US', + }, + Enabled: true, + Transformations: [], + IsProcessorEnabled: true, + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + error: 'Missing required value from "previousId"', + statTags: { + destType: 'MOENGAGE', + errorCategory: 'dataValidation', + errorType: 'instrumentation', + feature: 'processor', + implementation: 'native', + module: 'destination', + }, + statusCode: 400, + }, + ], + }, + }, + }, +]; diff --git a/test/integrations/destinations/moengage/router/data.ts b/test/integrations/destinations/moengage/router/data.ts new file mode 100644 index 0000000000..a5664906e5 --- /dev/null +++ b/test/integrations/destinations/moengage/router/data.ts @@ -0,0 +1,480 @@ +export const data = [ + { + name: 'moengage', + description: 'Test 0', + feature: 'router', + module: 'destination', + version: 'v0', + input: { + request: { + body: { + input: [ + { + message: { + 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', + }, + 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', + }, + { + 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', + }, + metadata: { + jobId: 1, + }, + 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: 'W0ZHNMPI2O4KHJ48ZILZACRA', + apiKey: 'dummyApiKey', + eventDelivery: false, + eventDeliveryTS: 1602757086384, + region: 'US', + }, + Enabled: true, + Transformations: [], + IsProcessorEnabled: true, + }, + }, + { + message: { + anonymousId: '4eb021e9-a2af-4926-ae82-fe996d12f3c5', + channel: 'web', + context: { + 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', + }, + integrations: { + All: true, + }, + messageId: 'e108eb05-f6cd-4624-ba8c-568f2e2b3f92', + originalTimestamp: '2020-10-16T08:26:14.938Z', + receivedAt: '2020-10-16T13:56:14.945+05:30', + request_ip: '[::1]', + sentAt: '2020-10-16T08:26:14.939Z', + timestamp: '2020-10-16T13:56:14.944+05:30', + type: 'identify', + userId: 'rudder123', + }, + metadata: { + jobId: 2, + }, + 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: 'W0ZHNMPI2O4KHJ48ZILZACRA', + apiKey: 'dummyApiKey', + eventDelivery: false, + eventDeliveryTS: 1602757086384, + region: 'US', + }, + Enabled: true, + Transformations: [], + IsProcessorEnabled: true, + }, + }, + ], + destType: 'moengage', + }, + method: 'POST', + }, + }, + output: { + response: { + status: 200, + body: { + output: [ + { + batchedRequest: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://api-01.moengage.com/v1/event/W0ZHNMPI2O4KHJ48ZILZACRA', + headers: { + 'Content-Type': 'application/json', + 'MOE-APPKEY': 'W0ZHNMPI2O4KHJ48ZILZACRA', + Authorization: 'Basic VzBaSE5NUEkyTzRLSEo0OFpJTFpBQ1JBOmR1bW15QXBpS2V5', + }, + 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', + 'products[0].brand': '', + 'products[0].category': 'Merch', + 'products[0].currency': 'GBP', + 'products[0].image_url': 'https://www.example.com/product/bacon-jam.jpg', + 'products[0].name': 'Food/Drink', + 'products[0].position': 1, + 'products[0].price': 3, + 'products[0].product_id': 'product-bacon-jam', + 'products[0].quantity': 2, + 'products[0].sku': 'sku-1', + 'products[0].typeOfProduct': 'Food', + 'products[0].url': 'https://www.example.com/product/bacon-jam', + 'products[0].value': 6, + 'products[0].variant': 'Extra topped', + 'products[1].brand': 'Levis', + 'products[1].category': 'Merch', + 'products[1].currency': 'GBP', + 'products[1].image_url': 'https://www.example.com/product/t-shirt.jpg', + 'products[1].name': 'T-Shirt', + 'products[1].position': 2, + 'products[1].price': 12.99, + 'products[1].product_id': 'product-t-shirt', + 'products[1].quantity': 1, + 'products[1].sku': 'sku-2', + 'products[1].typeOfProduct': 'Shirt', + 'products[1].url': 'https://www.example.com/product/t-shirt', + 'products[1].value': 12.99, + 'products[1].variant': 'White', + 'products[2].brand': 'Levis', + 'products[2].category': 'Merch', + 'products[2].coupon': 'APPARELSALE', + 'products[2].currency': 'GBP', + 'products[2].image_url': + 'https://www.example.com/product/offer-t-shirt.jpg', + 'products[2].name': 'T-Shirt-on-offer', + 'products[2].position': 1, + 'products[2].price': 12.99, + 'products[2].product_id': 'offer-t-shirt', + 'products[2].quantity': 1, + 'products[2].sku': 'sku-3', + 'products[2].typeOfProduct': 'Shirt', + 'products[2].url': 'https://www.example.com/product/offer-t-shirt', + 'products[2].value': 12.99, + 'products[2].variant': 'Black', + revenue: 31.98, + shipping: 4, + value: 31.98, + }, + platform: 'web', + app_version: '1.1.6', + current_time: '2020-10-16T13:40:12.791+05:30', + user_timezone_offset: 32400, + }, + ], + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + userId: '4eb021e9-a2af-4926-ae82-fe996d12f3c5', + }, + metadata: [ + { + jobId: 1, + }, + ], + batched: false, + statusCode: 200, + 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: 'W0ZHNMPI2O4KHJ48ZILZACRA', + apiKey: 'dummyApiKey', + eventDelivery: false, + eventDeliveryTS: 1602757086384, + region: 'US', + }, + Enabled: true, + Transformations: [], + IsProcessorEnabled: true, + }, + }, + { + batchedRequest: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://api-01.moengage.com/v1/customer/W0ZHNMPI2O4KHJ48ZILZACRA', + headers: { + 'Content-Type': 'application/json', + 'MOE-APPKEY': 'W0ZHNMPI2O4KHJ48ZILZACRA', + Authorization: 'Basic VzBaSE5NUEkyTzRLSEo0OFpJTFpBQ1JBOmR1bW15QXBpS2V5', + }, + params: {}, + body: { + JSON: { + customer_id: 'rudder123', + type: 'customer', + attributes: { + name: 'Rudder Test', + email: 'rudderTest@gmail.com', + created_time: 'Thu Mar 24 2016 17:46:45 GMT+0000 (UTC)', + 'company.id': 'abc123', + createdAt: 'Thu Mar 24 2016 17:46:45 GMT+0000 (UTC)', + plan: 'Enterprise', + }, + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + userId: '4eb021e9-a2af-4926-ae82-fe996d12f3c5', + }, + metadata: [ + { + jobId: 2, + }, + ], + batched: false, + statusCode: 200, + 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: 'W0ZHNMPI2O4KHJ48ZILZACRA', + apiKey: 'dummyApiKey', + eventDelivery: false, + eventDeliveryTS: 1602757086384, + region: 'US', + }, + Enabled: true, + Transformations: [], + IsProcessorEnabled: true, + }, + }, + ], + }, + }, + }, + }, +]; diff --git a/test/integrations/destinations/monetate/processor/data.ts b/test/integrations/destinations/monetate/processor/data.ts new file mode 100644 index 0000000000..2202ab2b25 --- /dev/null +++ b/test/integrations/destinations/monetate/processor/data.ts @@ -0,0 +1,2796 @@ +export const data = [ + { + name: 'monetate', + description: 'Test 0', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + anonymousId: 'c82cbdff-e5be-4009-ac78-cdeea09ab4b1', + context: { + screen: { height: 22, width: 11 }, + device: { + id: 'df16bffa-5c3d-4fbb-9bce-3bab098129a7R', + manufacturer: 'Xiaomi', + model: 'Redmi 6', + name: 'xiaomi', + }, + network: { carrier: 'Banglalink' }, + os: { name: 'android', version: '8.1.0' }, + traits: { + address: { city: 'Dhaka', country: 'Bangladesh' }, + anonymousId: 'c82cbdff-e5be-4009-ac78-cdeea09ab4b1', + }, + ip: '0.0.0.0', + }, + traits: { address: { city: 'Kol', country: 'Ind' } }, + event: 'Product Viewed', + integrations: { All: true }, + message_id: 'a80f82be-9bdc-4a9f-b2a5-15621ee41df8', + properties: { monetateId: '1234', product_id: 'prodId' }, + timestamp: '2019-09-01T15:46:51.693229+05:30', + type: 'track', + userId: 'newUser', + }, + destination: { + Config: { + monetateChannel: 'channel', + retailerShortName: 'retailer', + apiKey: 'api-key', + }, + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://engine.monetate.net/api/engine/v1/decide/retailer', + headers: { 'Content-Type': 'application/json' }, + params: {}, + body: { + JSON: { + monetateId: '1234', + events: [ + { eventType: 'monetate:context:IpAddress', ipAddress: '0.0.0.0' }, + { eventType: 'monetate:context:ScreenSize', height: 22, width: 11 }, + { + eventType: 'monetate:context:ProductDetailView', + products: [{ productId: 'prodId', sku: '' }], + }, + ], + customerId: 'newUser', + channel: 'channel', + }, + XML: {}, + JSON_ARRAY: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'monetate', + description: 'Test 1', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + anonymousId: 'c82cbdff-e5be-4009-ac78-cdeea09ab4b1', + context: { + screen: { height: 22, width: 11 }, + device: { + id: 'df16bffa-5c3d-4fbb-9bce-3bab098129a7R', + manufacturer: 'Xiaomi', + model: 'Redmi 6', + name: 'xiaomi', + }, + network: { carrier: 'Banglalink' }, + os: { name: 'android', version: '8.1.0' }, + traits: { + address: { city: 'Dhaka', country: 'Bangladesh' }, + anonymousId: 'c82cbdff-e5be-4009-ac78-cdeea09ab4b1', + }, + ip: '0.0.0.0', + }, + traits: { address: { city: 'Kol', country: 'Ind' } }, + event: 'Product Viewed', + integrations: { All: true }, + message_id: 'a80f82be-9bdc-4a9f-b2a5-15621ee41df8', + properties: { monetateId: '1234' }, + timestamp: '2019-09-01T15:46:51.693229+05:30', + type: 'track', + userId: 'newUser', + }, + destination: { + Config: { + monetateChannel: 'channel', + retailerShortName: 'retailer', + apiKey: 'api-key', + }, + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + error: "'product_id' is a required field for Product Viewed", + statTags: { + destType: 'MONETATE', + errorCategory: 'dataValidation', + errorType: 'instrumentation', + feature: 'processor', + implementation: 'native', + module: 'destination', + }, + statusCode: 400, + }, + ], + }, + }, + }, + { + name: 'monetate', + description: 'Test 2', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + anonymousId: 'c82cbdff-e5be-4009-ac78-cdeea09ab4b1', + context: { + screen: { height: 22, width: 11 }, + device: { + id: 'df16bffa-5c3d-4fbb-9bce-3bab098129a7R', + manufacturer: 'Xiaomi', + model: 'Redmi 6', + name: 'xiaomi', + }, + network: { carrier: 'Banglalink' }, + os: { name: 'android', version: '8.1.0' }, + traits: { + address: { city: 'Dhaka', country: 'Bangladesh' }, + anonymousId: 'c82cbdff-e5be-4009-ac78-cdeea09ab4b1', + }, + ip: '0.0.0.0', + }, + traits: { address: { city: 'Kol', country: 'Ind' } }, + event: 'Product List Viewed', + integrations: { All: true }, + message_id: 'a80f82be-9bdc-4a9f-b2a5-15621ee41df8', + properties: { monetateId: '1234', products: [{ product_id: 1 }, { product_id: 2 }] }, + timestamp: '2019-09-01T15:46:51.693229+05:30', + type: 'track', + userId: 'newUser', + }, + destination: { + Config: { + monetateChannel: 'channel', + retailerShortName: 'retailer', + apiKey: 'api-key', + }, + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://engine.monetate.net/api/engine/v1/decide/retailer', + headers: { 'Content-Type': 'application/json' }, + params: {}, + body: { + JSON: { + monetateId: '1234', + events: [ + { eventType: 'monetate:context:IpAddress', ipAddress: '0.0.0.0' }, + { eventType: 'monetate:context:ScreenSize', height: 22, width: 11 }, + { eventType: 'monetate:context:ProductThumbnailView', products: ['1', '2'] }, + ], + customerId: 'newUser', + channel: 'channel', + }, + XML: {}, + JSON_ARRAY: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'monetate', + description: 'Test 3', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + anonymousId: 'c82cbdff-e5be-4009-ac78-cdeea09ab4b1', + context: { + screen: { height: 22, width: 11 }, + device: { + id: 'df16bffa-5c3d-4fbb-9bce-3bab098129a7R', + manufacturer: 'Xiaomi', + model: 'Redmi 6', + name: 'xiaomi', + }, + network: { carrier: 'Banglalink' }, + os: { name: 'android', version: '8.1.0' }, + traits: { + address: { city: 'Dhaka', country: 'Bangladesh' }, + anonymousId: 'c82cbdff-e5be-4009-ac78-cdeea09ab4b1', + }, + ip: '0.0.0.0', + }, + traits: { address: { city: 'Kol', country: 'Ind' } }, + event: 'Product Added', + integrations: { All: true }, + message_id: 'a80f82be-9bdc-4a9f-b2a5-15621ee41df8', + properties: { + monetateId: '1234', + currency: 'INR', + product_id: 1, + quantity: 1, + cart_value: 250, + sku: 'sku', + }, + timestamp: '2019-09-01T15:46:51.693229+05:30', + type: 'track', + userId: 'newUser', + }, + destination: { + Config: { + monetateChannel: 'channel', + retailerShortName: 'retailer', + apiKey: 'api-key', + }, + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://engine.monetate.net/api/engine/v1/decide/retailer', + headers: { 'Content-Type': 'application/json' }, + params: {}, + body: { + JSON: { + monetateId: '1234', + events: [ + { eventType: 'monetate:context:IpAddress', ipAddress: '0.0.0.0' }, + { eventType: 'monetate:context:ScreenSize', height: 22, width: 11 }, + { + eventType: 'monetate:context:Cart', + cartLines: [ + { pid: '1', sku: 'sku', quantity: 1, value: '250', currency: 'INR' }, + ], + }, + ], + customerId: 'newUser', + channel: 'channel', + }, + XML: {}, + JSON_ARRAY: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'monetate', + description: 'Test 4', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + anonymousId: 'c82cbdff-e5be-4009-ac78-cdeea09ab4b1', + context: { + screen: { height: 22, width: 11 }, + device: { + id: 'df16bffa-5c3d-4fbb-9bce-3bab098129a7R', + manufacturer: 'Xiaomi', + model: 'Redmi 6', + name: 'xiaomi', + }, + network: { carrier: 'Banglalink' }, + os: { name: 'android', version: '8.1.0' }, + traits: { + address: { city: 'Dhaka', country: 'Bangladesh' }, + anonymousId: 'c82cbdff-e5be-4009-ac78-cdeea09ab4b1', + }, + ip: '0.0.0.0', + }, + traits: { address: { city: 'Kol', country: 'Ind' } }, + event: 'Signed Up', + integrations: { All: true }, + message_id: 'a80f82be-9bdc-4a9f-b2a5-15621ee41df8', + properties: { plan: 'trial', source: 'social' }, + timestamp: '2019-09-01T15:46:51.693229+05:30', + type: 'track', + userId: 'newUser', + }, + destination: { + Config: { + monetateChannel: 'channel', + retailerShortName: 'retailer', + apiKey: 'api-key', + }, + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://engine.monetate.net/api/engine/v1/decide/retailer', + headers: { 'Content-Type': 'application/json' }, + params: {}, + body: { + JSON: { + events: [ + { eventType: 'monetate:context:IpAddress', ipAddress: '0.0.0.0' }, + { eventType: 'monetate:context:ScreenSize', height: 22, width: 11 }, + ], + customerId: 'newUser', + channel: 'channel', + }, + XML: {}, + JSON_ARRAY: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'monetate', + description: 'Test 5', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + anonymousId: 'c82cbdff-e5be-4009-ac78-cdeea09ab4b1', + context: { + screen: { height: 22, width: 11 }, + device: { + id: 'df16bffa-5c3d-4fbb-9bce-3bab098129a7R', + manufacturer: 'Xiaomi', + model: 'Redmi 6', + name: 'xiaomi', + }, + network: { carrier: 'Banglalink' }, + os: { name: 'android', version: '8.1.0' }, + traits: { + address: { city: 'Dhaka', country: 'Bangladesh' }, + anonymousId: 'c82cbdff-e5be-4009-ac78-cdeea09ab4b1', + }, + ip: '0.0.0.0', + }, + traits: { address: { city: 'Kol', country: 'Ind' } }, + name: 'Homepage', + integrations: { All: true }, + message_id: 'a80f82be-9bdc-4a9f-b2a5-15621ee41df8', + properties: { + page: { + url: 'https://example.com/homepage', + path: '/homepage', + referrer: 'https://google.com', + }, + }, + timestamp: '2019-09-01T15:46:51.693229+05:30', + type: 'screen', + userId: 'newUser', + }, + destination: { + Config: { + monetateChannel: 'channel', + retailerShortName: 'retailer', + apiKey: 'api-key', + }, + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://engine.monetate.net/api/engine/v1/decide/retailer', + headers: { 'Content-Type': 'application/json' }, + params: {}, + body: { + JSON: { + events: [{ eventType: 'monetate:context:ScreenSize', height: 22, width: 11 }], + channel: 'channel', + }, + XML: {}, + JSON_ARRAY: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'monetate', + description: 'Test 6', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + anonymousId: 'c82cbdff-e5be-4009-ac78-cdeea09ab4b1', + context: { + screen: { height: 22, width: 11 }, + device: { + id: 'df16bffa-5c3d-4fbb-9bce-3bab098129a7R', + manufacturer: 'Xiaomi', + model: 'Redmi 6', + name: 'xiaomi', + }, + network: { carrier: 'Banglalink' }, + os: { name: 'android', version: '8.1.0' }, + traits: { + address: { city: 'Dhaka', country: 'Bangladesh' }, + anonymousId: 'c82cbdff-e5be-4009-ac78-cdeea09ab4b1', + }, + ip: '0.0.0.0', + }, + traits: { address: { city: 'Kol', country: 'Ind' } }, + name: 'Homepage', + integrations: { All: true }, + message_id: 'a80f82be-9bdc-4a9f-b2a5-15621ee41df8', + properties: { + page: { + url: 'https://example.com/homepage', + path: '/homepage', + referrer: 'https://google.com', + category: 'category', + }, + }, + timestamp: '2019-09-01T15:46:51.693229+05:30', + type: 'page', + userId: 'newUser', + }, + destination: { + Config: { + monetateChannel: 'channel', + retailerShortName: 'retailer', + apiKey: 'api-key', + }, + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://engine.monetate.net/api/engine/v1/decide/retailer', + headers: { 'Content-Type': 'application/json' }, + params: {}, + body: { + JSON: { + events: [ + { + eventType: 'monetate:context:PageView', + url: 'https://example.com/homepage', + path: '/homepage', + categories: ['category'], + }, + { eventType: 'monetate:context:Referrer', referrer: 'https://google.com' }, + ], + channel: 'channel', + }, + XML: {}, + JSON_ARRAY: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'monetate', + description: 'Test 7', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + anonymousId: 'c82cbdff-e5be-4009-ac78-cdeea09ab4b1', + context: { + screen: { height: 22, width: 11 }, + device: { + id: 'df16bffa-5c3d-4fbb-9bce-3bab098129a7R', + manufacturer: 'Xiaomi', + model: 'Redmi 6', + name: 'xiaomi', + }, + network: { carrier: 'Banglalink' }, + os: { name: 'android', version: '8.1.0' }, + traits: { + address: { city: 'Dhaka', country: 'Bangladesh' }, + anonymousId: 'c82cbdff-e5be-4009-ac78-cdeea09ab4b1', + }, + page: { url: 'https://example.com/homepage', referrer: 'https://google.com' }, + ip: '0.0.0.0', + }, + traits: { address: { city: 'Kol', country: 'Ind' } }, + name: 'Homepage', + integrations: { All: true }, + message_id: 'a80f82be-9bdc-4a9f-b2a5-15621ee41df8', + properties: { + path: '/homepage', + referrer: 'https://google.com', + url: 'https://example.com/homepage', + }, + timestamp: '2019-09-01T15:46:51.693229+05:30', + type: 'page', + userId: 'newUser', + }, + destination: { + Config: { + monetateChannel: 'channel', + retailerShortName: 'retailer', + apiKey: 'api-key', + }, + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://engine.monetate.net/api/engine/v1/decide/retailer', + headers: { 'Content-Type': 'application/json' }, + params: {}, + body: { + JSON: { + events: [ + { eventType: 'monetate:context:PageView', url: 'https://example.com/homepage' }, + { eventType: 'monetate:context:Referrer', referrer: 'https://google.com' }, + ], + channel: 'channel', + }, + XML: {}, + JSON_ARRAY: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'monetate', + description: 'Test 8', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + anonymousId: 'c82cbdff-e5be-4009-ac78-cdeea09ab4b1', + context: { + screen: { height: 22, width: 11 }, + device: { + id: 'df16bffa-5c3d-4fbb-9bce-3bab098129a7R', + manufacturer: 'Xiaomi', + model: 'Redmi 6', + name: 'xiaomi', + }, + network: { carrier: 'Banglalink' }, + os: { name: 'android', version: '8.1.0' }, + traits: { + address: { city: 'Dhaka', country: 'Bangladesh' }, + anonymousId: 'c82cbdff-e5be-4009-ac78-cdeea09ab4b1', + }, + ip: '0.0.0.0', + }, + traits: { address: { city: 'Kol', country: 'Ind' } }, + event: 'Product Added', + integrations: { All: true }, + message_id: 'a80f82be-9bdc-4a9f-b2a5-15621ee41df8', + properties: { + currency: 'INR', + product_id: 1, + quantity: 1, + cart_value: 250, + page: { + url: 'url', + path: 'path', + category: 'category', + breadcrumbs: 'breadcrumbs', + }, + }, + timestamp: '2019-09-01T15:46:51.693229+05:30', + type: 'track', + userId: 'newUser', + }, + destination: { Config: { retailerShortName: 'retailer', apiKey: 'api-key' } }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://engine.monetate.net/api/engine/v1/decide/retailer', + headers: { 'Content-Type': 'application/json' }, + params: {}, + body: { + JSON: { + events: [ + { eventType: 'monetate:context:IpAddress', ipAddress: '0.0.0.0' }, + { + eventType: 'monetate:context:PageView', + url: 'url', + path: 'path', + categories: ['category'], + breadcrumbs: ['breadcrumbs'], + }, + { eventType: 'monetate:context:ScreenSize', height: 22, width: 11 }, + { + eventType: 'monetate:context:Cart', + cartLines: [ + { pid: '1', sku: '', quantity: 1, value: '250', currency: 'INR' }, + ], + }, + ], + customerId: 'newUser', + }, + XML: {}, + JSON_ARRAY: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'monetate', + description: 'Test 9', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + type: 'identify', + sentAt: '2020-09-03T05:48:50.813Z', + userId: 'user101', + channel: 'web', + context: { + os: { name: '', version: '' }, + app: { + name: 'RudderLabs JavaScript SDK', + build: '1.0.0', + version: '1.1.3', + namespace: 'com.rudderlabs.javascript', + }, + page: { + url: 'http://localhost:1111/monetateRudder.html', + path: '/monetateRudder.html', + title: 'MIxpanel Test', + search: '', + referrer: 'http://localhost:1111/', + }, + locale: 'en-GB', + screen: { density: 2.5 }, + traits: { city: 'Bangalore', name: 'Manashi', country: 'India' }, + library: { name: 'RudderLabs JavaScript SDK', version: '1.1.3' }, + userAgent: + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36', + }, + messageId: 'ab1bb13b-037e-4269-b7ce-79262fbfd964', + anonymousId: + 'RudderEncrypt:U2FsdGVkX19Iqki3tnJjjeUzFWOegZjPY3iYQOPJJSQaTUxTWedGBeEOyFE/hfddGtmaZJnf/HBtc/EDoRjKEA==', + integrations: { All: true }, + originalTimestamp: '2020-09-03T05:48:50.813Z', + }, + destination: { + Config: { + monetateChannel: 'channel', + retailerShortName: 'retailer', + apiKey: 'api-key', + }, + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + error: 'Event type identify is not supported', + statTags: { + destType: 'MONETATE', + errorCategory: 'dataValidation', + errorType: 'instrumentation', + feature: 'processor', + implementation: 'native', + module: 'destination', + }, + statusCode: 400, + }, + ], + }, + }, + }, + { + name: 'monetate', + description: 'Test 10', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + type: 'track', + event: 'Product Added', + sentAt: '2020-09-03T05:48:50.815Z', + userId: 'user101', + channel: 'web', + context: { + ip: '11.0.0.0', + os: { name: '', version: '' }, + app: { + name: 'RudderLabs JavaScript SDK', + build: '1.0.0', + version: '1.1.3', + namespace: 'com.rudderlabs.javascript', + }, + page: { + url: 'http://localhost:1111/monetateRudder.html', + path: '/monetateRudder.html', + title: 'MIxpanel Test', + search: '', + referrer: 'http://localhost:1111/', + }, + locale: 'en-GB', + screen: { density: 2.5 }, + traits: { city: 'Bangalore', name: 'Manashi', country: 'India' }, + library: { name: 'RudderLabs JavaScript SDK', version: '1.1.3' }, + userAgent: + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36', + }, + messageId: '0189ef26-5b64-47af-bd4a-f369155b74b0', + properties: { cart_value: 30, product_id: 'pp10001900011', user_actual_id: 12345 }, + anonymousId: 'anony11111111', + integrations: { All: true }, + originalTimestamp: '2020-09-03T05:48:50.814Z', + }, + destination: { + Config: { + monetateChannel: 'channel', + retailerShortName: 'retailer', + apiKey: 'api-key', + }, + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + error: + "'product_id', 'quantity', 'cart_value' are required fields and 'quantity' should be a number for Product Added", + statTags: { + destType: 'MONETATE', + errorCategory: 'dataValidation', + errorType: 'instrumentation', + feature: 'processor', + implementation: 'native', + module: 'destination', + }, + statusCode: 400, + }, + ], + }, + }, + }, + { + name: 'monetate', + description: 'Test 11', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + name: 'Home Page', + type: 'page', + sentAt: '2020-09-03T05:48:50.816Z', + userId: 'user101', + channel: 'web', + context: { + os: { name: '', version: '' }, + app: { + name: 'RudderLabs JavaScript SDK', + build: '1.0.0', + version: '1.1.3', + namespace: 'com.rudderlabs.javascript', + }, + page: { + url: 'https://google.com', + path: 'https://google.com', + title: 'MIxpanel Test', + search: '', + referrer: 'google', + }, + locale: 'en-GB', + screen: { density: 2.5 }, + traits: { city: 'Bangalore', name: 'Manashi', country: 'India' }, + library: { name: 'RudderLabs JavaScript SDK', version: '1.1.3' }, + userAgent: + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36', + }, + messageId: '1d263f9b-d5e9-4a3b-ae4a-403129ef9b7c', + properties: { + url: 'https://google.com', + name: 'Home Page', + path: 'https://google.com', + title: 'MIxpanel Test', + search: '', + referrer: 'google', + }, + anonymousId: + 'RudderEncrypt:U2FsdGVkX19Iqki3tnJjjeUzFWOegZjPY3iYQOPJJSQaTUxTWedGBeEOyFE/hfddGtmaZJnf/HBtc/EDoRjKEA==', + integrations: { All: true }, + originalTimestamp: '2020-09-03T05:48:50.816Z', + }, + destination: { + Config: { + monetateChannel: 'channel', + retailerShortName: 'retailer', + apiKey: 'api-key', + }, + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://engine.monetate.net/api/engine/v1/decide/retailer', + headers: { 'Content-Type': 'application/json' }, + params: {}, + body: { + JSON: { + events: [ + { + eventType: 'monetate:context:PageView', + url: 'https://google.com', + path: 'https://google.com', + }, + { eventType: 'monetate:context:Referrer', referrer: 'google' }, + ], + channel: 'channel', + }, + XML: {}, + JSON_ARRAY: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'monetate', + description: 'Test 12', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + name: 'Login Page Name', + type: 'page', + sentAt: '2020-09-03T05:48:50.820Z', + userId: 'user202', + channel: 'web', + context: { + ip: '22.0.0.0', + os: { name: '', version: '' }, + app: { + name: 'RudderLabs JavaScript SDK', + build: '1.0.0', + version: '1.1.3', + namespace: 'com.rudderlabs.javascript', + }, + page: { + url: 'https://geeks.com', + path: 'https://geeks.com', + title: 'LOGIN PAGE OF GEEKSFORGEEKS', + search: '', + referrer: 'geeksforgeeks', + }, + locale: 'en-GB', + screen: { density: 2.5 }, + traits: { email: 'rudder@mysite.com' }, + userId: 'user202', + library: { name: 'RudderLabs JavaScript SDK', version: '1.1.3' }, + userAgent: + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36', + }, + category: 'Login Category', + messageId: '8073f133-14cc-4b6b-8043-9e5bb8d17698', + properties: { + url: 'https://geeks.com', + name: 'Login Page Name', + path: 'https://geeks.com', + title: 'LOGIN PAGE OF GEEKSFORGEEKS', + search: '', + category: 'Login Category', + referrer: 'geeksforgeeks', + }, + anonymousId: + 'RudderEncrypt:U2FsdGVkX19Iqki3tnJjjeUzFWOegZjPY3iYQOPJJSQaTUxTWedGBeEOyFE/hfddGtmaZJnf/HBtc/EDoRjKEA==', + integrations: { All: true }, + originalTimestamp: '2020-09-03T05:48:50.819Z', + }, + destination: { + Config: { + monetateChannel: 'channel', + retailerShortName: 'retailer', + apiKey: 'api-key', + }, + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://engine.monetate.net/api/engine/v1/decide/retailer', + headers: { 'Content-Type': 'application/json' }, + params: {}, + body: { + JSON: { + events: [ + { + eventType: 'monetate:context:PageView', + url: 'https://geeks.com', + path: 'https://geeks.com', + }, + { eventType: 'monetate:context:Referrer', referrer: 'geeksforgeeks' }, + ], + channel: 'channel', + }, + XML: {}, + JSON_ARRAY: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'monetate', + description: 'Test 13', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + type: 'track', + event: 'Cart Viewed', + sentAt: '2020-09-03T05:48:50.820Z', + userId: 'user202', + channel: 'web', + context: { + ip: '22.0.0.0', + os: { name: '', version: '' }, + app: { + name: 'RudderLabs JavaScript SDK', + build: '1.0.0', + version: '1.1.3', + namespace: 'com.rudderlabs.javascript', + }, + page: { + url: 'http://localhost:1111/monetateRudder.html', + path: '/monetateRudder.html', + title: 'MIxpanel Test', + search: '', + referrer: 'http://localhost:1111/', + }, + locale: 'en-GB', + screen: { density: 2.5 }, + traits: { email: 'rudder@mysite.com' }, + library: { name: 'RudderLabs JavaScript SDK', version: '1.1.3' }, + userAgent: + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36', + }, + messageId: '21e78620-748a-4c1c-8570-385206fc61d6', + properties: { + products: [ + { + details: 'Apple iphone 7', + currency: 'INR', + quantity: '1', + product_id: 'p2022222', + }, + { price: '90', details: 'Apple iphone 8', quantity: '2', product_id: 'p201111' }, + ], + }, + anonymousId: 'anony222222222', + integrations: { All: true }, + originalTimestamp: '2020-09-03T05:48:50.820Z', + }, + destination: { + Config: { + monetateChannel: 'channel', + retailerShortName: 'retailer', + apiKey: 'api-key', + }, + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + error: + "'quantity', 'price' and 'product_id' are required fields and 'quantity' and 'price' should be a number for all products for Cart Viewed", + statTags: { + destType: 'MONETATE', + errorCategory: 'dataValidation', + errorType: 'instrumentation', + feature: 'processor', + implementation: 'native', + module: 'destination', + }, + statusCode: 400, + }, + ], + }, + }, + }, + { + name: 'monetate', + description: 'Test 14', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + type: 'track', + event: 'cutom event track call', + sentAt: '2020-09-03T05:48:50.821Z', + userId: 'user202', + channel: 'web', + context: { + ip: '11.0.0.0', + os: { name: '', version: '' }, + app: { + name: 'RudderLabs JavaScript SDK', + build: '1.0.0', + version: '1.1.3', + namespace: 'com.rudderlabs.javascript', + }, + page: { + url: 'http://localhost:1111/monetateRudder.html', + path: '/monetateRudder.html', + title: 'MIxpanel Test', + search: '', + referrer: 'http://localhost:1111/', + }, + locale: 'en-GB', + screen: { density: 2.5 }, + traits: { email: 'rudder@mysite.com' }, + userId: 'user101', + library: { name: 'RudderLabs JavaScript SDK', version: '1.1.3' }, + userAgent: + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36', + }, + messageId: 'be896347-8e93-4e11-8d0a-67f08b33d969', + properties: { details: 'this is custom trackl call' }, + anonymousId: + 'RudderEncrypt:U2FsdGVkX19Iqki3tnJjjeUzFWOegZjPY3iYQOPJJSQaTUxTWedGBeEOyFE/hfddGtmaZJnf/HBtc/EDoRjKEA==', + integrations: { All: true }, + originalTimestamp: '2020-09-03T05:48:50.821Z', + }, + destination: { + Config: { + monetateChannel: 'channel', + retailerShortName: 'retailer', + apiKey: 'api-key', + }, + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://engine.monetate.net/api/engine/v1/decide/retailer', + headers: { 'Content-Type': 'application/json' }, + params: {}, + body: { + JSON: { + events: [ + { eventType: 'monetate:context:IpAddress', ipAddress: '11.0.0.0' }, + { + eventType: 'monetate:context:PageView', + url: 'http://localhost:1111/monetateRudder.html', + path: '/monetateRudder.html', + }, + { + eventType: 'monetate:context:UserAgent', + userAgent: + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36', + }, + ], + customerId: 'user202', + channel: 'channel', + }, + XML: {}, + JSON_ARRAY: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'monetate', + description: 'Test 15', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + name: 'My orders Page Name', + type: 'page', + sentAt: '2020-09-03T05:48:50.822Z', + userId: 'user202', + channel: 'web', + context: { + ip: '33.0.0.0', + os: { name: '', version: '' }, + app: { + name: 'RudderLabs JavaScript SDK', + build: '1.0.0', + version: '1.1.3', + namespace: 'com.rudderlabs.javascript', + }, + page: { + url: 'http://localhost:1111/monetateRudder.html', + path: 'https://geeks.com', + title: 'MIxpanel Test', + search: '', + referrer: 'geeksforgeeks', + }, + locale: 'en-GB', + screen: { density: 2.5 }, + traits: { email: 'rudder@mysite.com' }, + library: { name: 'RudderLabs JavaScript SDK', version: '1.1.3' }, + userAgent: + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36', + }, + messageId: 'e142299a-e819-4590-b99f-9f74d30d6354', + properties: { + url: 'http://localhost:1111/monetateRudder.html', + name: 'My orders Page Name', + path: 'https://geeks.com', + title: 'MIxpanel Test', + search: '', + referrer: 'geeksforgeeks', + }, + anonymousId: 'anony33333333', + integrations: { All: true }, + originalTimestamp: '2020-09-03T05:48:50.821Z', + }, + destination: { + Config: { + monetateChannel: 'channel', + retailerShortName: 'retailer', + apiKey: 'api-key', + }, + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://engine.monetate.net/api/engine/v1/decide/retailer', + headers: { 'Content-Type': 'application/json' }, + params: {}, + body: { + JSON: { + events: [ + { + eventType: 'monetate:context:PageView', + url: 'http://localhost:1111/monetateRudder.html', + path: 'https://geeks.com', + }, + { eventType: 'monetate:context:Referrer', referrer: 'geeksforgeeks' }, + ], + channel: 'channel', + }, + XML: {}, + JSON_ARRAY: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'monetate', + description: 'Test 16', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + type: 'track', + event: 'Product Viewed', + sentAt: '2020-09-03T05:48:50.823Z', + userId: 'user202', + channel: 'web', + context: { + os: { name: '', version: '' }, + app: { + name: 'RudderLabs JavaScript SDK', + build: '1.0.0', + version: '1.1.3', + namespace: 'com.rudderlabs.javascript', + }, + page: { + url: 'http://localhost:1111/monetateRudder.html', + path: '/monetateRudder.html', + title: 'MIxpanel Test', + search: '', + referrer: 'http://localhost:1111/', + }, + locale: 'en-GB', + screen: { density: 2.5 }, + traits: { email: 'rudder@mysite.com' }, + userId: 'user101', + library: { name: 'RudderLabs JavaScript SDK', version: '1.1.3' }, + userAgent: + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36', + }, + messageId: '5fc62a0d-835b-45c9-bfea-f2f5e57340db', + properties: { + sku: '123', + products: [{ product_id: 'p1234678' }], + product_id: 'P303333333', + }, + anonymousId: + 'RudderEncrypt:U2FsdGVkX19Iqki3tnJjjeUzFWOegZjPY3iYQOPJJSQaTUxTWedGBeEOyFE/hfddGtmaZJnf/HBtc/EDoRjKEA==', + integrations: { All: true }, + originalTimestamp: '2020-09-03T05:48:50.822Z', + }, + destination: { + Config: { + monetateChannel: 'channel', + retailerShortName: 'retailer', + apiKey: 'api-key', + }, + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://engine.monetate.net/api/engine/v1/decide/retailer', + headers: { 'Content-Type': 'application/json' }, + params: {}, + body: { + JSON: { + events: [ + { + eventType: 'monetate:context:PageView', + url: 'http://localhost:1111/monetateRudder.html', + path: '/monetateRudder.html', + }, + { + eventType: 'monetate:context:UserAgent', + userAgent: + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36', + }, + { + eventType: 'monetate:context:ProductDetailView', + products: [{ productId: 'P303333333', sku: '123' }], + }, + ], + customerId: 'user202', + channel: 'channel', + }, + XML: {}, + JSON_ARRAY: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'monetate', + description: 'Test 17', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + name: 'ONly page name', + type: 'page', + sentAt: '2020-09-03T05:48:50.823Z', + userId: 'user202', + channel: 'web', + context: { + os: { name: '', version: '' }, + app: { + name: 'RudderLabs JavaScript SDK', + build: '1.0.0', + version: '1.1.3', + namespace: 'com.rudderlabs.javascript', + }, + page: { + url: 'http://localhost:1111/monetateRudder.html', + path: '/monetateRudder.html', + title: 'MIxpanel Test', + search: '', + referrer: 'http://localhost:1111/', + }, + locale: 'en-GB', + screen: { density: 2.5 }, + traits: { email: 'rudder@mysite.com' }, + library: { name: 'RudderLabs JavaScript SDK', version: '1.1.3' }, + userAgent: + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36', + }, + messageId: '1aca7c68-148e-4ef3-a828-d89daf403632', + properties: { + url: 'http://localhost:1111/monetateRudder.html', + name: 'ONly page name', + path: '/monetateRudder.html', + title: 'MIxpanel Test', + search: '', + referrer: 'http://localhost:1111/', + }, + anonymousId: + 'RudderEncrypt:U2FsdGVkX19Iqki3tnJjjeUzFWOegZjPY3iYQOPJJSQaTUxTWedGBeEOyFE/hfddGtmaZJnf/HBtc/EDoRjKEA==', + integrations: { All: true }, + originalTimestamp: '2020-09-03T05:48:50.823Z', + }, + destination: { + Config: { + monetateChannel: 'channel', + retailerShortName: 'retailer', + apiKey: 'api-key', + }, + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://engine.monetate.net/api/engine/v1/decide/retailer', + headers: { 'Content-Type': 'application/json' }, + params: {}, + body: { + JSON: { + events: [ + { + eventType: 'monetate:context:PageView', + url: 'http://localhost:1111/monetateRudder.html', + path: '/monetateRudder.html', + }, + { eventType: 'monetate:context:Referrer', referrer: 'http://localhost:1111/' }, + ], + channel: 'channel', + }, + XML: {}, + JSON_ARRAY: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'monetate', + description: 'Test 18', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + type: 'track', + event: 'Order Completed', + sentAt: '2020-09-03T05:48:50.824Z', + userId: 'user202', + channel: 'web', + context: { + ip: '11.0.0.0', + os: { name: '', version: '' }, + app: { + name: 'RudderLabs JavaScript SDK', + build: '1.0.0', + version: '1.1.3', + namespace: 'com.rudderlabs.javascript', + }, + page: { + url: 'http://localhost:1111/monetateRudder.html', + path: '/monetateRudder.html', + title: 'MIxpanel Test', + search: '', + referrer: 'http://localhost:1111/', + }, + locale: 'en-GB', + screen: { density: 2.5 }, + traits: { email: 'rudder@mysite.com' }, + library: { name: 'RudderLabs JavaScript SDK', version: '1.1.3' }, + moneateId: 'Monetate10111111', + userAgent: + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36', + }, + messageId: '19ef9a4e-fb49-42f2-8eba-b0bb7c934289', + properties: { + order_id: 'orderCompleted101', + products: [ + { + sku: 'sku 1 for order completed', + price: 8900, + currency: 'INR', + quantity: 1, + product_id: 'p2022222', + }, + { + sku: 'sku 2 for order completed', + price: 90, + quantity: 2, + product_id: 'p201111', + }, + ], + }, + anonymousId: 'anony11111111', + integrations: { All: true }, + originalTimestamp: '2020-09-03T05:48:50.824Z', + }, + destination: { + Config: { + monetateChannel: 'channel', + retailerShortName: 'retailer', + apiKey: 'api-key', + }, + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://engine.monetate.net/api/engine/v1/decide/retailer', + headers: { 'Content-Type': 'application/json' }, + params: {}, + body: { + JSON: { + events: [ + { eventType: 'monetate:context:IpAddress', ipAddress: '11.0.0.0' }, + { + eventType: 'monetate:context:PageView', + url: 'http://localhost:1111/monetateRudder.html', + path: '/monetateRudder.html', + }, + { + eventType: 'monetate:context:UserAgent', + userAgent: + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36', + }, + { + eventType: 'monetate:context:Purchase', + purchaseId: 'orderCompleted101', + purchaseLines: [ + { + pid: 'p2022222', + sku: 'sku 1 for order completed', + quantity: 1, + value: '8900.00', + currency: 'INR', + }, + { + pid: 'p201111', + sku: 'sku 2 for order completed', + quantity: 2, + value: '180.00', + currency: 'USD', + }, + ], + }, + ], + customerId: 'user202', + channel: 'channel', + }, + XML: {}, + JSON_ARRAY: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'monetate', + description: 'Test 19', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + type: 'track', + event: 'Order Completed', + sentAt: '2020-09-03T05:48:50.824Z', + channel: 'web', + context: { + ip: '11.0.0.0', + os: { name: '', version: '' }, + app: { + name: 'RudderLabs JavaScript SDK', + build: '1.0.0', + version: '1.1.3', + namespace: 'com.rudderlabs.javascript', + }, + page: { + url: 'http://localhost:1111/monetateRudder.html', + path: '/monetateRudder.html', + title: 'MIxpanel Test', + search: '', + referrer: 'http://localhost:1111/', + }, + locale: 'en-GB', + screen: { density: 2.5 }, + traits: { email: 'rudder@mysite.com' }, + library: { name: 'RudderLabs JavaScript SDK', version: '1.1.3' }, + moneateId: 'Monetate10111111', + userAgent: + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36', + }, + messageId: '19ef9a4e-fb49-42f2-8eba-b0bb7c934289', + properties: { + order_id: 'orderCompleted101', + products: [ + { + sku: 'sku 1 for order completed', + price: 8900, + currency: 'INR', + quantity: 1, + product_id: 'p2022222', + }, + { + sku: 'sku 2 for order completed', + price: 90, + quantity: 2, + product_id: 'p201111', + }, + ], + }, + anonymousId: 'anony11111111', + integrations: { All: true }, + originalTimestamp: '2020-09-03T05:48:50.824Z', + }, + destination: { + Config: { + monetateChannel: 'channel', + retailerShortName: 'retailer', + apiKey: 'api-key', + }, + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://engine.monetate.net/api/engine/v1/decide/retailer', + headers: { 'Content-Type': 'application/json' }, + params: {}, + body: { + JSON: { + events: [ + { eventType: 'monetate:context:IpAddress', ipAddress: '11.0.0.0' }, + { + eventType: 'monetate:context:PageView', + url: 'http://localhost:1111/monetateRudder.html', + path: '/monetateRudder.html', + }, + { + eventType: 'monetate:context:UserAgent', + userAgent: + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36', + }, + { + eventType: 'monetate:context:Purchase', + purchaseId: 'orderCompleted101', + purchaseLines: [ + { + pid: 'p2022222', + sku: 'sku 1 for order completed', + quantity: 1, + value: '8900.00', + currency: 'INR', + }, + { + pid: 'p201111', + sku: 'sku 2 for order completed', + quantity: 2, + value: '180.00', + currency: 'USD', + }, + ], + }, + ], + deviceId: 'anony11111111', + channel: 'channel', + }, + XML: {}, + JSON_ARRAY: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'monetate', + description: 'Test 20', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + name: 'ip check page name', + type: 'page', + sentAt: '2020-09-03T05:48:50.825Z', + userId: 'user202', + channel: 'web', + context: { + os: { name: '', version: '' }, + app: { + name: 'RudderLabs JavaScript SDK', + build: '1.0.0', + version: '1.1.3', + namespace: 'com.rudderlabs.javascript', + }, + page: { + url: 'https://facebook.com', + path: '/monetateRudder.html', + title: 'MIxpanel Test', + search: '', + referrer: 'http://localhost:1111/', + }, + locale: 'en-GB', + screen: { density: 2.5 }, + traits: { city: 'Sydney', phone: '909077777', country: 'Australia' }, + userId: 'user606', + library: { name: 'RudderLabs JavaScript SDK', version: '1.1.3' }, + userAgent: + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36', + }, + category: 'ip check page category', + messageId: 'd6aeaf93-d28b-4a60-b8af-2376bebc4094', + properties: { + url: 'https://facebook.com', + name: 'ip check page name', + path: '/monetateRudder.html', + title: 'MIxpanel Test', + search: '', + category: 'ip check page category', + referrer: 'http://localhost:1111/', + }, + anonymousId: + 'RudderEncrypt:U2FsdGVkX19Iqki3tnJjjeUzFWOegZjPY3iYQOPJJSQaTUxTWedGBeEOyFE/hfddGtmaZJnf/HBtc/EDoRjKEA==', + integrations: { All: true }, + originalTimestamp: '2020-09-03T05:48:50.825Z', + }, + destination: { + Config: { + monetateChannel: 'channel', + retailerShortName: 'retailer', + apiKey: 'api-key', + }, + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://engine.monetate.net/api/engine/v1/decide/retailer', + headers: { 'Content-Type': 'application/json' }, + params: {}, + body: { + JSON: { + events: [ + { + eventType: 'monetate:context:PageView', + url: 'https://facebook.com', + path: '/monetateRudder.html', + }, + { eventType: 'monetate:context:Referrer', referrer: 'http://localhost:1111/' }, + ], + channel: 'channel', + }, + XML: {}, + JSON_ARRAY: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'monetate', + description: 'Test 21', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + type: 'identify', + sentAt: '2020-09-04T08:59:41.568Z', + userId: 'user202', + channel: 'web', + context: { + os: { name: '', version: '' }, + app: { + name: 'RudderLabs JavaScript SDK', + build: '1.0.0', + version: '1.1.3', + namespace: 'com.rudderlabs.javascript', + }, + page: { + url: 'http://localhost:1111/monetateRudder.html', + path: '/monetateRudder.html', + title: 'MIxpanel Test', + search: '', + referrer: 'http://localhost:1111/', + }, + locale: 'en-GB', + screen: { density: 2.5 }, + traits: { + city: 'Bangalore', + name: 'Manashi', + email: 'rudder@mysite.com', + country: 'India', + }, + library: { name: 'RudderLabs JavaScript SDK', version: '1.1.3' }, + userAgent: + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36', + }, + messageId: '6debe993-9b1e-40ca-b2de-9054e86bcdd0', + anonymousId: + 'RudderEncrypt:U2FsdGVkX19Iqki3tnJjjeUzFWOegZjPY3iYQOPJJSQaTUxTWedGBeEOyFE/hfddGtmaZJnf/HBtc/EDoRjKEA==', + integrations: { All: true }, + originalTimestamp: '2020-09-04T08:59:41.567Z', + }, + destination: { + Config: { + monetateChannel: 'channel', + retailerShortName: 'retailer', + apiKey: 'api-key', + }, + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + error: 'Event type identify is not supported', + statTags: { + destType: 'MONETATE', + errorCategory: 'dataValidation', + errorType: 'instrumentation', + feature: 'processor', + implementation: 'native', + module: 'destination', + }, + statusCode: 400, + }, + ], + }, + }, + }, + { + name: 'monetate', + description: 'Test 22', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + sentAt: '2020-09-04T08:59:41.568Z', + userId: 'user202', + channel: 'web', + context: { + os: { name: '', version: '' }, + app: { + name: 'RudderLabs JavaScript SDK', + build: '1.0.0', + version: '1.1.3', + namespace: 'com.rudderlabs.javascript', + }, + page: { + url: 'http://localhost:1111/monetateRudder.html', + path: '/monetateRudder.html', + title: 'MIxpanel Test', + search: '', + referrer: 'http://localhost:1111/', + }, + locale: 'en-GB', + screen: { density: 2.5 }, + traits: { + city: 'Bangalore', + name: 'Manashi', + email: 'rudder@mysite.com', + country: 'India', + }, + library: { name: 'RudderLabs JavaScript SDK', version: '1.1.3' }, + userAgent: + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36', + }, + messageId: '6debe993-9b1e-40ca-b2de-9054e86bcdd0', + anonymousId: + 'RudderEncrypt:U2FsdGVkX19Iqki3tnJjjeUzFWOegZjPY3iYQOPJJSQaTUxTWedGBeEOyFE/hfddGtmaZJnf/HBtc/EDoRjKEA==', + integrations: { All: true }, + originalTimestamp: '2020-09-04T08:59:41.567Z', + }, + destination: { + Config: { + monetateChannel: 'channel', + retailerShortName: 'retailer', + apiKey: 'api-key', + }, + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + error: 'Event type is required', + statTags: { + destType: 'MONETATE', + errorCategory: 'dataValidation', + errorType: 'instrumentation', + feature: 'processor', + implementation: 'native', + module: 'destination', + }, + statusCode: 400, + }, + ], + }, + }, + }, + { + name: 'monetate', + description: 'Test 23', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + anonymousId: 'c82cbdff-e5be-4009-ac78-cdeea09ab4b1', + context: { + screen: { density: 2 }, + device: { + id: 'df16bffa-5c3d-4fbb-9bce-3bab098129a7R', + manufacturer: 'Xiaomi', + model: 'Redmi 6', + name: 'xiaomi', + }, + network: { carrier: 'Banglalink' }, + os: { name: 'android', version: '8.1.0' }, + traits: { + address: { city: 'Dhaka', country: 'Bangladesh' }, + anonymousId: 'c82cbdff-e5be-4009-ac78-cdeea09ab4b1', + }, + ip: '0.0.0.0', + }, + traits: { address: { city: 'Kol', country: 'Ind' } }, + name: 'Homepage', + integrations: { All: true }, + message_id: 'a80f82be-9bdc-4a9f-b2a5-15621ee41df8', + properties: { + page: { + url: 'https://example.com/homepage', + path: '/homepage', + referrer: 'https://google.com', + }, + }, + timestamp: '2019-09-01T15:46:51.693229+05:30', + type: 'screen', + userId: 'newUser', + }, + destination: { + Config: { + monetateChannel: 'channel', + retailerShortName: 'retailer', + apiKey: 'api-key', + }, + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://engine.monetate.net/api/engine/v1/decide/retailer', + headers: { 'Content-Type': 'application/json' }, + params: {}, + body: { JSON: { events: [], channel: 'channel' }, XML: {}, JSON_ARRAY: {}, FORM: {} }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'monetate', + description: 'Test 24', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + type: 'track', + event: 'Order Completed', + sentAt: '2020-09-03T05:48:50.824Z', + userId: 'user202', + channel: 'web', + context: { + ip: '11.0.0.0', + os: { name: '', version: '' }, + app: { + name: 'RudderLabs JavaScript SDK', + build: '1.0.0', + version: '1.1.3', + namespace: 'com.rudderlabs.javascript', + }, + page: { + url: 'http://localhost:1111/monetateRudder.html', + path: '/monetateRudder.html', + title: 'MIxpanel Test', + search: '', + referrer: 'http://localhost:1111/', + }, + locale: 'en-GB', + screen: { density: 2.5 }, + traits: { email: 'rudder@mysite.com' }, + library: { name: 'RudderLabs JavaScript SDK', version: '1.1.3' }, + moneateId: 'Monetate10111111', + userAgent: + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36', + }, + messageId: '19ef9a4e-fb49-42f2-8eba-b0bb7c934289', + properties: { + order_id: 'orderCompleted101', + products: [ + { + sku: 'sku 1 for order completed', + price: '8900', + currency: 'INR', + quantity: '1', + }, + { + sku: 'sku 2 for order completed', + price: '90', + quantity: '2', + product_id: 'p201111', + }, + ], + }, + anonymousId: 'anony11111111', + integrations: { All: true }, + originalTimestamp: '2020-09-03T05:48:50.824Z', + }, + destination: { + Config: { + monetateChannel: 'channel', + retailerShortName: 'retailer', + apiKey: 'api-key', + }, + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + error: + "'quantity', 'price' and 'product_id' are required fields and 'quantity' and 'price' should be a number for all products for Order Completed", + statTags: { + destType: 'MONETATE', + errorCategory: 'dataValidation', + errorType: 'instrumentation', + feature: 'processor', + implementation: 'native', + module: 'destination', + }, + statusCode: 400, + }, + ], + }, + }, + }, + { + name: 'monetate', + description: 'Test 25', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + type: 'track', + event: 'Cart Viewed', + sentAt: '2020-09-03T05:48:50.820Z', + userId: 'user202', + channel: 'web', + context: { + ip: '22.0.0.0', + os: { name: '', version: '' }, + app: { + name: 'RudderLabs JavaScript SDK', + build: '1.0.0', + version: '1.1.3', + namespace: 'com.rudderlabs.javascript', + }, + page: { + url: 'http://localhost:1111/monetateRudder.html', + path: '/monetateRudder.html', + title: 'MIxpanel Test', + search: '', + referrer: 'http://localhost:1111/', + }, + locale: 'en-GB', + screen: { density: 2.5 }, + traits: { email: 'rudder@mysite.com' }, + library: { name: 'RudderLabs JavaScript SDK', version: '1.1.3' }, + userAgent: + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36', + }, + messageId: '21e78620-748a-4c1c-8570-385206fc61d6', + properties: { + products: [ + { + details: 'Apple iphone 7', + currency: 'INR', + quantity: 1, + price: 2345, + product_id: 'p2022222', + }, + { price: 90, details: 'Apple iphone 8', quantity: 2, product_id: 'p201111' }, + ], + }, + anonymousId: 'anony222222222', + integrations: { All: true }, + originalTimestamp: '2020-09-03T05:48:50.820Z', + }, + destination: { + Config: { + monetateChannel: 'channel', + retailerShortName: 'retailer', + apiKey: 'api-key', + }, + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://engine.monetate.net/api/engine/v1/decide/retailer', + headers: { 'Content-Type': 'application/json' }, + params: {}, + body: { + JSON: { + events: [ + { eventType: 'monetate:context:IpAddress', ipAddress: '22.0.0.0' }, + { + eventType: 'monetate:context:PageView', + url: 'http://localhost:1111/monetateRudder.html', + path: '/monetateRudder.html', + }, + { + eventType: 'monetate:context:UserAgent', + userAgent: + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36', + }, + { + eventType: 'monetate:context:Cart', + cartLines: [ + { + pid: 'p2022222', + sku: '', + quantity: 1, + value: '2345.00', + currency: 'INR', + }, + { pid: 'p201111', sku: '', quantity: 2, value: '180.00', currency: 'USD' }, + ], + }, + ], + customerId: 'user202', + channel: 'channel', + }, + XML: {}, + JSON_ARRAY: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'monetate', + description: 'Test 26', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + anonymousId: 'c82cbdff-e5be-4009-ac78-cdeea09ab4b1', + context: { + screen: { height: 22, width: 11 }, + device: { + id: 'df16bffa-5c3d-4fbb-9bce-3bab098129a7R', + manufacturer: 'Xiaomi', + model: 'Redmi 6', + name: 'xiaomi', + }, + network: { carrier: 'Banglalink' }, + os: { name: 'android', version: '8.1.0' }, + traits: { + address: { city: 'Dhaka', country: 'Bangladesh' }, + anonymousId: 'c82cbdff-e5be-4009-ac78-cdeea09ab4b1', + }, + ip: '0.0.0.0', + }, + traits: { address: { city: 'Kol', country: 'Ind' } }, + event: 'Product Added', + integrations: { All: true }, + message_id: 'a80f82be-9bdc-4a9f-b2a5-15621ee41df8', + properties: { + monetateId: '1234', + currency: 'INR', + quantity: 1, + cart_value: 250, + sku: 'sku', + }, + timestamp: '2019-09-01T15:46:51.693229+05:30', + type: 'track', + userId: 'newUser', + }, + destination: { + Config: { + monetateChannel: 'channel', + retailerShortName: 'retailer', + apiKey: 'api-key', + }, + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + error: + "'product_id', 'quantity', 'cart_value' are required fields and 'quantity' should be a number for Product Added", + statTags: { + destType: 'MONETATE', + errorCategory: 'dataValidation', + errorType: 'instrumentation', + feature: 'processor', + implementation: 'native', + module: 'destination', + }, + statusCode: 400, + }, + ], + }, + }, + }, + { + name: 'monetate', + description: 'Test 27', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + anonymousId: 'c82cbdff-e5be-4009-ac78-cdeea09ab4b1', + context: { + screen: { height: 22, width: 11 }, + device: { + id: 'df16bffa-5c3d-4fbb-9bce-3bab098129a7R', + manufacturer: 'Xiaomi', + model: 'Redmi 6', + name: 'xiaomi', + }, + network: { carrier: 'Banglalink' }, + os: { name: 'android', version: '8.1.0' }, + traits: { + address: { city: 'Dhaka', country: 'Bangladesh' }, + anonymousId: 'c82cbdff-e5be-4009-ac78-cdeea09ab4b1', + }, + ip: '0.0.0.0', + }, + traits: { address: { city: 'Kol', country: 'Ind' } }, + event: 'Product List Viewed', + integrations: { All: true }, + message_id: 'a80f82be-9bdc-4a9f-b2a5-15621ee41df8', + properties: { monetateId: '1234', products: [{}, { product_id: 2 }] }, + timestamp: '2019-09-01T15:46:51.693229+05:30', + type: 'track', + userId: 'newUser', + }, + destination: { + Config: { + monetateChannel: 'channel', + retailerShortName: 'retailer', + apiKey: 'api-key', + }, + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + error: "'product_id' is a required field for all products for Product List Viewed", + statTags: { + destType: 'MONETATE', + errorCategory: 'dataValidation', + errorType: 'instrumentation', + feature: 'processor', + implementation: 'native', + module: 'destination', + }, + statusCode: 400, + }, + ], + }, + }, + }, + { + name: 'monetate', + description: 'Test 28', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + anonymousId: 'c82cbdff-e5be-4009-ac78-cdeea09ab4b1', + context: { + screen: { height: 22, width: 11 }, + device: { + id: 'df16bffa-5c3d-4fbb-9bce-3bab098129a7R', + manufacturer: 'Xiaomi', + model: 'Redmi 6', + name: 'xiaomi', + }, + network: { carrier: 'Banglalink' }, + os: { name: 'android', version: '8.1.0' }, + traits: { + address: { city: 'Dhaka', country: 'Bangladesh' }, + anonymousId: 'c82cbdff-e5be-4009-ac78-cdeea09ab4b1', + }, + ip: '0.0.0.0', + }, + traits: { address: { city: 'Kol', country: 'Ind' } }, + event: 'Product Viewed', + integrations: { All: true }, + message_id: 'a80f82be-9bdc-4a9f-b2a5-15621ee41df8', + properties: { monetateId: '1234' }, + timestamp: '2019-09-01T15:46:51.693229+05:30', + type: 'track', + userId: 'newUser', + }, + destination: { + Config: { + monetateChannel: 'channel', + retailerShortName: 'retailer', + apiKey: 'api-key', + }, + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + error: "'product_id' is a required field for Product Viewed", + statTags: { + destType: 'MONETATE', + errorCategory: 'dataValidation', + errorType: 'instrumentation', + feature: 'processor', + implementation: 'native', + module: 'destination', + }, + statusCode: 400, + }, + ], + }, + }, + }, + { + name: 'monetate', + description: 'Test 29', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + anonymousId: 'c82cbdff-e5be-4009-ac78-cdeea09ab4b1', + context: { + screen: { height: 22, width: 11 }, + device: { + id: 'df16bffa-5c3d-4fbb-9bce-3bab098129a7R', + manufacturer: 'Xiaomi', + model: 'Redmi 6', + name: 'xiaomi', + }, + network: { carrier: 'Banglalink' }, + os: { name: 'android', version: '8.1.0' }, + traits: { + address: { city: 'Dhaka', country: 'Bangladesh' }, + anonymousId: 'c82cbdff-e5be-4009-ac78-cdeea09ab4b1', + }, + ip: '0.0.0.0', + }, + traits: { address: { city: 'Kol', country: 'Ind' } }, + event: 'Product List Viewed', + integrations: { All: true }, + message_id: 'a80f82be-9bdc-4a9f-b2a5-15621ee41df8', + properties: { monetateId: '1234', products: { product_id: '1' } }, + timestamp: '2019-09-01T15:46:51.693229+05:30', + type: 'track', + userId: 'newUser', + }, + destination: { + Config: { + monetateChannel: 'channel', + retailerShortName: 'retailer', + apiKey: 'api-key', + }, + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + error: "'products' missing or not array in Product List Viewed", + statTags: { + destType: 'MONETATE', + errorCategory: 'dataValidation', + errorType: 'instrumentation', + feature: 'processor', + implementation: 'native', + module: 'destination', + }, + statusCode: 400, + }, + ], + }, + }, + }, +]; diff --git a/test/integrations/destinations/monetate/router/data.ts b/test/integrations/destinations/monetate/router/data.ts new file mode 100644 index 0000000000..09a7f8073d --- /dev/null +++ b/test/integrations/destinations/monetate/router/data.ts @@ -0,0 +1,264 @@ +export const data = [ + { + name: 'monetate', + description: 'Test 0', + feature: 'router', + module: 'destination', + version: 'v0', + input: { + request: { + body: { + input: [ + { + message: { + anonymousId: 'c82cbdff-e5be-4009-ac78-cdeea09ab4b1', + context: { + screen: { + height: 22, + width: 11, + }, + device: { + id: 'df16bffa-5c3d-4fbb-9bce-3bab098129a7R', + manufacturer: 'Xiaomi', + model: 'Redmi 6', + name: 'xiaomi', + }, + network: { + carrier: 'Banglalink', + }, + os: { + name: 'android', + version: '8.1.0', + }, + traits: { + address: { + city: 'Dhaka', + country: 'Bangladesh', + }, + anonymousId: 'c82cbdff-e5be-4009-ac78-cdeea09ab4b1', + }, + ip: '0.0.0.0', + }, + traits: { + address: { + city: 'Kol', + country: 'Ind', + }, + }, + event: 'Product Viewed', + integrations: { + All: true, + }, + message_id: 'a80f82be-9bdc-4a9f-b2a5-15621ee41df8', + properties: { + monetateId: '1234', + product_id: 'prodId', + }, + timestamp: '2019-09-01T15:46:51.693229+05:30', + type: 'track', + userId: 'newUser', + }, + metadata: { + jobId: 1, + }, + destination: { + Config: { + monetateChannel: 'channel', + retailerShortName: 'retailer', + apiKey: 'api-key', + }, + }, + }, + { + message: { + anonymousId: 'c82cbdff-e5be-4009-ac78-cdeea09ab4b1', + context: { + screen: { + height: 22, + width: 11, + }, + device: { + id: 'df16bffa-5c3d-4fbb-9bce-3bab098129a7R', + manufacturer: 'Xiaomi', + model: 'Redmi 6', + name: 'xiaomi', + }, + network: { + carrier: 'Banglalink', + }, + os: { + name: 'android', + version: '8.1.0', + }, + traits: { + address: { + city: 'Dhaka', + country: 'Bangladesh', + }, + anonymousId: 'c82cbdff-e5be-4009-ac78-cdeea09ab4b1', + }, + ip: '0.0.0.0', + }, + traits: { + address: { + city: 'Kol', + country: 'Ind', + }, + }, + event: 'Product List Viewed', + integrations: { + All: true, + }, + message_id: 'a80f82be-9bdc-4a9f-b2a5-15621ee41df8', + properties: { + monetateId: '1234', + products: [ + { + product_id: 1, + }, + { + product_id: 2, + }, + ], + }, + timestamp: '2019-09-01T15:46:51.693229+05:30', + type: 'track', + userId: 'newUser', + }, + metadata: { + jobId: 2, + }, + destination: { + Config: { + monetateChannel: 'channel', + retailerShortName: 'retailer', + apiKey: 'api-key', + }, + }, + }, + ], + destType: 'monetate', + }, + method: 'POST', + }, + }, + output: { + response: { + status: 200, + body: { + output: [ + { + batchedRequest: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://engine.monetate.net/api/engine/v1/decide/retailer', + headers: { + 'Content-Type': 'application/json', + }, + params: {}, + body: { + JSON: { + monetateId: '1234', + events: [ + { + eventType: 'monetate:context:IpAddress', + ipAddress: '0.0.0.0', + }, + { + eventType: 'monetate:context:ScreenSize', + height: 22, + width: 11, + }, + { + eventType: 'monetate:context:ProductDetailView', + products: [ + { + productId: 'prodId', + sku: '', + }, + ], + }, + ], + customerId: 'newUser', + channel: 'channel', + }, + XML: {}, + JSON_ARRAY: {}, + FORM: {}, + }, + files: {}, + }, + metadata: [ + { + jobId: 1, + }, + ], + batched: false, + statusCode: 200, + destination: { + Config: { + monetateChannel: 'channel', + retailerShortName: 'retailer', + apiKey: 'api-key', + }, + }, + }, + { + batchedRequest: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://engine.monetate.net/api/engine/v1/decide/retailer', + headers: { + 'Content-Type': 'application/json', + }, + params: {}, + body: { + JSON: { + monetateId: '1234', + events: [ + { + eventType: 'monetate:context:IpAddress', + ipAddress: '0.0.0.0', + }, + { + eventType: 'monetate:context:ScreenSize', + height: 22, + width: 11, + }, + { + eventType: 'monetate:context:ProductThumbnailView', + products: ['1', '2'], + }, + ], + customerId: 'newUser', + channel: 'channel', + }, + XML: {}, + JSON_ARRAY: {}, + FORM: {}, + }, + files: {}, + }, + metadata: [ + { + jobId: 2, + }, + ], + batched: false, + statusCode: 200, + destination: { + Config: { + monetateChannel: 'channel', + retailerShortName: 'retailer', + apiKey: 'api-key', + }, + }, + }, + ], + }, + }, + }, + }, +]; diff --git a/test/integrations/destinations/ometria/processor/data.ts b/test/integrations/destinations/ometria/processor/data.ts new file mode 100644 index 0000000000..c28854c9fd --- /dev/null +++ b/test/integrations/destinations/ometria/processor/data.ts @@ -0,0 +1,1078 @@ +export const data = [ + { + name: 'ometria', + description: 'Test 0', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + channel: 'web', + context: { + app: { + build: '1.0.0', + name: 'RudderLabs JavaScript SDK', + namespace: 'com.rudderlabs.javascript', + version: '1.0.0', + }, + traits: { + listingId: 'test1', + email: 'testone@gmail.com', + firstName: 'test', + lastName: 'one', + field1: 'val1', + ip: '0.0.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 }, + page: { + path: '/destinations/ometria', + referrer: '', + search: '', + title: '', + url: 'https://docs.rudderstack.com/destinations/ometria', + category: 'destination', + initial_referrer: 'https://docs.rudderstack.com', + initial_referring_domain: 'docs.rudderstack.com', + }, + }, + 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: 'userId1', + integrations: { Ometria: { listingId: 'test1' } }, + sentAt: '2019-10-14T09:03:22.563Z', + }, + destination: { + Config: { + apiKey: 'dummyApiKey', + allowMarketing: false, + allowTransactional: false, + marketingOptin: 'EXPLICITLY_OPTEDOUT', + }, + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://api.ometria.com/v2/push', + headers: { 'X-Ometria-Auth': 'dummyApiKey' }, + 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}}}]', + }, + XML: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'ometria', + description: 'Test 1', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + channel: 'web', + context: { + app: { + build: '1.0.0', + name: 'RudderLabs JavaScript SDK', + namespace: 'com.rudderlabs.javascript', + version: '1.0.0', + }, + traits: { + listingId: 'test1', + email: 'testone@gmail.com', + firstName: 'test', + lastName: 'one', + field1: 'val1', + ip: '0.0.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 }, + page: { + path: '/destinations/ometria', + referrer: '', + search: '', + title: '', + url: 'https://docs.rudderstack.com/destinations/ometria', + category: 'destination', + initial_referrer: 'https://docs.rudderstack.com', + initial_referring_domain: 'docs.rudderstack.com', + }, + }, + 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: 'userId1', + integrations: { Ometria: { listingId: 'updatedId1', allowMarketing: true } }, + sentAt: '2019-10-14T09:03:22.563Z', + }, + destination: { + Config: { + apiKey: 'dummyApiKey', + allowMarketing: false, + allowTransactional: false, + marketingOptin: 'EXPLICITLY_OPTEDOUT', + }, + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://api.ometria.com/v2/push', + headers: { 'X-Ometria-Auth': 'dummyApiKey' }, + 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}}}]', + }, + XML: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'ometria', + description: 'Test 2', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + channel: 'web', + context: { + app: { + build: '1.0.0', + name: 'RudderLabs JavaScript SDK', + namespace: 'com.rudderlabs.javascript', + version: '1.0.0', + }, + traits: { + listingId: 'test1', + email: 'testone@gmail.com', + name: 'test one two', + field1: 'val1', + ip: '0.0.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 }, + page: { + path: '/destinations/ometria', + referrer: '', + search: '', + title: '', + url: 'https://docs.rudderstack.com/destinations/ometria', + category: 'destination', + initial_referrer: 'https://docs.rudderstack.com', + initial_referring_domain: 'docs.rudderstack.com', + }, + }, + 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: 'userId1', + integrations: { Ometria: { listingId: 'test1' } }, + sentAt: '2019-10-14T09:03:22.563Z', + }, + destination: { + Config: { + apiKey: 'dummyApiKey', + allowMarketing: false, + allowTransactional: false, + marketingOptin: 'EXPLICITLY_OPTEDOUT', + }, + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://api.ometria.com/v2/push', + headers: { 'X-Ometria-Auth': 'dummyApiKey' }, + 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"}]', + }, + XML: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'ometria', + description: 'Test 3', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + channel: 'web', + context: { + app: { + build: '1.0.0', + name: 'RudderLabs JavaScript SDK', + namespace: 'com.rudderlabs.javascript', + version: '1.0.0', + }, + traits: { + listingId: 'test1', + email: 'testone@gmail.com', + name: 'test one', + field1: 'val1', + marketinOptin: 'NOT_SPECIFIED', + phoneNumber: '+911234567890', + channels: { sms: {} }, + }, + 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 }, + page: { + path: '/destinations/ometria', + referrer: '', + search: '', + title: '', + url: 'https://docs.rudderstack.com/destinations/ometria', + category: 'destination', + initial_referrer: 'https://docs.rudderstack.com', + initial_referring_domain: 'docs.rudderstack.com', + }, + }, + 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: 'userId1', + integrations: { Ometria: { listingId: 'test1' } }, + sentAt: '2019-10-14T09:03:22.563Z', + }, + destination: { + Config: { + apiKey: 'dummyApiKey', + allowMarketing: false, + allowTransactional: false, + marketingOptin: 'NOT_SPECIFIED', + }, + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://api.ometria.com/v2/push', + headers: { 'X-Ometria-Auth': 'dummyApiKey' }, + 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"}]', + }, + XML: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'ometria', + description: 'Test 4', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + channel: 'web', + context: { + app: { + build: '1.0.0', + name: 'RudderLabs JavaScript SDK', + namespace: 'com.rudderlabs.javascript', + version: '1.0.0', + }, + traits: { + listingId: 'test1', + email: 'testone@gmail.com', + name: 'test one', + field1: 'val1', + marketinOptin: 'NOT_SPECIFIED', + phoneNumber: '+911234567890', + channels: { sms: {} }, + }, + 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 }, + page: { + path: '/destinations/ometria', + referrer: '', + search: '', + title: '', + url: 'https://docs.rudderstack.com/destinations/ometria', + category: 'destination', + initial_referrer: 'https://docs.rudderstack.com', + initial_referring_domain: 'docs.rudderstack.com', + }, + }, + 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: 'userId1', + integrations: { + Ometria: { listingId: 'test1', allowMarketing: true, allowTransactional: true }, + }, + sentAt: '2019-10-14T09:03:22.563Z', + }, + destination: { + Config: { + apiKey: 'dummyApiKey', + allowMarketing: false, + allowTransactional: false, + marketingOptin: 'NOT_SPECIFIED', + }, + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://api.ometria.com/v2/push', + headers: { 'X-Ometria-Auth': 'dummyApiKey' }, + 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"}]', + }, + XML: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'ometria', + description: 'Test 5', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + 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' }, + 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 }, + page: { + path: '/destinations/ometria', + referrer: '', + search: '', + title: '', + url: 'https://docs.rudderstack.com/destinations/ometria', + category: 'destination', + initial_referrer: 'https://docs.rudderstack.com', + initial_referring_domain: 'docs.rudderstack.com', + }, + }, + type: 'track', + messageId: '84e26acc-56a5-4835-8233-591137fca468', + session_id: '3049dc4c-5a95-4ccd-a3e7-d74a7e411f22', + originalTimestamp: '2019-10-14T09:03:17.562Z', + anonymousId: '123456', + userId: 'userId1', + event: 'event name', + properties: { + event_id: 'eventId1', + timestamp: '2017-05-01T14:00:00Z', + field1: 'val1', + }, + integrations: { All: true }, + sentAt: '2019-10-14T09:03:22.563Z', + }, + destination: { Config: { apiKey: 'dummyApiKey' } }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://api.ometria.com/v2/push', + headers: { 'X-Ometria-Auth': 'dummyApiKey' }, + 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"}}]', + }, + XML: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'ometria', + description: 'Test 6', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + 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' }, + 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 }, + page: { + path: '/destinations/ometria', + referrer: '', + search: '', + title: '', + url: 'https://docs.rudderstack.com/destinations/ometria', + category: 'destination', + initial_referrer: 'https://docs.rudderstack.com', + initial_referring_domain: 'docs.rudderstack.com', + }, + }, + type: 'track', + messageId: '84e26acc-56a5-4835-8233-591137fca468', + session_id: '3049dc4c-5a95-4ccd-a3e7-d74a7e411f22', + originalTimestamp: '2019-10-14T09:03:17.562Z', + anonymousId: '123456', + userId: 'userId1', + event: 'order completed', + properties: { + order_id: 'orderId1', + timestamp: '2017-05-01T14:00:00Z', + grand_total: 1000, + currency: 'INR', + field1: 'val1', + }, + integrations: { All: true }, + sentAt: '2019-10-14T09:03:22.563Z', + }, + destination: { Config: { apiKey: 'dummyApiKey' } }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://api.ometria.com/v2/push', + headers: { 'X-Ometria-Auth': 'dummyApiKey' }, + 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"}}]', + }, + XML: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'ometria', + description: 'Test 7', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + 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' }, + 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 }, + page: { + path: '/destinations/ometria', + referrer: '', + search: '', + title: '', + url: 'https://docs.rudderstack.com/destinations/ometria', + category: 'destination', + initial_referrer: 'https://docs.rudderstack.com', + initial_referring_domain: 'docs.rudderstack.com', + }, + }, + type: 'track', + messageId: '84e26acc-56a5-4835-8233-591137fca468', + session_id: '3049dc4c-5a95-4ccd-a3e7-d74a7e411f22', + originalTimestamp: '2019-10-14T09:03:17.562Z', + anonymousId: '123456', + userId: 'userId1', + event: 'order completed', + properties: { + order_id: 'orderId1', + timestamp: '2017-05-01T14:00:00Z', + grand_total: 1000, + currency: 'INR', + field1: 'val1', + products: [{ product_id: 'prod123', quantity: 4, subtotal: 10 }], + }, + integrations: { All: true }, + sentAt: '2019-10-14T09:03:22.563Z', + }, + destination: { Config: { apiKey: 'dummyApiKey' } }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://api.ometria.com/v2/push', + headers: { 'X-Ometria-Auth': 'dummyApiKey' }, + 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}]}]', + }, + XML: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'ometria', + description: 'Test 8', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + 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' }, + 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 }, + page: { + path: '/destinations/ometria', + referrer: '', + search: '', + title: '', + url: 'https://docs.rudderstack.com/destinations/ometria', + category: 'destination', + initial_referrer: 'https://docs.rudderstack.com', + initial_referring_domain: 'docs.rudderstack.com', + }, + }, + type: 'track', + messageId: '84e26acc-56a5-4835-8233-591137fca468', + session_id: '3049dc4c-5a95-4ccd-a3e7-d74a7e411f22', + originalTimestamp: '2019-10-14T09:03:17.562Z', + anonymousId: '123456', + userId: 'userId1', + event: 'order completed', + properties: { + order_id: 'orderId1', + timestamp: '2017-05-01T14:00:00Z', + grand_total: 1000, + currency: 'INR', + field1: 'val1', + products: [ + { + product_id: 'prod123', + quantity: 4, + subtotal: 10, + variant_options: [{ type: 'size', id: 'newid', label: '5' }], + }, + ], + }, + integrations: { All: true }, + sentAt: '2019-10-14T09:03:22.563Z', + }, + destination: { Config: { apiKey: 'dummyApiKey' } }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://api.ometria.com/v2/push', + headers: { 'X-Ometria-Auth': 'dummyApiKey' }, + 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"}]}]}]', + }, + XML: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'ometria', + description: 'Test 9', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + 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' }, + 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 }, + page: { + path: '/destinations/ometria', + referrer: '', + search: '', + title: '', + url: 'https://docs.rudderstack.com/destinations/ometria', + category: 'destination', + initial_referrer: 'https://docs.rudderstack.com', + initial_referring_domain: 'docs.rudderstack.com', + }, + }, + type: 'track', + messageId: '84e26acc-56a5-4835-8233-591137fca468', + session_id: '3049dc4c-5a95-4ccd-a3e7-d74a7e411f22', + originalTimestamp: '2019-10-14T09:03:17.562Z', + anonymousId: '123456', + userId: 'userId1', + event: 'order completed', + properties: { + order_id: 'orderId1', + timestamp: '2017-05-01T14:00:00Z', + grand_total: 1000, + currency: 'INR', + field1: 'val1', + billing_address: 'Ba', + shipping_address: 'Sa', + products: [ + { + product_id: 'prod123', + quantity: 4, + subtotal: 10, + variant_options: [{ type: 'size', id: 'newid', label: '5' }], + }, + ], + }, + integrations: { All: true }, + sentAt: '2019-10-14T09:03:22.563Z', + }, + destination: { Config: { apiKey: 'dummyApiKey' } }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://api.ometria.com/v2/push', + headers: { 'X-Ometria-Auth': 'dummyApiKey' }, + 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"}]}]}]', + }, + XML: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'ometria', + description: 'Test 10', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + 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' }, + 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 }, + page: { + path: '/destinations/ometria', + referrer: '', + search: '', + title: '', + url: 'https://docs.rudderstack.com/destinations/ometria', + category: 'destination', + initial_referrer: 'https://docs.rudderstack.com', + initial_referring_domain: 'docs.rudderstack.com', + }, + }, + type: 'track', + messageId: '84e26acc-56a5-4835-8233-591137fca468', + session_id: '3049dc4c-5a95-4ccd-a3e7-d74a7e411f22', + originalTimestamp: '2019-10-14T09:03:17.562Z', + anonymousId: '123456', + userId: 'userId1', + event: 'order completed', + properties: { + order_id: 'orderId1', + timestamp: '2017-05-01T14:00:00Z', + grand_total: 1000, + currency: 'INR', + field1: 'val1', + shipping_address: { + city: 'Kolkata', + state: 'West Bengal', + postcode: '700001', + country_code: 'IN', + }, + products: [ + { + product_id: 'prod123', + quantity: 4, + subtotal: 10, + variant_options: [{ type: 'size', id: 'newid', label: '5' }], + }, + ], + }, + integrations: { All: true }, + sentAt: '2019-10-14T09:03:22.563Z', + }, + destination: { Config: { apiKey: 'dummyApiKey' } }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://api.ometria.com/v2/push', + headers: { 'X-Ometria-Auth': 'dummyApiKey' }, + 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"}]}]}]', + }, + XML: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, +]; diff --git a/test/integrations/destinations/ometria/router/data.ts b/test/integrations/destinations/ometria/router/data.ts new file mode 100644 index 0000000000..ef15eea586 --- /dev/null +++ b/test/integrations/destinations/ometria/router/data.ts @@ -0,0 +1,336 @@ +export const data = [ + { + name: 'ometria', + description: 'Test 0', + feature: 'router', + module: 'destination', + version: 'v0', + input: { + request: { + body: { + input: [ + { + message: { + type: 'identify', + sentAt: '2021-10-25T09:40:08.880Z', + userId: 'userId1', + channel: 'web', + context: { + os: { + name: '', + version: '', + }, + app: { + name: 'RudderLabs JavaScript SDK', + build: '1.0.0', + version: '1.2.1', + namespace: 'com.rudderlabs.javascript', + }, + page: { + url: 'http://127.0.0.1:5500/index.html', + path: '/index.html', + title: 'Test', + search: '', + tab_url: 'http://127.0.0.1:5500/index.html', + referrer: 'http://127.0.0.1:5500/index.html', + initial_referrer: 'http://127.0.0.1:5500/index.html', + referring_domain: '127.0.0.1:5500', + initial_referring_domain: '127.0.0.1:5500', + }, + locale: 'en-GB', + screen: { + width: 1440, + height: 900, + density: 2, + innerWidth: 1440, + innerHeight: 335, + }, + traits: { + listingId: 'test1', + email: 'testone@gmail.com', + firstName: 'test', + lastName: 'one', + field1: 'val1', + ip: '0.0.0.0', + }, + library: { + name: 'RudderLabs JavaScript SDK', + version: '1.2.1', + }, + campaign: {}, + userAgent: + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36', + }, + rudderId: 'e3e907f1-f79a-444b-b91d-da47488f8273', + messageId: '8cdd3d2e-5e07-42ec-abdc-9b6bd4333840', + timestamp: '2021-10-25T15:10:08.888+05:30', + receivedAt: '2021-10-25T15:10:08.889+05:30', + request_ip: '[::1]', + anonymousId: '7138f7d9-5dd2-4337-805d-ca17be59dc8e', + integrations: { + Ometria: { + listingId: 'test1', + }, + }, + originalTimestamp: '2021-10-25T09:40:08.879Z', + }, + metadata: { jobId: 1 }, + destination: { + ID: '1zzHtStW2ZPlullmz6L7DGnmk9V', + Name: 'ometria-dev', + DestinationDefinition: { + ID: '1zgVZhcj1Tij4qlKg7B1Jp16IrH', + Name: 'OMETRIA', + DisplayName: 'Ometria', + Config: { + transformAt: 'router', + transformAtV1: 'router', + saveDestinationResponse: true, + includeKeys: [], + excludeKeys: [], + supportedSourceTypes: [ + 'android', + 'ios', + 'web', + 'unity', + 'amp', + 'cloud', + 'reactnative', + 'flutter', + 'cordova', + ], + supportedMessageTypes: ['identify', 'track'], + destConfig: { + defaultConfig: [ + 'apiKey', + 'marketingOptin', + 'allowMarketing', + 'allowTransactional', + ], + }, + secretKeys: ['apiKey'], + }, + ResponseRules: {}, + }, + Config: { + apiKey: 'dummyApiKey', + allowMarketing: false, + allowTransactional: false, + marketingOptin: 'EXPLICITLY_OPTEDOUT', + }, + Enabled: true, + Transformations: [], + IsProcessorEnabled: true, + }, + }, + { + message: { + type: 'identify', + sentAt: '2021-10-25T09:40:08.880Z', + anonymousId: '123456', + userId: 'userId1', + channel: 'web', + context: { + os: { + name: '', + version: '', + }, + app: { + name: 'RudderLabs JavaScript SDK', + build: '1.0.0', + version: '1.2.1', + namespace: 'com.rudderlabs.javascript', + }, + page: { + url: 'http://127.0.0.1:5500/index.html', + path: '/index.html', + title: 'Test', + search: '', + tab_url: 'http://127.0.0.1:5500/index.html', + referrer: 'http://127.0.0.1:5500/index.html', + initial_referrer: 'http://127.0.0.1:5500/index.html', + referring_domain: '127.0.0.1:5500', + initial_referring_domain: '127.0.0.1:5500', + }, + locale: 'en-GB', + screen: { + width: 1440, + height: 900, + density: 2, + innerWidth: 1440, + innerHeight: 335, + }, + traits: { + listingId: 'test1', + email: 'testone@gmail.com', + firstName: 'test', + lastName: 'one', + field1: 'val1', + ip: '0.0.0.0', + }, + library: { + name: 'RudderLabs JavaScript SDK', + version: '1.2.1', + }, + campaign: {}, + userAgent: + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36', + }, + rudderId: 'e3e907f1-f79a-444b-b91d-da47488f8273', + messageId: '8cdd3d2e-5e07-42ec-abdc-9b6bd4333840', + timestamp: '2021-10-25T15:10:08.888+05:30', + receivedAt: '2021-10-25T15:10:08.889+05:30', + request_ip: '[::1]', + integrations: { + Ometria: { + listingId: 'updatedId1', + allowMarketing: true, + }, + }, + originalTimestamp: '2021-10-25T09:40:08.879Z', + }, + metadata: { jobId: 2 }, + destination: { + ID: '1zzHtStW2ZPlullmz6L7DGnmk9V', + Name: 'ometria-dev', + DestinationDefinition: { + ID: '1zgVZhcj1Tij4qlKg7B1Jp16IrH', + Name: 'OMETRIA', + DisplayName: 'Ometria', + Config: { + transformAt: 'router', + transformAtV1: 'router', + saveDestinationResponse: true, + includeKeys: [], + excludeKeys: [], + supportedSourceTypes: [ + 'android', + 'ios', + 'web', + 'unity', + 'amp', + 'cloud', + 'reactnative', + 'flutter', + 'cordova', + ], + supportedMessageTypes: ['identify', 'track'], + destConfig: { + defaultConfig: [ + 'apiKey', + 'marketingOptin', + 'allowMarketing', + 'allowTransactional', + ], + }, + secretKeys: ['apiKey'], + }, + ResponseRules: {}, + }, + Config: { + apiKey: 'dummyApiKey', + allowMarketing: false, + allowTransactional: false, + marketingOptin: 'EXPLICITLY_OPTEDOUT', + }, + Enabled: true, + Transformations: [], + IsProcessorEnabled: true, + }, + }, + ], + destType: 'ometria', + }, + method: 'POST', + }, + }, + output: { + response: { + status: 200, + body: { + output: [ + { + batchedRequest: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://api.ometria.com/v2/push', + headers: { + 'X-Ometria-Auth': 'dummyApiKey', + }, + 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}}}]', + }, + XML: {}, + FORM: {}, + }, + files: {}, + }, + metadata: [ + { + jobId: 1, + }, + { + jobId: 2, + }, + ], + batched: true, + statusCode: 200, + destination: { + ID: '1zzHtStW2ZPlullmz6L7DGnmk9V', + Name: 'ometria-dev', + DestinationDefinition: { + ID: '1zgVZhcj1Tij4qlKg7B1Jp16IrH', + Name: 'OMETRIA', + DisplayName: 'Ometria', + Config: { + transformAt: 'router', + transformAtV1: 'router', + saveDestinationResponse: true, + includeKeys: [], + excludeKeys: [], + supportedSourceTypes: [ + 'android', + 'ios', + 'web', + 'unity', + 'amp', + 'cloud', + 'reactnative', + 'flutter', + 'cordova', + ], + supportedMessageTypes: ['identify', 'track'], + destConfig: { + defaultConfig: [ + 'apiKey', + 'marketingOptin', + 'allowMarketing', + 'allowTransactional', + ], + }, + secretKeys: ['apiKey'], + }, + ResponseRules: {}, + }, + Config: { + apiKey: 'dummyApiKey', + allowMarketing: false, + allowTransactional: false, + marketingOptin: 'EXPLICITLY_OPTEDOUT', + }, + Enabled: true, + Transformations: [], + IsProcessorEnabled: true, + }, + }, + ], + }, + }, + }, + }, +]; diff --git a/test/integrations/destinations/one_signal/processor/data.ts b/test/integrations/destinations/one_signal/processor/data.ts new file mode 100644 index 0000000000..7f244aa711 --- /dev/null +++ b/test/integrations/destinations/one_signal/processor/data.ts @@ -0,0 +1,1545 @@ +export const data = [ + { + name: 'one_signal', + description: + 'Identify call for creating new device (phone and playerId is not available in the payload). Integrations object is also not available.', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + destination: { + Config: { + appId: 'random-818c-4a28-b98e-6cd8a994eb22', + emailDeviceType: true, + smsDeviceType: true, + eventAsTags: false, + allowedProperties: [], + }, + }, + message: { + type: 'identify', + sentAt: '2021-01-03T17:02:53.195Z', + userId: 'user@27', + 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: { + brand: 'John Players', + price: '15000', + firstName: 'Test', + email: 'test@rudderstack.com', + userId: 'user@27', + }, + 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: '8f8fa6b5-8e24-489c-8e22-61f23f2e364f', + messageId: '2116ef8c-efc3-4ca4-851b-02ee60dad6ff', + anonymousId: '97c46c81-3140-456d-b2a9-690d70aaca35', + originalTimestamp: '2021-01-03T17:02:53.193Z', + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://onesignal.com/api/v1/players', + headers: { Accept: 'application/json', 'Content-Type': 'application/json' }, + params: {}, + body: { + JSON: { + device_os: '1.12.3', + laguage: 'en-US', + created_at: 1609693373, + last_active: 1609693373, + external_user_id: 'user@27', + app_id: 'random-818c-4a28-b98e-6cd8a994eb22', + device_type: 11, + identifier: 'test@rudderstack.com', + tags: { + brand: 'John Players', + price: '15000', + firstName: 'Test', + email: 'test@rudderstack.com', + userId: 'user@27', + anonymousId: '97c46c81-3140-456d-b2a9-690d70aaca35', + }, + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://onesignal.com/api/v1/players', + headers: { Accept: 'application/json', 'Content-Type': 'application/json' }, + params: {}, + body: { + JSON: { + device_os: '1.12.3', + laguage: 'en-US', + created_at: 1609693373, + last_active: 1609693373, + external_user_id: 'user@27', + app_id: 'random-818c-4a28-b98e-6cd8a994eb22', + device_type: 8, + identifier: '97c46c81-3140-456d-b2a9-690d70aaca35', + tags: { + brand: 'John Players', + price: '15000', + firstName: 'Test', + email: 'test@rudderstack.com', + userId: 'user@27', + anonymousId: '97c46c81-3140-456d-b2a9-690d70aaca35', + }, + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'one_signal', + description: + 'Identify call for creating new device (playerId is not available in the payload). Integrations object is also not available. Email and phone both are available in the payload.', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + destination: { + Config: { + appId: 'random-818c-4a28-b98e-6cd8a994eb22', + emailDeviceType: true, + smsDeviceType: true, + eventAsTags: false, + allowedProperties: [], + }, + }, + message: { + type: 'identify', + sentAt: '2021-01-03T17:02:53.195Z', + userId: 'user@27', + 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: { + brand: 'John Players', + price: '15000', + firstName: 'Test', + email: 'test@rudderstack.com', + phone: '+917836362334', + userId: 'user@27', + }, + 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: '8f8fa6b5-8e24-489c-8e22-61f23f2e364f', + messageId: '2116ef8c-efc3-4ca4-851b-02ee60dad6ff', + anonymousId: '97c46c81-3140-456d-b2a9-690d70aaca35', + originalTimestamp: '2021-01-03T17:02:53.193Z', + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://onesignal.com/api/v1/players', + headers: { Accept: 'application/json', 'Content-Type': 'application/json' }, + params: {}, + body: { + JSON: { + device_os: '1.12.3', + laguage: 'en-US', + created_at: 1609693373, + last_active: 1609693373, + external_user_id: 'user@27', + app_id: 'random-818c-4a28-b98e-6cd8a994eb22', + device_type: 11, + identifier: 'test@rudderstack.com', + tags: { + brand: 'John Players', + price: '15000', + firstName: 'Test', + email: 'test@rudderstack.com', + phone: '+917836362334', + userId: 'user@27', + anonymousId: '97c46c81-3140-456d-b2a9-690d70aaca35', + }, + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://onesignal.com/api/v1/players', + headers: { Accept: 'application/json', 'Content-Type': 'application/json' }, + params: {}, + body: { + JSON: { + device_os: '1.12.3', + laguage: 'en-US', + created_at: 1609693373, + last_active: 1609693373, + external_user_id: 'user@27', + app_id: 'random-818c-4a28-b98e-6cd8a994eb22', + device_type: 14, + identifier: '+917836362334', + tags: { + brand: 'John Players', + price: '15000', + firstName: 'Test', + email: 'test@rudderstack.com', + phone: '+917836362334', + userId: 'user@27', + anonymousId: '97c46c81-3140-456d-b2a9-690d70aaca35', + }, + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://onesignal.com/api/v1/players', + headers: { Accept: 'application/json', 'Content-Type': 'application/json' }, + params: {}, + body: { + JSON: { + device_os: '1.12.3', + laguage: 'en-US', + created_at: 1609693373, + last_active: 1609693373, + external_user_id: 'user@27', + app_id: 'random-818c-4a28-b98e-6cd8a994eb22', + device_type: 8, + identifier: '97c46c81-3140-456d-b2a9-690d70aaca35', + tags: { + brand: 'John Players', + price: '15000', + firstName: 'Test', + email: 'test@rudderstack.com', + phone: '+917836362334', + userId: 'user@27', + anonymousId: '97c46c81-3140-456d-b2a9-690d70aaca35', + }, + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'one_signal', + description: + 'Identify call for creating a new device(deviceType and identifier is present in the integrations object, playerId not present)', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + destination: { + Config: { + appId: 'random-818c-4a28-b98e-6cd8a994eb22', + emailDeviceType: false, + smsDeviceType: false, + eventAsTags: false, + allowedProperties: [], + }, + }, + message: { + type: 'identify', + sentAt: '2021-01-03T17:02:53.195Z', + userId: 'user@27', + 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: { + brand: 'John Players', + price: '15000', + firstName: 'Test', + email: 'test@rudderstack.com', + phone: '+917836362334', + userId: 'user@27', + }, + 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', + }, + integrations: { one_signal: { deviceType: '5', identifier: 'random_id' } }, + rudderId: '8f8fa6b5-8e24-489c-8e22-61f23f2e364f', + messageId: '2116ef8c-efc3-4ca4-851b-02ee60dad6ff', + anonymousId: '97c46c81-3140-456d-b2a9-690d70aaca35', + originalTimestamp: '2021-01-03T17:02:53.193Z', + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://onesignal.com/api/v1/players', + headers: { Accept: 'application/json', 'Content-Type': 'application/json' }, + params: {}, + body: { + JSON: { + device_os: '1.12.3', + laguage: 'en-US', + created_at: 1609693373, + last_active: 1609693373, + external_user_id: 'user@27', + app_id: 'random-818c-4a28-b98e-6cd8a994eb22', + device_type: 5, + identifier: 'random_id', + tags: { + brand: 'John Players', + price: '15000', + firstName: 'Test', + email: 'test@rudderstack.com', + phone: '+917836362334', + userId: 'user@27', + anonymousId: '97c46c81-3140-456d-b2a9-690d70aaca35', + }, + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'one_signal', + description: + 'Identify call for creating a new device(channel is mobile and integrations object is not present, playerId not present)', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + destination: { + Config: { + appId: 'random-818c-4a28-b98e-6cd8a994eb22', + emailDeviceType: false, + smsDeviceType: false, + eventAsTags: false, + allowedProperties: [], + }, + }, + message: { + type: 'identify', + sentAt: '2021-01-03T17:02:53.195Z', + userId: 'user@27', + channel: 'mobile', + 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: { + brand: 'John Players', + price: '15000', + firstName: 'Test', + email: 'test@rudderstack.com', + phone: '+917836362334', + userId: 'user@27', + }, + locale: 'en-US', + device: { token: 'token', id: 'id', type: 'android' }, + 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: '8f8fa6b5-8e24-489c-8e22-61f23f2e364f', + messageId: '2116ef8c-efc3-4ca4-851b-02ee60dad6ff', + anonymousId: '97c46c81-3140-456d-b2a9-690d70aaca35', + originalTimestamp: '2021-01-03T17:02:53.193Z', + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://onesignal.com/api/v1/players', + headers: { Accept: 'application/json', 'Content-Type': 'application/json' }, + params: {}, + body: { + JSON: { + device_os: '1.12.3', + laguage: 'en-US', + created_at: 1609693373, + last_active: 1609693373, + external_user_id: 'user@27', + app_id: 'random-818c-4a28-b98e-6cd8a994eb22', + device_type: 1, + identifier: 'token', + tags: { + brand: 'John Players', + price: '15000', + firstName: 'Test', + email: 'test@rudderstack.com', + phone: '+917836362334', + userId: 'user@27', + anonymousId: '97c46c81-3140-456d-b2a9-690d70aaca35', + }, + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'one_signal', + description: 'Identify call for Editing a device using playerId', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + destination: { + Config: { + appId: 'random-818c-4a28-b98e-6cd8a994eb22', + emailDeviceType: false, + smsDeviceType: false, + eventAsTags: false, + allowedProperties: [], + }, + }, + message: { + type: 'identify', + sentAt: '2021-01-03T17:02:53.195Z', + userId: 'user@27', + channel: 'mobile', + context: { + externalId: [{ type: 'playerId', id: '85be324d-6dab-4293-ad1f-42199d4c455b' }], + os: { name: '', version: '1.12.3' }, + app: { + name: 'RudderLabs JavaScript SDK', + build: '1.0.0', + version: '1.1.11', + namespace: 'com.rudderlabs.javascript', + }, + traits: { + brand: 'Raymonds', + price: '14000', + firstName: 'Test', + email: 'test@rudderstack.com', + phone: '+917836362334', + userId: 'user@27', + }, + locale: 'en-US', + device: { token: 'token', id: 'id', type: 'android' }, + 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: '8f8fa6b5-8e24-489c-8e22-61f23f2e364f', + messageId: '2116ef8c-efc3-4ca4-851b-02ee60dad6ff', + anonymousId: '97c46c81-3140-456d-b2a9-690d70aaca35', + originalTimestamp: '2021-01-03T17:02:53.193Z', + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'PUT', + endpoint: 'https://onesignal.com/api/v1/players/85be324d-6dab-4293-ad1f-42199d4c455b', + headers: { Accept: 'application/json', 'Content-Type': 'application/json' }, + params: {}, + body: { + JSON: { + device_os: '1.12.3', + laguage: 'en-US', + created_at: 1609693373, + last_active: 1609693373, + external_user_id: 'user@27', + app_id: 'random-818c-4a28-b98e-6cd8a994eb22', + tags: { + brand: 'Raymonds', + price: '14000', + firstName: 'Test', + email: 'test@rudderstack.com', + phone: '+917836362334', + userId: 'user@27', + anonymousId: '97c46c81-3140-456d-b2a9-690d70aaca35', + }, + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'one_signal', + description: 'Track call for updating tags using external_user_id', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + destination: { + Config: { + appId: 'random-818c-4a28-b98e-6cd8a994eb22', + emailDeviceType: false, + smsDeviceType: false, + eventAsTags: false, + allowedProperties: [{ propertyName: 'brand' }, { propertyName: 'price' }], + }, + }, + message: { + event: 'add_to_Cart', + type: 'track', + sentAt: '2021-01-03T17:02:53.195Z', + userId: 'user@27', + channel: 'web', + properties: { brand: 'Zara', price: '12000' }, + context: { + os: { name: '', version: '' }, + app: { + name: 'RudderLabs JavaScript SDK', + build: '1.0.0', + version: '1.1.11', + namespace: 'com.rudderlabs.javascript', + }, + locale: 'en-US', + 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: '8f8fa6b5-8e24-489c-8e22-61f23f2e364f', + messageId: '2116ef8c-efc3-4ca4-851b-02ee60dad6ff', + anonymousId: '97c46c81-3140-456d-b2a9-690d70aaca35', + originalTimestamp: '2021-01-03T17:02:53.193Z', + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + body: { + XML: {}, + FORM: {}, + JSON: { tags: { brand: 'Zara', price: '12000', add_to_Cart: true } }, + JSON_ARRAY: {}, + }, + type: 'REST', + files: {}, + method: 'PUT', + params: {}, + headers: { Accept: 'application/json', 'Content-Type': 'application/json' }, + version: '1', + endpoint: + 'https://onesignal.com/api/v1/apps/random-818c-4a28-b98e-6cd8a994eb22/users/user@27', + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'one_signal', + description: + 'Track call for updating tags using external_user_id (with concatenated event name)', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + destination: { + Config: { + appId: 'random-818c-4a28-b98e-6cd8a994eb22', + emailDeviceType: false, + smsDeviceType: false, + eventAsTags: true, + allowedProperties: [{ propertyName: 'brand' }, { propertyName: 'price' }], + }, + }, + message: { + event: 'add_to_Cart', + type: 'track', + sentAt: '2021-01-03T17:02:53.195Z', + userId: 'user@27', + channel: 'web', + properties: { brand: 'Zara', price: '12000' }, + context: { + os: { name: '', version: '' }, + app: { + name: 'RudderLabs JavaScript SDK', + build: '1.0.0', + version: '1.1.11', + namespace: 'com.rudderlabs.javascript', + }, + locale: 'en-US', + 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: '8f8fa6b5-8e24-489c-8e22-61f23f2e364f', + messageId: '2116ef8c-efc3-4ca4-851b-02ee60dad6ff', + anonymousId: '97c46c81-3140-456d-b2a9-690d70aaca35', + originalTimestamp: '2021-01-03T17:02:53.193Z', + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + body: { + XML: {}, + FORM: {}, + JSON: { + tags: { + add_to_Cart: true, + add_to_Cart_brand: 'Zara', + add_to_Cart_price: '12000', + }, + }, + JSON_ARRAY: {}, + }, + type: 'REST', + files: {}, + method: 'PUT', + params: {}, + headers: { Accept: 'application/json', 'Content-Type': 'application/json' }, + version: '1', + endpoint: + 'https://onesignal.com/api/v1/apps/random-818c-4a28-b98e-6cd8a994eb22/users/user@27', + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'one_signal', + description: + 'Track call with tags key having empty value( Output Behaviour: Those keys will be deleted)', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + destination: { + Config: { + appId: 'random-818c-4a28-b98e-6cd8a994eb22', + emailDeviceType: false, + smsDeviceType: false, + eventAsTags: true, + allowedProperties: [{ propertyName: 'brand' }, { propertyName: 'price' }], + }, + }, + message: { + event: 'add_to_Cart', + type: 'track', + sentAt: '2021-01-03T17:02:53.195Z', + userId: 'user@27', + channel: 'web', + properties: { brand: '', price: '' }, + context: { + os: { name: '', version: '' }, + app: { + name: 'RudderLabs JavaScript SDK', + build: '1.0.0', + version: '1.1.11', + namespace: 'com.rudderlabs.javascript', + }, + locale: 'en-US', + 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: '8f8fa6b5-8e24-489c-8e22-61f23f2e364f', + messageId: '2116ef8c-efc3-4ca4-851b-02ee60dad6ff', + anonymousId: '97c46c81-3140-456d-b2a9-690d70aaca35', + originalTimestamp: '2021-01-03T17:02:53.193Z', + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + body: { + XML: {}, + FORM: {}, + JSON: { tags: { add_to_Cart: true, add_to_Cart_brand: '', add_to_Cart_price: '' } }, + JSON_ARRAY: {}, + }, + type: 'REST', + files: {}, + method: 'PUT', + params: {}, + headers: { Accept: 'application/json', 'Content-Type': 'application/json' }, + version: '1', + endpoint: + 'https://onesignal.com/api/v1/apps/random-818c-4a28-b98e-6cd8a994eb22/users/user@27', + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'one_signal', + description: 'Track call having no allowed properties)', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + destination: { + Config: { + appId: 'random-818c-4a28-b98e-6cd8a994eb22', + emailDeviceType: false, + smsDeviceType: false, + eventAsTags: false, + allowedProperties: [], + }, + }, + message: { + event: 'add_to_Cart', + type: 'track', + sentAt: '2021-01-03T17:02:53.195Z', + userId: 'user@27', + channel: 'web', + properties: { brand: 'zara', price: '10000' }, + context: { + os: { name: '', version: '' }, + app: { + name: 'RudderLabs JavaScript SDK', + build: '1.0.0', + version: '1.1.11', + namespace: 'com.rudderlabs.javascript', + }, + locale: 'en-US', + 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: '8f8fa6b5-8e24-489c-8e22-61f23f2e364f', + messageId: '2116ef8c-efc3-4ca4-851b-02ee60dad6ff', + anonymousId: '97c46c81-3140-456d-b2a9-690d70aaca35', + originalTimestamp: '2021-01-03T17:02:53.193Z', + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + body: { XML: {}, FORM: {}, JSON: { tags: { add_to_Cart: true } }, JSON_ARRAY: {} }, + type: 'REST', + files: {}, + method: 'PUT', + params: {}, + headers: { Accept: 'application/json', 'Content-Type': 'application/json' }, + version: '1', + endpoint: + 'https://onesignal.com/api/v1/apps/random-818c-4a28-b98e-6cd8a994eb22/users/user@27', + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'one_signal', + description: 'Group call ', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + destination: { + Config: { + appId: 'random-818c-4a28-b98e-6cd8a994eb22', + emailDeviceType: false, + smsDeviceType: false, + eventAsTags: true, + allowedProperties: [{ propertyName: 'brand' }, { propertyName: 'price' }], + }, + }, + message: { + type: 'group', + groupId: 'players111', + sentAt: '2021-01-03T17:02:53.195Z', + userId: 'user@27', + channel: 'web', + context: { + os: { name: '', version: '' }, + app: { + name: 'RudderLabs JavaScript SDK', + build: '1.0.0', + version: '1.1.11', + namespace: 'com.rudderlabs.javascript', + }, + traits: { brand: '', price: '10000' }, + locale: 'en-US', + 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: '8f8fa6b5-8e24-489c-8e22-61f23f2e364f', + messageId: '2116ef8c-efc3-4ca4-851b-02ee60dad6ff', + anonymousId: '97c46c81-3140-456d-b2a9-690d70aaca35', + originalTimestamp: '2021-01-03T17:02:53.193Z', + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + body: { + XML: {}, + FORM: {}, + JSON: { tags: { brand: '', price: '10000', groupId: 'players111' } }, + JSON_ARRAY: {}, + }, + type: 'REST', + files: {}, + method: 'PUT', + params: {}, + headers: { Accept: 'application/json', 'Content-Type': 'application/json' }, + version: '1', + endpoint: + 'https://onesignal.com/api/v1/apps/random-818c-4a28-b98e-6cd8a994eb22/users/user@27', + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'one_signal', + description: 'Check for appId', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + destination: { + Config: { + appId: '', + emailDeviceType: false, + smsDeviceType: false, + eventAsTags: true, + allowedProperties: [{ propertyName: 'brand' }, { propertyName: 'price' }], + }, + }, + message: { + type: 'group', + groupId: 'players111', + sentAt: '2021-01-03T17:02:53.195Z', + userId: 'user@27', + channel: 'web', + context: { + os: { name: '', version: '' }, + app: { + name: 'RudderLabs JavaScript SDK', + build: '1.0.0', + version: '1.1.11', + namespace: 'com.rudderlabs.javascript', + }, + traits: { brand: '', price: '10000' }, + locale: 'en-US', + 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: '8f8fa6b5-8e24-489c-8e22-61f23f2e364f', + messageId: '2116ef8c-efc3-4ca4-851b-02ee60dad6ff', + anonymousId: '97c46c81-3140-456d-b2a9-690d70aaca35', + originalTimestamp: '2021-01-03T17:02:53.193Z', + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + error: 'appId is a required field', + statTags: { + destType: 'ONE_SIGNAL', + errorCategory: 'dataValidation', + errorType: 'configuration', + feature: 'processor', + implementation: 'native', + module: 'destination', + }, + statusCode: 400, + }, + ], + }, + }, + }, + { + name: 'one_signal', + description: 'Check for message type', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + destination: { + Config: { + appId: 'random-818c-4a28-b98e-6cd8a994eb22', + emailDeviceType: false, + smsDeviceType: false, + eventAsTags: true, + allowedProperties: [{ propertyName: 'brand' }, { propertyName: 'price' }], + }, + }, + message: { + type: 'page', + groupId: 'players111', + sentAt: '2021-01-03T17:02:53.195Z', + userId: 'user@27', + channel: 'web', + context: { + os: { name: '', version: '' }, + app: { + name: 'RudderLabs JavaScript SDK', + build: '1.0.0', + version: '1.1.11', + namespace: 'com.rudderlabs.javascript', + }, + traits: { brand: '', price: '10000' }, + locale: 'en-US', + 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: '8f8fa6b5-8e24-489c-8e22-61f23f2e364f', + messageId: '2116ef8c-efc3-4ca4-851b-02ee60dad6ff', + anonymousId: '97c46c81-3140-456d-b2a9-690d70aaca35', + originalTimestamp: '2021-01-03T17:02:53.193Z', + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + error: 'Message type page is not supported', + statTags: { + destType: 'ONE_SIGNAL', + errorCategory: 'dataValidation', + errorType: 'instrumentation', + feature: 'processor', + implementation: 'native', + module: 'destination', + }, + statusCode: 400, + }, + ], + }, + }, + }, + { + name: 'one_signal', + description: 'Validating deviceType', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + destination: { + Config: { + appId: 'random-818c-4a28-b98e-6cd8a994eb22', + emailDeviceType: false, + smsDeviceType: false, + eventAsTags: false, + allowedProperties: [], + }, + }, + message: { + type: 'identify', + sentAt: '2021-01-03T17:02:53.195Z', + userId: 'user@27', + 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: { + brand: 'John Players', + price: '15000', + firstName: 'Test', + email: 'test@rudderstack.com', + phone: '+917836362334', + userId: 'user@27', + }, + 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', + }, + integrations: { one_signal: { deviceType: '15', identifier: 'random_id' } }, + rudderId: '8f8fa6b5-8e24-489c-8e22-61f23f2e364f', + messageId: '2116ef8c-efc3-4ca4-851b-02ee60dad6ff', + anonymousId: '97c46c81-3140-456d-b2a9-690d70aaca35', + originalTimestamp: '2021-01-03T17:02:53.193Z', + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + error: 'device_type 15 is not a valid device_type', + statTags: { + destType: 'ONE_SIGNAL', + errorCategory: 'dataValidation', + errorType: 'instrumentation', + feature: 'processor', + implementation: 'native', + module: 'destination', + }, + statusCode: 400, + }, + ], + }, + }, + }, + { + name: 'one_signal', + description: 'check for Message type not present', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + destination: { + Config: { + appId: 'random-818c-4a28-b98e-6cd8a994eb22', + emailDeviceType: false, + smsDeviceType: false, + eventAsTags: false, + allowedProperties: [{ propertyName: 'brand' }, { propertyName: 'price' }], + }, + }, + message: { + event: 'add_to_Cart', + sentAt: '2021-01-03T17:02:53.195Z', + userId: 'user@27', + channel: 'web', + properties: { brand: 'Zara', price: '12000' }, + context: { + os: { name: '', version: '' }, + app: { + name: 'RudderLabs JavaScript SDK', + build: '1.0.0', + version: '1.1.11', + namespace: 'com.rudderlabs.javascript', + }, + locale: 'en-US', + 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: '8f8fa6b5-8e24-489c-8e22-61f23f2e364f', + messageId: '2116ef8c-efc3-4ca4-851b-02ee60dad6ff', + anonymousId: '97c46c81-3140-456d-b2a9-690d70aaca35', + originalTimestamp: '2021-01-03T17:02:53.193Z', + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + error: 'Event type is required', + statTags: { + destType: 'ONE_SIGNAL', + errorCategory: 'dataValidation', + errorType: 'instrumentation', + feature: 'processor', + implementation: 'native', + module: 'destination', + }, + statusCode: 400, + }, + ], + }, + }, + }, + { + name: 'one_signal', + description: 'Check for event name in the track call', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + destination: { + Config: { + appId: 'random-818c-4a28-b98e-6cd8a994eb22', + emailDeviceType: false, + smsDeviceType: false, + eventAsTags: false, + allowedProperties: [{ propertyName: 'brand' }, { propertyName: 'price' }], + }, + }, + message: { + type: 'track', + sentAt: '2021-01-03T17:02:53.195Z', + userId: 'user@27', + channel: 'web', + properties: { brand: 'Zara', price: '12000' }, + context: { + os: { name: '', version: '' }, + app: { + name: 'RudderLabs JavaScript SDK', + build: '1.0.0', + version: '1.1.11', + namespace: 'com.rudderlabs.javascript', + }, + locale: 'en-US', + 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: '8f8fa6b5-8e24-489c-8e22-61f23f2e364f', + messageId: '2116ef8c-efc3-4ca4-851b-02ee60dad6ff', + anonymousId: '97c46c81-3140-456d-b2a9-690d70aaca35', + originalTimestamp: '2021-01-03T17:02:53.193Z', + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + error: 'Event is not present in the input payloads', + statTags: { + destType: 'ONE_SIGNAL', + errorCategory: 'dataValidation', + errorType: 'instrumentation', + feature: 'processor', + implementation: 'native', + module: 'destination', + }, + statusCode: 400, + }, + ], + }, + }, + }, + { + name: 'one_signal', + description: 'Check for groupId ', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + destination: { + Config: { + appId: 'random-818c-4a28-b98e-6cd8a994eb22', + emailDeviceType: false, + smsDeviceType: false, + eventAsTags: true, + allowedProperties: [{ propertyName: 'brand' }, { propertyName: 'price' }], + }, + }, + message: { + type: 'group', + sentAt: '2021-01-03T17:02:53.195Z', + userId: 'user@27', + channel: 'web', + context: { + os: { name: '', version: '' }, + app: { + name: 'RudderLabs JavaScript SDK', + build: '1.0.0', + version: '1.1.11', + namespace: 'com.rudderlabs.javascript', + }, + traits: { brand: '', price: '10000' }, + locale: 'en-US', + 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: '8f8fa6b5-8e24-489c-8e22-61f23f2e364f', + messageId: '2116ef8c-efc3-4ca4-851b-02ee60dad6ff', + anonymousId: '97c46c81-3140-456d-b2a9-690d70aaca35', + originalTimestamp: '2021-01-03T17:02:53.193Z', + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + error: 'groupId is required for group events', + statTags: { + destType: 'ONE_SIGNAL', + errorCategory: 'dataValidation', + errorType: 'instrumentation', + feature: 'processor', + implementation: 'native', + module: 'destination', + }, + statusCode: 400, + }, + ], + }, + }, + }, + { + name: 'one_signal', + description: 'Check for user Id (required field to update the device) for track call', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + destination: { + Config: { + appId: 'random-818c-4a28-b98e-6cd8a994eb22', + emailDeviceType: false, + smsDeviceType: false, + eventAsTags: false, + allowedProperties: [{ propertyName: 'brand' }, { propertyName: 'price' }], + }, + }, + message: { + event: 'add_to_Cart', + type: 'track', + sentAt: '2021-01-03T17:02:53.195Z', + channel: 'web', + properties: { brand: 'Zara', price: '12000' }, + context: { + os: { name: '', version: '' }, + app: { + name: 'RudderLabs JavaScript SDK', + build: '1.0.0', + version: '1.1.11', + namespace: 'com.rudderlabs.javascript', + }, + locale: 'en-US', + 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: '8f8fa6b5-8e24-489c-8e22-61f23f2e364f', + messageId: '2116ef8c-efc3-4ca4-851b-02ee60dad6ff', + anonymousId: '97c46c81-3140-456d-b2a9-690d70aaca35', + originalTimestamp: '2021-01-03T17:02:53.193Z', + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + error: 'userId is required for track events/updating a device', + statTags: { + destType: 'ONE_SIGNAL', + errorCategory: 'dataValidation', + errorType: 'instrumentation', + feature: 'processor', + implementation: 'native', + module: 'destination', + }, + statusCode: 400, + }, + ], + }, + }, + }, +]; diff --git a/test/integrations/destinations/one_signal/router/data.ts b/test/integrations/destinations/one_signal/router/data.ts new file mode 100644 index 0000000000..5f45d2e624 --- /dev/null +++ b/test/integrations/destinations/one_signal/router/data.ts @@ -0,0 +1,286 @@ +export const data = [ + { + name: 'one_signal', + description: 'Test 0', + feature: 'router', + module: 'destination', + version: 'v0', + input: { + request: { + body: { + input: [ + { + destination: { + Config: { + appId: 'random-818c-4a28-b98e-6cd8a994eb22', + emailDeviceType: true, + smsDeviceType: true, + eventAsTags: false, + allowedProperties: [], + }, + }, + metadata: { + jobId: 1, + }, + message: { + type: 'identify', + sentAt: '2021-01-03T17:02:53.195Z', + userId: 'user@27', + 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: { + brand: 'John Players', + price: '15000', + firstName: 'Test', + email: 'test@rudderstack.com', + userId: 'user@27', + }, + 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: '8f8fa6b5-8e24-489c-8e22-61f23f2e364f', + messageId: '2116ef8c-efc3-4ca4-851b-02ee60dad6ff', + anonymousId: '97c46c81-3140-456d-b2a9-690d70aaca35', + originalTimestamp: '2021-01-03T17:02:53.193Z', + }, + }, + { + destination: { + Config: { + appId: 'random-818c-4a28-b98e-6cd8a994eb22', + emailDeviceType: false, + smsDeviceType: false, + eventAsTags: false, + allowedProperties: [ + { + propertyName: 'brand', + }, + { + propertyName: 'price', + }, + ], + }, + }, + metadata: { + jobId: 2, + }, + message: { + event: 'add_to_Cart', + type: 'track', + sentAt: '2021-01-03T17:02:53.195Z', + userId: 'user@27', + channel: 'web', + properties: { + brand: 'Zara', + price: '12000', + }, + context: { + os: { + name: '', + version: '', + }, + app: { + name: 'RudderLabs JavaScript SDK', + build: '1.0.0', + version: '1.1.11', + namespace: 'com.rudderlabs.javascript', + }, + locale: 'en-US', + 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: '8f8fa6b5-8e24-489c-8e22-61f23f2e364f', + messageId: '2116ef8c-efc3-4ca4-851b-02ee60dad6ff', + anonymousId: '97c46c81-3140-456d-b2a9-690d70aaca35', + originalTimestamp: '2021-01-03T17:02:53.193Z', + }, + }, + ], + destType: 'one_signal', + }, + method: 'POST', + }, + }, + output: { + response: { + status: 200, + body: { + output: [ + { + batchedRequest: [ + { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://onesignal.com/api/v1/players', + headers: { + Accept: 'application/json', + 'Content-Type': 'application/json', + }, + params: {}, + body: { + JSON: { + device_os: '1.12.3', + laguage: 'en-US', + created_at: 1609693373, + last_active: 1609693373, + external_user_id: 'user@27', + app_id: 'random-818c-4a28-b98e-6cd8a994eb22', + device_type: 11, + identifier: 'test@rudderstack.com', + tags: { + brand: 'John Players', + price: '15000', + firstName: 'Test', + email: 'test@rudderstack.com', + userId: 'user@27', + anonymousId: '97c46c81-3140-456d-b2a9-690d70aaca35', + }, + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + }, + { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://onesignal.com/api/v1/players', + headers: { + Accept: 'application/json', + 'Content-Type': 'application/json', + }, + params: {}, + body: { + JSON: { + device_os: '1.12.3', + laguage: 'en-US', + created_at: 1609693373, + last_active: 1609693373, + external_user_id: 'user@27', + app_id: 'random-818c-4a28-b98e-6cd8a994eb22', + device_type: 8, + identifier: '97c46c81-3140-456d-b2a9-690d70aaca35', + tags: { + brand: 'John Players', + price: '15000', + firstName: 'Test', + email: 'test@rudderstack.com', + userId: 'user@27', + anonymousId: '97c46c81-3140-456d-b2a9-690d70aaca35', + }, + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + }, + ], + metadata: [ + { + jobId: 1, + }, + ], + batched: false, + statusCode: 200, + destination: { + Config: { + appId: 'random-818c-4a28-b98e-6cd8a994eb22', + emailDeviceType: true, + smsDeviceType: true, + eventAsTags: false, + allowedProperties: [], + }, + }, + }, + { + batchedRequest: { + body: { + XML: {}, + FORM: {}, + JSON: { + tags: { + brand: 'Zara', + price: '12000', + add_to_Cart: true, + }, + }, + JSON_ARRAY: {}, + }, + type: 'REST', + files: {}, + method: 'PUT', + params: {}, + headers: { + Accept: 'application/json', + 'Content-Type': 'application/json', + }, + version: '1', + endpoint: + 'https://onesignal.com/api/v1/apps/random-818c-4a28-b98e-6cd8a994eb22/users/user@27', + }, + metadata: [ + { + jobId: 2, + }, + ], + batched: false, + statusCode: 200, + destination: { + Config: { + appId: 'random-818c-4a28-b98e-6cd8a994eb22', + emailDeviceType: false, + smsDeviceType: false, + eventAsTags: false, + allowedProperties: [ + { + propertyName: 'brand', + }, + { + propertyName: 'price', + }, + ], + }, + }, + }, + ], + }, + }, + }, + }, +]; diff --git a/test/integrations/destinations/pagerduty/processor/data.ts b/test/integrations/destinations/pagerduty/processor/data.ts new file mode 100644 index 0000000000..97fe22daa0 --- /dev/null +++ b/test/integrations/destinations/pagerduty/processor/data.ts @@ -0,0 +1,782 @@ +export const data = [ + { + name: 'pagerduty', + description: 'No Message type', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + sentAt: '2022-10-11T13:10:54.877+05:30', + userId: 'user@45', + rudderId: 'caae04c5-959f-467b-a293-86f6c62d59e6', + messageId: 'b6ce7f31-5d76-4240-94d2-3eea020ef791', + timestamp: '2022-10-11T13:10:52.137+05:30', + receivedAt: '2022-10-11T13:10:52.138+05:30', + request_ip: '[::1]', + originalTimestamp: '2022-10-11T13:10:54.877+05:30', + }, + destination: { Config: { routingKey: '9552b56325dc490bd0139be85f7b8fac' } }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + error: 'Event type is required', + statTags: { + destType: 'PAGERDUTY', + errorCategory: 'dataValidation', + errorType: 'instrumentation', + feature: 'processor', + implementation: 'native', + module: 'destination', + }, + statusCode: 400, + }, + ], + }, + }, + }, + { + name: 'pagerduty', + description: 'Routing Key is not present', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + sentAt: '2022-10-11T13:10:54.877+05:30', + userId: 'user@45', + context: {}, + rudderId: 'caae04c5-959f-467b-a293-86f6c62d59e6', + messageId: 'b6ce7f31-5d76-4240-94d2-3eea020ef791', + timestamp: '2022-10-11T13:10:52.137+05:30', + receivedAt: '2022-10-11T13:10:52.138+05:30', + request_ip: '[::1]', + originalTimestamp: '2022-10-11T13:10:54.877+05:30', + }, + destination: { Config: {} }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + error: 'Routing Key Is Required', + statTags: { + destType: 'PAGERDUTY', + errorCategory: 'dataValidation', + errorType: 'configuration', + feature: 'processor', + implementation: 'native', + module: 'destination', + }, + statusCode: 400, + }, + ], + }, + }, + }, + { + name: 'pagerduty', + description: 'Unsupported Event type', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + type: 'alias', + sentAt: '2022-10-11T13:10:54.877+05:30', + userId: 'user@45', + context: {}, + rudderId: 'caae04c5-959f-467b-a293-86f6c62d59e6', + messageId: 'b6ce7f31-5d76-4240-94d2-3eea020ef791', + timestamp: '2022-10-11T13:10:52.137+05:30', + receivedAt: '2022-10-11T13:10:52.138+05:30', + request_ip: '[::1]', + originalTimestamp: '2022-10-11T13:10:54.877+05:30', + }, + destination: { Config: { routingKey: '9552b56325dc490bd0139be85f7b8fac' } }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + error: 'Event type alias is not supported', + statTags: { + destType: 'PAGERDUTY', + errorCategory: 'dataValidation', + errorType: 'instrumentation', + feature: 'processor', + implementation: 'native', + module: 'destination', + }, + statusCode: 400, + }, + ], + }, + }, + }, + { + name: 'pagerduty', + description: 'event name is not present', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + channel: 'web', + type: 'track', + messageId: '9116b734-7e6b-4497-ab51-c16744d4487e', + userId: 'user@45', + properties: {}, + }, + destination: { Config: { routingKey: '9552b56325dc490bd0139be85f7b8fac' } }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + error: 'Event name is required', + statTags: { + destType: 'PAGERDUTY', + errorCategory: 'dataValidation', + errorType: 'instrumentation', + feature: 'processor', + implementation: 'native', + module: 'destination', + }, + statusCode: 400, + }, + ], + }, + }, + }, + { + name: 'pagerduty', + description: 'Parameter source is not present', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + channel: 'web', + type: 'track', + event: 'Event name is required', + messageId: '9116b734-7e6b-4497-ab51-c16744d4487e', + userId: 'user@45', + properties: { dedupKey: '9116b734-7e6b-4497-ab51-c16744d4487e' }, + }, + destination: { Config: { routingKey: '9552b56325dc490bd0139be85f7b8fac' } }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + error: 'Missing required value from "properties.source"', + statTags: { + destType: 'PAGERDUTY', + errorCategory: 'dataValidation', + errorType: 'instrumentation', + feature: 'processor', + implementation: 'native', + module: 'destination', + }, + statusCode: 400, + }, + ], + }, + }, + }, + { + name: 'pagerduty', + description: 'dedup_key is not present', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + channel: 'web', + type: 'track', + event: 'Event name is required', + messageId: '9116b734-7e6b-4497-ab51-c16744d4487e', + userId: 'user@45', + properties: { action: 'resolve' }, + }, + destination: { + Config: { + routingKey: '9552b56325dc490bd0139be85f7b8fac', + dedupKeyFieldIdentifier: 'properties.dedupKey', + }, + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + error: 'dedup_key required for resolve events', + statTags: { + destType: 'PAGERDUTY', + errorCategory: 'dataValidation', + errorType: 'instrumentation', + feature: 'processor', + implementation: 'native', + module: 'destination', + }, + statusCode: 400, + }, + ], + }, + }, + }, + { + name: 'pagerduty', + description: 'Timestamp older then 90 days', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + channel: 'web', + type: 'track', + event: 'apiSecret is not present', + messageId: '9116b734-7e6b-4497-ab51-c16744d4487e', + userId: 'user@45', + originalTimestamp: '2021-12-20T10:26:33.451Z', + properties: { + action: 'trigger', + dedupKey: '9116b734-7e6b-4497-ab51-c16744d4487e', + severity: 'critical', + component: 'ui', + source: 'rudder-webapp', + group: 'destination', + class: 'connection settings', + customDetails: { 'ping time': '1500ms', 'load avg': 0.75 }, + imageURLs: [ + { + src: 'https://static.s4be.cochrane.org/app/uploads/2017/04/shutterstock_531145954.jpg', + alt: 'first image', + }, + { + src: 'https://chart.googleapis.com/chart?chs=600x400&chd=t:6,2,9,5,2,5,7,4,8,2,1&cht=lc&chds=a&chxt=y&chm=D,0033FF,0,0,5,1', + alt: 'second image', + }, + { alt: 'third image' }, + ], + linkURLs: [ + { + href: 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error', + text: 'Js Object Error', + }, + { + href: 'https://www.techtarget.com/whatis/definition/stack-overflow#:~:text=A%20stack%20overflow%20is%20a,been%20allocated%20to%20that%20stack', + text: 'Stack Overflow Error', + }, + { text: 'Destructure Error' }, + ], + }, + }, + destination: { + Config: { + routingKey: '9552b56325dc490bd0139be85f7b8fac', + dedupKeyFieldIdentifier: 'properties.dedupKey', + }, + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + error: 'Events must be sent within ninety days of their occurrence', + statTags: { + destType: 'PAGERDUTY', + errorCategory: 'dataValidation', + errorType: 'instrumentation', + feature: 'processor', + implementation: 'native', + module: 'destination', + }, + statusCode: 400, + }, + ], + }, + }, + }, + { + name: 'pagerduty', + description: 'Trigger event', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + channel: 'web', + type: 'track', + event: 'apiSecret is not present', + messageId: '9116b734-7e6b-4497-ab51-c16744d4487e', + userId: 'user@45', + properties: { + action: 'trigger', + dedupKey: '9116b734-7e6b-4497-ab51-c16744d4487e', + severity: 'critical', + component: 'ui', + source: 'rudder-webapp', + group: 'destination', + class: 'connection settings', + customDetails: { 'ping time': '1500ms', 'load avg': 0.75 }, + imageURLs: [ + { + src: 'https://static.s4be.cochrane.org/app/uploads/2017/04/shutterstock_531145954.jpg', + alt: 'first image', + }, + { + src: 'https://chart.googleapis.com/chart?chs=600x400&chd=t:6,2,9,5,2,5,7,4,8,2,1&cht=lc&chds=a&chxt=y&chm=D,0033FF,0,0,5,1', + alt: 'second image', + }, + { alt: 'third image' }, + ], + linkURLs: [ + { + href: 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error', + text: 'Js Object Error', + }, + { + href: 'https://www.techtarget.com/whatis/definition/stack-overflow#:~:text=A%20stack%20overflow%20is%20a,been%20allocated%20to%20that%20stack', + text: 'Stack Overflow Error', + }, + { text: 'Destructure Error' }, + ], + }, + }, + destination: { + Config: { + routingKey: '9552b56325dc490bd0139be85f7b8fac', + dedupKeyFieldIdentifier: 'properties.dedupKey', + }, + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + body: { + XML: {}, + FORM: {}, + JSON: { + links: [ + { + href: 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error', + text: 'Js Object Error', + }, + { + href: 'https://www.techtarget.com/whatis/definition/stack-overflow#:~:text=A%20stack%20overflow%20is%20a,been%20allocated%20to%20that%20stack', + text: 'Stack Overflow Error', + }, + ], + images: [ + { + alt: 'first image', + src: 'https://static.s4be.cochrane.org/app/uploads/2017/04/shutterstock_531145954.jpg', + }, + { + alt: 'second image', + src: 'https://chart.googleapis.com/chart?chs=600x400&chd=t:6,2,9,5,2,5,7,4,8,2,1&cht=lc&chds=a&chxt=y&chm=D,0033FF,0,0,5,1', + }, + ], + payload: { + class: 'connection settings', + group: 'destination', + source: 'rudder-webapp', + summary: 'apiSecret is not present', + severity: 'critical', + component: 'ui', + custom_details: { 'ping time': '1500ms', 'load avg': 0.75 }, + }, + dedup_key: '9116b734-7e6b-4497-ab51-c16744d4487e', + routing_key: '9552b56325dc490bd0139be85f7b8fac', + event_action: 'trigger', + }, + JSON_ARRAY: {}, + }, + type: 'REST', + files: {}, + method: 'POST', + params: {}, + headers: { 'Content-Type': 'application/json' }, + version: '1', + endpoint: 'https://events.pagerduty.com/v2/enqueue', + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'pagerduty', + description: 'Acknowledge event', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + channel: 'web', + type: 'track', + event: 'apiSecret is not present', + messageId: '9116b734-7e6b-4497-ab51-c16744d4487e', + userId: 'user@45', + properties: { + action: 'acknowledge', + dedupKey: '9116b734-7e6b-4497-ab51-c16744d4487e', + severity: 'critical', + component: 'ui', + source: 'rudder-webapp', + group: 'destination', + class: 'connection settings', + customDetails: { 'ping time': '1500ms', 'load avg': 0.75 }, + imageURLs: [ + { + src: 'https://static.s4be.cochrane.org/app/uploads/2017/04/shutterstock_531145954.jpg', + alt: 'first image', + }, + { + src: 'https://chart.googleapis.com/chart?chs=600x400&chd=t:6,2,9,5,2,5,7,4,8,2,1&cht=lc&chds=a&chxt=y&chm=D,0033FF,0,0,5,1', + alt: 'second image', + }, + { alt: 'third image' }, + ], + linkURLs: [ + { + href: 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error', + text: 'Js Object Error', + }, + { + href: 'https://www.techtarget.com/whatis/definition/stack-overflow#:~:text=A%20stack%20overflow%20is%20a,been%20allocated%20to%20that%20stack', + text: 'Stack Overflow Error', + }, + { text: 'Destructure Error' }, + ], + }, + }, + destination: { + Config: { + routingKey: '9552b56325dc490bd0139be85f7b8fac', + dedupKeyFieldIdentifier: 'properties.dedupKey', + }, + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + body: { + XML: {}, + FORM: {}, + JSON: { + dedup_key: '9116b734-7e6b-4497-ab51-c16744d4487e', + routing_key: '9552b56325dc490bd0139be85f7b8fac', + event_action: 'acknowledge', + }, + JSON_ARRAY: {}, + }, + type: 'REST', + files: {}, + method: 'POST', + params: {}, + headers: { 'Content-Type': 'application/json' }, + version: '1', + endpoint: 'https://events.pagerduty.com/v2/enqueue', + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'pagerduty', + description: 'Resolve event', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + channel: 'web', + type: 'track', + event: 'apiSecret is not present', + messageId: '9116b734-7e6b-4497-ab51-c16744d4487e', + userId: 'user@45', + properties: { + action: 'resolve', + dedupKey: '9116b734-7e6b-4497-ab51-c16744d4487e', + severity: 'critical', + component: 'ui', + source: 'rudder-webapp', + group: 'destination', + class: 'connection settings', + customDetails: { 'ping time': '1500ms', 'load avg': 0.75 }, + imageURLs: [ + { + src: 'https://static.s4be.cochrane.org/app/uploads/2017/04/shutterstock_531145954.jpg', + alt: 'first image', + }, + { + src: 'https://chart.googleapis.com/chart?chs=600x400&chd=t:6,2,9,5,2,5,7,4,8,2,1&cht=lc&chds=a&chxt=y&chm=D,0033FF,0,0,5,1', + alt: 'second image', + }, + { alt: 'third image' }, + ], + linkURLs: [ + { + href: 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error', + text: 'Js Object Error', + }, + { + href: 'https://www.techtarget.com/whatis/definition/stack-overflow#:~:text=A%20stack%20overflow%20is%20a,been%20allocated%20to%20that%20stack', + text: 'Stack Overflow Error', + }, + { text: 'Destructure Error' }, + ], + }, + }, + destination: { + Config: { + routingKey: '9552b56325dc490bd0139be85f7b8fac', + dedupKeyFieldIdentifier: 'properties.dedupKey', + }, + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + body: { + XML: {}, + FORM: {}, + JSON: { + dedup_key: '9116b734-7e6b-4497-ab51-c16744d4487e', + routing_key: '9552b56325dc490bd0139be85f7b8fac', + event_action: 'resolve', + }, + JSON_ARRAY: {}, + }, + type: 'REST', + files: {}, + method: 'POST', + params: {}, + headers: { 'Content-Type': 'application/json' }, + version: '1', + endpoint: 'https://events.pagerduty.com/v2/enqueue', + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'pagerduty', + description: 'Change event', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + channel: 'web', + type: 'track', + event: 'Github CI/CD Triggered', + messageId: '9116b734-7e6b-4497-ab51-c16744d4487e', + userId: 'user@45', + properties: { + source: 'rudder-webapp', + customDetails: { 'ping time': '1500ms', 'load avg': 0.75 }, + imageURLs: [ + { + src: 'https://static.s4be.cochrane.org/app/uploads/2017/04/shutterstock_531145954.jpg', + alt: 'first image', + }, + { + src: 'https://chart.googleapis.com/chart?chs=600x400&chd=t:6,2,9,5,2,5,7,4,8,2,1&cht=lc&chds=a&chxt=y&chm=D,0033FF,0,0,5,1', + alt: 'second image', + }, + { alt: 'third image' }, + ], + linkURLs: [ + { + href: 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error', + text: 'Js Object Error', + }, + { + href: 'https://www.techtarget.com/whatis/definition/stack-overflow#:~:text=A%20stack%20overflow%20is%20a,been%20allocated%20to%20that%20stack', + text: 'Stack Overflow Error', + }, + { text: 'Destructure Error' }, + ], + }, + integrations: { pagerduty: { type: 'changeEvent' } }, + }, + destination: { + Config: { + routingKey: '9552b56325dc490bd0139be85f7b8fac', + dedupKeyFieldIdentifier: 'properties.dedupKey', + }, + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + body: { + XML: {}, + FORM: {}, + JSON: { + links: [ + { + href: 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error', + text: 'Js Object Error', + }, + { + href: 'https://www.techtarget.com/whatis/definition/stack-overflow#:~:text=A%20stack%20overflow%20is%20a,been%20allocated%20to%20that%20stack', + text: 'Stack Overflow Error', + }, + ], + images: [ + { + alt: 'first image', + src: 'https://static.s4be.cochrane.org/app/uploads/2017/04/shutterstock_531145954.jpg', + }, + { + alt: 'second image', + src: 'https://chart.googleapis.com/chart?chs=600x400&chd=t:6,2,9,5,2,5,7,4,8,2,1&cht=lc&chds=a&chxt=y&chm=D,0033FF,0,0,5,1', + }, + ], + payload: { + source: 'rudder-webapp', + summary: 'Github CI/CD Triggered', + custom_details: { 'load avg': 0.75, 'ping time': '1500ms' }, + }, + routing_key: '9552b56325dc490bd0139be85f7b8fac', + }, + JSON_ARRAY: {}, + }, + type: 'REST', + files: {}, + method: 'POST', + params: {}, + headers: { 'Content-Type': 'application/json' }, + version: '1', + endpoint: 'https://events.pagerduty.com/v2/change/enqueue', + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, +]; diff --git a/test/integrations/destinations/pagerduty/router/data.ts b/test/integrations/destinations/pagerduty/router/data.ts new file mode 100644 index 0000000000..02fd53c629 --- /dev/null +++ b/test/integrations/destinations/pagerduty/router/data.ts @@ -0,0 +1,309 @@ +export const data = [ + { + name: 'pagerduty', + description: 'Test 0', + feature: 'router', + module: 'destination', + version: 'v0', + input: { + request: { + body: { + input: [ + { + message: { + channel: 'web', + type: 'track', + event: 'Github CI/CD Triggered', + messageId: '9116b734-7e6b-4497-ab51-c16744d4487e', + userId: 'user@45', + properties: { + source: 'rudder-webapp', + customDetails: { + 'ping time': '1500ms', + 'load avg': 0.75, + }, + imageURLs: [ + { + src: 'https://static.s4be.cochrane.org/app/uploads/2017/04/shutterstock_531145954.jpg', + alt: 'first image', + }, + { + src: 'https://chart.googleapis.com/chart?chs=600x400&chd=t:6,2,9,5,2,5,7,4,8,2,1&cht=lc&chds=a&chxt=y&chm=D,0033FF,0,0,5,1', + alt: 'second image', + }, + { + alt: 'third image', + }, + ], + linkURLs: [ + { + href: 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error', + text: 'Js Object Error', + }, + { + href: 'https://www.techtarget.com/whatis/definition/stack-overflow#:~:text=A%20stack%20overflow%20is%20a,been%20allocated%20to%20that%20stack', + text: 'Stack Overflow Error', + }, + { + text: 'Destructure Error', + }, + ], + }, + integrations: { + pagerduty: { + type: 'changeEvent', + }, + }, + }, + metadata: { + jobId: 1, + }, + destination: { + Config: { + routingKey: '9552b56325dc490bd0139be85f7b8fac', + dedupKeyFieldIdentifier: 'properties.dedupKey', + }, + }, + }, + { + message: { + channel: 'web', + type: 'track', + event: 'apiSecret is not present', + messageId: '9116b734-7e6b-4497-ab51-c16744d4487e', + userId: 'user@45', + properties: { + action: 'acknowledge', + dedupKey: '9116b734-7e6b-4497-ab51-c16744d4487e', + severity: 'critical', + component: 'ui', + source: 'rudder-webapp', + group: 'destination', + class: 'connection settings', + customDetails: { + 'ping time': '1500ms', + 'load avg': 0.75, + }, + imageURLs: [ + { + src: 'https://static.s4be.cochrane.org/app/uploads/2017/04/shutterstock_531145954.jpg', + alt: 'first image', + }, + { + src: 'https://chart.googleapis.com/chart?chs=600x400&chd=t:6,2,9,5,2,5,7,4,8,2,1&cht=lc&chds=a&chxt=y&chm=D,0033FF,0,0,5,1', + alt: 'second image', + }, + { + alt: 'third image', + }, + ], + linkURLs: [ + { + href: 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error', + text: 'Js Object Error', + }, + { + href: 'https://www.techtarget.com/whatis/definition/stack-overflow#:~:text=A%20stack%20overflow%20is%20a,been%20allocated%20to%20that%20stack', + text: 'Stack Overflow Error', + }, + { + text: 'Destructure Error', + }, + ], + }, + }, + metadata: { + jobId: 2, + }, + destination: { + Config: { + routingKey: '9552b56325dc490bd0139be85f7b8fac', + dedupKeyFieldIdentifier: 'properties.dedupKey', + }, + }, + }, + { + message: { + channel: 'web', + type: 'track', + event: 'apiSecret is not present', + messageId: '9116b734-7e6b-4497-ab51-c16744d4487e', + userId: 'user@45', + originalTimestamp: '2021-12-20T10:26:33.451Z', + properties: { + action: 'trigger', + dedupKey: '9116b734-7e6b-4497-ab51-c16744d4487e', + severity: 'critical', + component: 'ui', + source: 'rudder-webapp', + group: 'destination', + class: 'connection settings', + customDetails: { + 'ping time': '1500ms', + 'load avg': 0.75, + }, + imageURLs: [ + { + src: 'https://static.s4be.cochrane.org/app/uploads/2017/04/shutterstock_531145954.jpg', + alt: 'first image', + }, + { + src: 'https://chart.googleapis.com/chart?chs=600x400&chd=t:6,2,9,5,2,5,7,4,8,2,1&cht=lc&chds=a&chxt=y&chm=D,0033FF,0,0,5,1', + alt: 'second image', + }, + { + alt: 'third image', + }, + ], + linkURLs: [ + { + href: 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error', + text: 'Js Object Error', + }, + { + href: 'https://www.techtarget.com/whatis/definition/stack-overflow#:~:text=A%20stack%20overflow%20is%20a,been%20allocated%20to%20that%20stack', + text: 'Stack Overflow Error', + }, + { + text: 'Destructure Error', + }, + ], + }, + }, + metadata: { + jobId: 3, + }, + destination: { + Config: { + routingKey: '9552b56325dc490bd0139be85f7b8fac', + dedupKeyFieldIdentifier: 'properties.dedupKey', + }, + }, + }, + ], + destType: 'pagerduty', + }, + method: 'POST', + }, + }, + output: { + response: { + status: 200, + body: { + output: [ + { + batched: false, + batchedRequest: { + body: { + XML: {}, + FORM: {}, + JSON: { + links: [ + { + href: 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error', + text: 'Js Object Error', + }, + { + href: 'https://www.techtarget.com/whatis/definition/stack-overflow#:~:text=A%20stack%20overflow%20is%20a,been%20allocated%20to%20that%20stack', + text: 'Stack Overflow Error', + }, + ], + images: [ + { + alt: 'first image', + src: 'https://static.s4be.cochrane.org/app/uploads/2017/04/shutterstock_531145954.jpg', + }, + { + alt: 'second image', + src: 'https://chart.googleapis.com/chart?chs=600x400&chd=t:6,2,9,5,2,5,7,4,8,2,1&cht=lc&chds=a&chxt=y&chm=D,0033FF,0,0,5,1', + }, + ], + payload: { + source: 'rudder-webapp', + summary: 'Github CI/CD Triggered', + custom_details: { + 'load avg': 0.75, + 'ping time': '1500ms', + }, + }, + routing_key: '9552b56325dc490bd0139be85f7b8fac', + }, + JSON_ARRAY: {}, + }, + type: 'REST', + files: {}, + method: 'POST', + params: {}, + headers: { + 'Content-Type': 'application/json', + }, + version: '1', + endpoint: 'https://events.pagerduty.com/v2/change/enqueue', + }, + destination: { + Config: { + routingKey: '9552b56325dc490bd0139be85f7b8fac', + dedupKeyFieldIdentifier: 'properties.dedupKey', + }, + }, + metadata: [{ jobId: 1 }], + statusCode: 200, + }, + { + batched: false, + batchedRequest: { + body: { + XML: {}, + FORM: {}, + JSON: { + dedup_key: '9116b734-7e6b-4497-ab51-c16744d4487e', + routing_key: '9552b56325dc490bd0139be85f7b8fac', + event_action: 'acknowledge', + }, + JSON_ARRAY: {}, + }, + type: 'REST', + files: {}, + method: 'POST', + params: {}, + headers: { + 'Content-Type': 'application/json', + }, + version: '1', + endpoint: 'https://events.pagerduty.com/v2/enqueue', + }, + destination: { + Config: { + routingKey: '9552b56325dc490bd0139be85f7b8fac', + dedupKeyFieldIdentifier: 'properties.dedupKey', + }, + }, + metadata: [{ jobId: 2 }], + statusCode: 200, + }, + { + batched: false, + error: 'Events must be sent within ninety days of their occurrence', + metadata: [{ jobId: 3 }], + statusCode: 400, + statTags: { + destType: 'PAGERDUTY', + feature: 'router', + module: 'destination', + implementation: 'native', + errorCategory: 'dataValidation', + errorType: 'instrumentation', + }, + destination: { + Config: { + routingKey: '9552b56325dc490bd0139be85f7b8fac', + dedupKeyFieldIdentifier: 'properties.dedupKey', + }, + }, + }, + ], + }, + }, + }, + }, +]; diff --git a/test/integrations/destinations/pardot/router/data.ts b/test/integrations/destinations/pardot/router/data.ts new file mode 100644 index 0000000000..28680deafc --- /dev/null +++ b/test/integrations/destinations/pardot/router/data.ts @@ -0,0 +1,1017 @@ +export const data = [ + { + name: 'pardot', + description: 'Test 0', + feature: 'router', + module: 'destination', + version: 'v0', + input: { + request: { + body: { + input: [ + { + destination: { + Config: { + rudderAccountId: '1z8LpaSAuFR9TPWL6fECZfjmRa-', + businessUnitId: '0Uv2v000000k9tHCAQ', + campaignId: 42213, + authStatus: 'active', + eventDelivery: true, + eventDeliveryTS: 1636965406397, + }, + DestinationDefinition: { + name: 'PARDOT', + displayName: 'Pardot', + config: { + auth: { + type: 'OAuth', + }, + transformAt: 'router', + transformAtV1: 'router', + saveDestinationResponse: true, + includeKeys: [], + excludeKeys: [], + supportedSourceTypes: [ + 'android', + 'ios', + 'web', + 'unity', + 'amp', + 'cloud', + 'warehouse', + 'reactnative', + 'flutter', + 'cordova', + ], + destConfig: { + defaultConfig: ['rudderAccountId', 'businessUnitId', 'campaignId'], + }, + secretKeys: ['businessUnitId'], + }, + }, + Enabled: true, + ID: '1WXjIHpu7ETXgjfiGPW3kCUgZFR', + Name: 'test destination', + Transformations: [], + }, + metadata: { + jobId: 1, + secret: { + access_token: 'myToken', + refresh_token: 'myRefreshToken', + }, + }, + message: { + type: 'identify', + event: 'navigated user', + sentAt: '2021-09-08T11:10:45.466Z', + userId: 'user12345', + 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:5500/index.html', + path: '/index.html', + title: 'Document', + search: '', + tab_url: 'http://127.0.0.1:5500/index.html', + referrer: '$direct', + initial_referrer: '$direct', + referring_domain: '', + initial_referring_domain: '', + }, + locale: 'en-GB', + screen: { + width: 1536, + height: 960, + density: 2, + innerWidth: 1536, + innerHeight: 776, + }, + traits: {}, + 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/91.0.4472.77 Safari/537.36', + externalId: [ + { + type: 'pardotId', + id: 123435, + }, + ], + }, + rudderId: 'fa2994a5-2a81-45fd-9919-fcf5596ad380', + messageId: 'e2d1a383-d9a2-4e03-a9dc-131d153c4d95', + timestamp: '2021-11-15T14:06:42.497+05:30', + properties: {}, + receivedAt: '2021-11-15T14:06:42.497+05:30', + request_ip: '[::1]', + anonymousId: 'd8b2ed61-7fa5-4ef8-bd92-6a506157c0cf', + integrations: { + All: true, + }, + originalTimestamp: '2021-09-08T11:10:45.466Z', + traits: { + email: 'Roger12@waltair.io', + active_seats: 4, + firstName: 'Roger12', + lastName: 'Federer12', + website: 'https://rudderstack.com', + score: 14, + }, + }, + }, + { + destination: { + Config: { + rudderAccountId: '1z8LpaSAuFR9TPWL6fECZfjmRa-', + businessUnitId: '0Uv2v000000k9tHCAQ', + campaignId: 42213, + authStatus: 'active', + eventDelivery: true, + eventDeliveryTS: 1636965406397, + }, + DestinationDefinition: { + name: 'PARDOT', + displayName: 'Pardot', + config: { + auth: { + type: 'OAuth', + }, + transformAt: 'router', + transformAtV1: 'router', + saveDestinationResponse: true, + includeKeys: [], + excludeKeys: [], + supportedSourceTypes: [ + 'android', + 'ios', + 'web', + 'unity', + 'amp', + 'cloud', + 'warehouse', + 'reactnative', + 'flutter', + 'cordova', + ], + destConfig: { + defaultConfig: ['rudderAccountId', 'businessUnitId', 'campaignId'], + }, + secretKeys: ['businessUnitId'], + }, + }, + Enabled: true, + ID: '1WXjIHpu7ETXgjfiGPW3kCUgZFR', + Name: 'test destination', + Transformations: [], + }, + metadata: { + jobId: 2, + secret: { + access_token: 'myToken', + refresh_token: 'myRefreshToken', + }, + }, + message: { + type: 'identify', + event: 'insert product', + sentAt: '2021-09-08T11:10:45.466Z', + userId: 'user12345', + 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:5500/index.html', + path: '/index.html', + title: 'Document', + search: '', + tab_url: 'http://127.0.0.1:5500/index.html', + referrer: '$direct', + initial_referrer: '$direct', + referring_domain: '', + initial_referring_domain: '', + }, + locale: 'en-GB', + screen: { + width: 1536, + height: 960, + density: 2, + innerWidth: 1536, + innerHeight: 776, + }, + traits: {}, + 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/91.0.4472.77 Safari/537.36', + }, + rudderId: 'fa2994a5-2a81-45fd-9919-fcf5596ad380', + messageId: 'e2d1a383-d9a2-4e03-a9dc-131d153c4d95', + timestamp: '2021-11-15T14:06:42.497+05:30', + properties: {}, + receivedAt: '2021-11-15T14:06:42.497+05:30', + request_ip: '[::1]', + anonymousId: 'd8b2ed61-7fa5-4ef8-bd92-6a506157c0cf', + integrations: { + All: true, + }, + originalTimestamp: '2021-09-08T11:10:45.466Z', + traits: { + email: 'Roger_12@waltair.io', + active_seats: 4, + firstName: 'Roger_12', + lastName: 'Federer_12', + website: 'https://rudderstack.com', + score: 14, + }, + }, + }, + { + destination: { + Config: { + rudderAccountId: '1z8LpaSAuFR9TPWL6fECZfjmRa-', + businessUnitId: '0Uv2v000000k9tHCAQ', + campaignId: 42213, + authStatus: 'active', + eventDelivery: true, + eventDeliveryTS: 1636965406397, + }, + DestinationDefinition: { + name: 'PARDOT', + displayName: 'Pardot', + config: { + auth: { + type: 'OAuth', + }, + transformAt: 'router', + transformAtV1: 'router', + saveDestinationResponse: true, + includeKeys: [], + excludeKeys: [], + supportedSourceTypes: [ + 'android', + 'ios', + 'web', + 'unity', + 'amp', + 'cloud', + 'warehouse', + 'reactnative', + 'flutter', + 'cordova', + ], + destConfig: { + defaultConfig: ['rudderAccountId', 'businessUnitId', 'campaignId'], + }, + secretKeys: ['businessUnitId'], + }, + }, + Enabled: true, + ID: '1WXjIHpu7ETXgjfiGPW3kCUgZFR', + Name: 'test destination', + Transformations: [], + }, + metadata: { + jobId: 3, + secret: { + access_token: 'myToken', + refresh_token: 'myRefreshToken', + }, + }, + message: { + type: 'identify', + event: 'insert product', + sentAt: '2021-09-08T11:10:45.466Z', + userId: 'user12345', + 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:5500/index.html', + path: '/index.html', + title: 'Document', + search: '', + tab_url: 'http://127.0.0.1:5500/index.html', + referrer: '$direct', + initial_referrer: '$direct', + referring_domain: '', + initial_referring_domain: '', + }, + locale: 'en-GB', + screen: { + width: 1536, + height: 960, + density: 2, + innerWidth: 1536, + innerHeight: 776, + }, + traits: {}, + 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/91.0.4472.77 Safari/537.36', + externalId: [ + { + type: 'crmfid', + id: '00Q6r000002LKhTPVR', + }, + ], + }, + rudderId: 'fa2994a5-2a81-45fd-9919-fcf5596ad380', + messageId: 'e2d1a383-d9a2-4e03-a9dc-131d153c4d95', + timestamp: '2021-11-15T14:06:42.497+05:30', + properties: {}, + receivedAt: '2021-11-15T14:06:42.497+05:30', + request_ip: '[::1]', + anonymousId: 'd8b2ed61-7fa5-4ef8-bd92-6a506157c0cf', + integrations: { + All: true, + }, + originalTimestamp: '2021-09-08T11:10:45.466Z', + traits: { + email: 'nick_kyrgios@waltair.io', + active_seats: 4, + firstName: 'Nick', + lastName: 'Kyrgios', + website: 'https://rudderstack.com', + score: 12, + }, + }, + }, + { + destination: { + Config: { + rudderAccountId: '1z8LpaSAuFR9TPWL6fECZfjmRa-', + businessUnitId: '0Uv2v000000k9tHCAQ', + campaignId: 42213, + authStatus: 'active', + eventDelivery: true, + eventDeliveryTS: 1636965406397, + }, + DestinationDefinition: { + name: 'PARDOT', + displayName: 'Pardot', + config: { + auth: { + type: 'OAuth', + }, + transformAt: 'router', + transformAtV1: 'router', + saveDestinationResponse: true, + includeKeys: [], + excludeKeys: [], + supportedSourceTypes: [ + 'android', + 'ios', + 'web', + 'unity', + 'amp', + 'cloud', + 'warehouse', + 'reactnative', + 'flutter', + 'cordova', + ], + destConfig: { + defaultConfig: ['rudderAccountId', 'businessUnitId', 'campaignId'], + }, + secretKeys: ['businessUnitId'], + }, + }, + Enabled: true, + ID: '1WXjIHpu7ETXgjfiGPW3kCUgZFR', + Name: 'test destination', + Transformations: [], + }, + metadata: { + jobId: 4, + secret: { + access_token: 'myExpiredToken', + refresh_token: 'myRefreshToken', + }, + }, + message: { + type: 'identify', + event: 'navigated user', + sentAt: '2021-09-08T11:10:45.466Z', + userId: 'user12345', + 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:5500/index.html', + path: '/index.html', + title: 'Document', + search: '', + tab_url: 'http://127.0.0.1:5500/index.html', + referrer: '$direct', + initial_referrer: '$direct', + referring_domain: '', + initial_referring_domain: '', + }, + locale: 'en-GB', + screen: { + width: 1536, + height: 960, + density: 2, + innerWidth: 1536, + innerHeight: 776, + }, + traits: {}, + 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/91.0.4472.77 Safari/537.36', + }, + rudderId: 'fa2994a5-2a81-45fd-9919-fcf5596ad380', + messageId: 'e2d1a383-d9a2-4e03-a9dc-131d153c4d95', + timestamp: '2021-11-15T14:06:42.497+05:30', + properties: {}, + receivedAt: '2021-11-15T14:06:42.497+05:30', + request_ip: '[::1]', + anonymousId: 'd8b2ed61-7fa5-4ef8-bd92-6a506157c0cf', + integrations: { + All: true, + }, + originalTimestamp: '2021-09-08T11:10:45.466Z', + traits: { + email: 'rolex_waltair@mywebsite.io', + active_seats: 4, + firstName: 'Rolex', + lastName: 'Waltair', + website: 'https://rudderstack.com', + score: 15, + }, + }, + }, + { + destination: { + Config: { + rudderAccountId: '1z8LpaSAuFR9TPWL6fECZfjmRa-', + businessUnitId: '0Uv2v000000k9tHCAQ', + campaignId: 42213, + authStatus: 'active', + eventDelivery: true, + eventDeliveryTS: 1636965406397, + }, + DestinationDefinition: { + name: 'PARDOT', + displayName: 'Pardot', + config: { + auth: { + type: 'OAuth', + }, + transformAt: 'router', + transformAtV1: 'router', + saveDestinationResponse: true, + includeKeys: [], + excludeKeys: [], + supportedSourceTypes: [ + 'android', + 'ios', + 'web', + 'unity', + 'amp', + 'cloud', + 'warehouse', + 'reactnative', + 'flutter', + 'cordova', + ], + destConfig: { + defaultConfig: ['rudderAccountId', 'businessUnitId', 'campaignId'], + }, + secretKeys: ['businessUnitId'], + }, + }, + Enabled: true, + ID: '1WXjIHpu7ETXgjfiGPW3kCUgZFR', + Name: 'test destination', + Transformations: [], + }, + metadata: { + jobId: 5, + secret: null, + }, + message: { + type: 'identify', + event: 'navigated user', + sentAt: '2021-09-08T11:10:45.466Z', + userId: 'user12345', + 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:5500/index.html', + path: '/index.html', + title: 'Document', + search: '', + tab_url: 'http://127.0.0.1:5500/index.html', + referrer: '$direct', + initial_referrer: '$direct', + referring_domain: '', + initial_referring_domain: '', + }, + locale: 'en-GB', + screen: { + width: 1536, + height: 960, + density: 2, + innerWidth: 1536, + innerHeight: 776, + }, + traits: {}, + 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/91.0.4472.77 Safari/537.36', + }, + rudderId: 'fa2994a5-2a81-45fd-9919-fcf5596ad380', + messageId: 'e2d1a383-d9a2-4e03-a9dc-131d153c4d95', + timestamp: '2021-11-15T14:06:42.497+05:30', + properties: {}, + receivedAt: '2021-11-15T14:06:42.497+05:30', + request_ip: '[::1]', + anonymousId: 'd8b2ed61-7fa5-4ef8-bd92-6a506157c0cf', + integrations: { + All: true, + }, + originalTimestamp: '2021-09-08T11:10:45.466Z', + traits: { + email: 'rolex_waltair@mywebsite.io', + active_seats: 4, + firstName: 'Rolex', + lastName: 'Waltair', + website: 'https://rudderstack.com', + score: 15, + }, + }, + }, + ], + destType: 'pardot', + }, + method: 'POST', + }, + }, + output: { + response: { + status: 200, + body: { + output: [ + { + batchedRequest: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://pi.pardot.com/api/prospect/version/4/do/upsert/id/123435', + headers: { + Authorization: 'Bearer myToken', + 'Pardot-Business-Unit-Id': '0Uv2v000000k9tHCAQ', + }, + params: {}, + body: { + JSON: {}, + JSON_ARRAY: {}, + XML: {}, + FORM: { + first_name: 'Roger12', + last_name: 'Federer12', + website: 'https://rudderstack.com', + score: 14, + campaign_id: 42213, + }, + }, + files: {}, + }, + metadata: [ + { + jobId: 1, + secret: { + access_token: 'myToken', + refresh_token: 'myRefreshToken', + }, + }, + ], + batched: false, + statusCode: 200, + destination: { + Config: { + rudderAccountId: '1z8LpaSAuFR9TPWL6fECZfjmRa-', + businessUnitId: '0Uv2v000000k9tHCAQ', + campaignId: 42213, + authStatus: 'active', + eventDelivery: true, + eventDeliveryTS: 1636965406397, + }, + DestinationDefinition: { + name: 'PARDOT', + displayName: 'Pardot', + config: { + auth: { + type: 'OAuth', + }, + transformAt: 'router', + transformAtV1: 'router', + saveDestinationResponse: true, + includeKeys: [], + excludeKeys: [], + supportedSourceTypes: [ + 'android', + 'ios', + 'web', + 'unity', + 'amp', + 'cloud', + 'warehouse', + 'reactnative', + 'flutter', + 'cordova', + ], + destConfig: { + defaultConfig: ['rudderAccountId', 'businessUnitId', 'campaignId'], + }, + secretKeys: ['businessUnitId'], + }, + }, + Enabled: true, + ID: '1WXjIHpu7ETXgjfiGPW3kCUgZFR', + Name: 'test destination', + Transformations: [], + }, + }, + { + batchedRequest: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: + 'https://pi.pardot.com/api/prospect/version/4/do/upsert/email/Roger_12@waltair.io', + headers: { + Authorization: 'Bearer myToken', + 'Pardot-Business-Unit-Id': '0Uv2v000000k9tHCAQ', + }, + params: {}, + body: { + JSON: {}, + JSON_ARRAY: {}, + XML: {}, + FORM: { + first_name: 'Roger_12', + last_name: 'Federer_12', + website: 'https://rudderstack.com', + score: 14, + campaign_id: 42213, + }, + }, + files: {}, + }, + metadata: [ + { + jobId: 2, + secret: { + access_token: 'myToken', + refresh_token: 'myRefreshToken', + }, + }, + ], + batched: false, + statusCode: 200, + destination: { + Config: { + rudderAccountId: '1z8LpaSAuFR9TPWL6fECZfjmRa-', + businessUnitId: '0Uv2v000000k9tHCAQ', + campaignId: 42213, + authStatus: 'active', + eventDelivery: true, + eventDeliveryTS: 1636965406397, + }, + DestinationDefinition: { + name: 'PARDOT', + displayName: 'Pardot', + config: { + auth: { + type: 'OAuth', + }, + transformAt: 'router', + transformAtV1: 'router', + saveDestinationResponse: true, + includeKeys: [], + excludeKeys: [], + supportedSourceTypes: [ + 'android', + 'ios', + 'web', + 'unity', + 'amp', + 'cloud', + 'warehouse', + 'reactnative', + 'flutter', + 'cordova', + ], + destConfig: { + defaultConfig: ['rudderAccountId', 'businessUnitId', 'campaignId'], + }, + secretKeys: ['businessUnitId'], + }, + }, + Enabled: true, + ID: '1WXjIHpu7ETXgjfiGPW3kCUgZFR', + Name: 'test destination', + Transformations: [], + }, + }, + { + batchedRequest: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: + 'https://pi.pardot.com/api/prospect/version/4/do/upsert/fid/00Q6r000002LKhTPVR', + headers: { + Authorization: 'Bearer myToken', + 'Pardot-Business-Unit-Id': '0Uv2v000000k9tHCAQ', + }, + params: {}, + body: { + JSON: {}, + JSON_ARRAY: {}, + XML: {}, + FORM: { + first_name: 'Nick', + last_name: 'Kyrgios', + website: 'https://rudderstack.com', + score: 12, + campaign_id: 42213, + }, + }, + files: {}, + }, + metadata: [ + { + jobId: 3, + secret: { + access_token: 'myToken', + refresh_token: 'myRefreshToken', + }, + }, + ], + batched: false, + statusCode: 200, + destination: { + Config: { + rudderAccountId: '1z8LpaSAuFR9TPWL6fECZfjmRa-', + businessUnitId: '0Uv2v000000k9tHCAQ', + campaignId: 42213, + authStatus: 'active', + eventDelivery: true, + eventDeliveryTS: 1636965406397, + }, + DestinationDefinition: { + name: 'PARDOT', + displayName: 'Pardot', + config: { + auth: { + type: 'OAuth', + }, + transformAt: 'router', + transformAtV1: 'router', + saveDestinationResponse: true, + includeKeys: [], + excludeKeys: [], + supportedSourceTypes: [ + 'android', + 'ios', + 'web', + 'unity', + 'amp', + 'cloud', + 'warehouse', + 'reactnative', + 'flutter', + 'cordova', + ], + destConfig: { + defaultConfig: ['rudderAccountId', 'businessUnitId', 'campaignId'], + }, + secretKeys: ['businessUnitId'], + }, + }, + Enabled: true, + ID: '1WXjIHpu7ETXgjfiGPW3kCUgZFR', + Name: 'test destination', + Transformations: [], + }, + }, + { + batchedRequest: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: + 'https://pi.pardot.com/api/prospect/version/4/do/upsert/email/rolex_waltair@mywebsite.io', + headers: { + Authorization: 'Bearer myExpiredToken', + 'Pardot-Business-Unit-Id': '0Uv2v000000k9tHCAQ', + }, + params: {}, + body: { + JSON: {}, + JSON_ARRAY: {}, + XML: {}, + FORM: { + first_name: 'Rolex', + last_name: 'Waltair', + website: 'https://rudderstack.com', + score: 15, + campaign_id: 42213, + }, + }, + files: {}, + }, + metadata: [ + { + jobId: 4, + secret: { + access_token: 'myExpiredToken', + refresh_token: 'myRefreshToken', + }, + }, + ], + batched: false, + statusCode: 200, + destination: { + Config: { + rudderAccountId: '1z8LpaSAuFR9TPWL6fECZfjmRa-', + businessUnitId: '0Uv2v000000k9tHCAQ', + campaignId: 42213, + authStatus: 'active', + eventDelivery: true, + eventDeliveryTS: 1636965406397, + }, + DestinationDefinition: { + name: 'PARDOT', + displayName: 'Pardot', + config: { + auth: { + type: 'OAuth', + }, + transformAt: 'router', + transformAtV1: 'router', + saveDestinationResponse: true, + includeKeys: [], + excludeKeys: [], + supportedSourceTypes: [ + 'android', + 'ios', + 'web', + 'unity', + 'amp', + 'cloud', + 'warehouse', + 'reactnative', + 'flutter', + 'cordova', + ], + destConfig: { + defaultConfig: ['rudderAccountId', 'businessUnitId', 'campaignId'], + }, + secretKeys: ['businessUnitId'], + }, + }, + Enabled: true, + ID: '1WXjIHpu7ETXgjfiGPW3kCUgZFR', + Name: 'test destination', + Transformations: [], + }, + }, + { + destination: { + Config: { + rudderAccountId: '1z8LpaSAuFR9TPWL6fECZfjmRa-', + businessUnitId: '0Uv2v000000k9tHCAQ', + campaignId: 42213, + authStatus: 'active', + eventDelivery: true, + eventDeliveryTS: 1636965406397, + }, + DestinationDefinition: { + name: 'PARDOT', + displayName: 'Pardot', + config: { + auth: { + type: 'OAuth', + }, + transformAt: 'router', + transformAtV1: 'router', + saveDestinationResponse: true, + includeKeys: [], + excludeKeys: [], + supportedSourceTypes: [ + 'android', + 'ios', + 'web', + 'unity', + 'amp', + 'cloud', + 'warehouse', + 'reactnative', + 'flutter', + 'cordova', + ], + destConfig: { + defaultConfig: ['rudderAccountId', 'businessUnitId', 'campaignId'], + }, + secretKeys: ['businessUnitId'], + }, + }, + Enabled: true, + ID: '1WXjIHpu7ETXgjfiGPW3kCUgZFR', + Name: 'test destination', + Transformations: [], + }, + metadata: [ + { + jobId: 5, + secret: null, + }, + ], + batched: false, + statusCode: 500, + error: 'OAuth - access token not found', + statTags: { + destType: 'PARDOT', + feature: 'router', + implementation: 'native', + errorCategory: 'platform', + module: 'destination', + errorType: 'oAuthSecret', + }, + }, + ], + }, + }, + }, + }, +]; diff --git a/test/integrations/destinations/personalize/processor/data.ts b/test/integrations/destinations/personalize/processor/data.ts new file mode 100644 index 0000000000..012aae25bb --- /dev/null +++ b/test/integrations/destinations/personalize/processor/data.ts @@ -0,0 +1,4188 @@ +export const data = [ + { + name: 'personalize', + description: 'Test 0', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + anonymousId: 'anon-id-new', + context: { ip: '14.5.67.21', library: { name: 'http' } }, + event: 'PRODUCT ADDED', + messageId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + originalTimestamp: '2021-03-13T01:56:46.896+05:30', + properties: { + numberOfRatings: 'checking with webapp change', + movieWatched: 2, + eventValue: 7.06, + }, + receivedAt: '2021-03-13T01:56:44.340+05:30', + request_ip: '[::1]', + rudderId: 'daf823fb-e8d3-413a-8313-d34cd756f968', + sentAt: '2021-03-13T01:56:46.896+05:30', + timestamp: '2020-02-02T00:23:09.544Z', + type: 'track', + userId: 'identified user id', + }, + metadata: { + sourceId: '1pe7ty3hMMQCnrfZ0Mn2QG48884', + destinationId: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + jobId: 1, + destinationType: 'PERSONALIZE', + messageId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + messageIds: null, + rudderId: 'daf823fb-e8d3-413a-8313-d34cd756f968', + receivedAt: '2021-03-13T01:56:44.340+05:30', + }, + destination: { + ID: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + Name: 'personalize Dev Testing', + DestinationDefinition: { + ID: '1pdthjPnz8gQhSTE2QTbm2LUMGM', + Name: 'PERSONALIZE', + DisplayName: 'AWS Personalize', + Config: { + destConfig: { + defaultConfig: [ + 'accessKeyId', + 'secretAccessKey', + 'region', + 'trackingId', + 'eventName', + 'customMappings', + ], + }, + excludeKeys: [], + includeKeys: [], + saveDestinationResponse: true, + secretKeys: ['accessKeyId', 'secretAccessKey'], + supportedSourceTypes: [ + 'android', + 'ios', + 'web', + 'unity', + 'amp', + 'cloud', + 'reactnative', + ], + transformAt: 'processor', + }, + }, + Config: { + accessKeyId: 'ABC', + customMappings: [ + { from: 'MOVIE_WATCHED', to: 'movieWatched' }, + { from: 'NUMBER_OF_RATINGS', to: 'numberOfRatings' }, + ], + datasetARN: '', + eventChoice: 'PutEvents', + region: 'us-east-1', + secretAccessKey: 'DEF', + trackingId: 'c60', + }, + Enabled: true, + Transformations: [], + IsProcessorEnabled: true, + }, + libraries: [], + request: { query: {} }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + metadata: { + destinationId: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + destinationType: 'PERSONALIZE', + jobId: 1, + messageId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + messageIds: null, + receivedAt: '2021-03-13T01:56:44.340+05:30', + rudderId: 'daf823fb-e8d3-413a-8313-d34cd756f968', + sourceId: '1pe7ty3hMMQCnrfZ0Mn2QG48884', + }, + output: { + sessionId: 'anon-id-new', + trackingId: 'c60', + userId: 'identified user id', + eventList: [ + { + itemId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + eventType: 'PRODUCT ADDED', + sentAt: '2020-02-02T00:23:09.544Z', + properties: { movieWatched: '2', numberOfRatings: 'checking with webapp change' }, + }, + ], + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'personalize', + description: 'Test 1', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + anonymousId: 'anon-id-new', + context: { ip: '14.5.67.21', library: { name: 'http' } }, + event: 'PRODUCT DELETED', + messageId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + originalTimestamp: '2021-03-13T01:56:46.896+05:30', + properties: { + numberOfRatings: 'checking with webapp change', + typeOfMovie: 'Art Film', + }, + receivedAt: '2021-03-13T01:56:44.340+05:30', + request_ip: '[::1]', + rudderId: 'daf823fb-e8d3-413a-8313-d34cd756f968', + sentAt: '2021-03-13T01:56:46.896+05:30', + timestamp: '2020-02-02T00:23:09.544Z', + type: 'track', + userId: 'identified user id', + }, + metadata: { + sourceId: '1pe7ty3hMMQCnrfZ0Mn2QG48884', + destinationId: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + jobId: 1, + destinationType: 'PERSONALIZE', + messageId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + messageIds: null, + rudderId: 'daf823fb-e8d3-413a-8313-d34cd756f968', + receivedAt: '2021-03-13T01:56:44.340+05:30', + }, + destination: { + ID: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + Name: 'personalize Dev Testing', + DestinationDefinition: { + ID: '1pdthjPnz8gQhSTE2QTbm2LUMGM', + Name: 'PERSONALIZE', + DisplayName: 'AWS Personalize', + Config: { + destConfig: { + defaultConfig: [ + 'accessKeyId', + 'secretAccessKey', + 'region', + 'trackingId', + 'eventName', + 'customMappings', + ], + }, + excludeKeys: [], + includeKeys: [], + saveDestinationResponse: true, + secretKeys: ['accessKeyId', 'secretAccessKey'], + supportedSourceTypes: [ + 'android', + 'ios', + 'web', + 'unity', + 'amp', + 'cloud', + 'reactnative', + ], + transformAt: 'processor', + }, + }, + Config: { + accessKeyId: 'ABC', + customMappings: [ + { from: 'TYPE_OF_MOVIE', to: 'typeOfMovie' }, + { from: 'NUMBER_OF_RATINGS', to: 'numberOfRatings' }, + ], + region: 'us-east-1', + datasetARN: '', + eventChoice: 'PutEvents', + secretAccessKey: 'DEF', + trackingId: 'c60', + }, + Enabled: true, + Transformations: [], + IsProcessorEnabled: true, + }, + libraries: [], + request: { query: {} }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + metadata: { + sourceId: '1pe7ty3hMMQCnrfZ0Mn2QG48884', + destinationId: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + jobId: 1, + destinationType: 'PERSONALIZE', + messageId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + messageIds: null, + rudderId: 'daf823fb-e8d3-413a-8313-d34cd756f968', + receivedAt: '2021-03-13T01:56:44.340+05:30', + }, + output: { + sessionId: 'anon-id-new', + trackingId: 'c60', + userId: 'identified user id', + eventList: [ + { + itemId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + eventType: 'PRODUCT DELETED', + sentAt: '2020-02-02T00:23:09.544Z', + properties: { + typeOfMovie: 'Art Film', + numberOfRatings: 'checking with webapp change', + }, + }, + ], + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'personalize', + description: 'Test 2', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + anonymousId: 'anon-id-new', + context: { ip: '14.5.67.21', library: { name: 'http' } }, + event: 'PRODUCT DELETED', + messageId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + originalTimestamp: '2021-03-13T01:56:46.896+05:30', + properties: { + numberOfRatings: 'checking with webapp change', + typeOfMovie: 'Art Film', + }, + receivedAt: '2021-03-13T01:56:44.340+05:30', + request_ip: '[::1]', + rudderId: 'daf823fb-e8d3-413a-8313-d34cd756f968', + sentAt: '2021-03-13T01:56:46.896+05:30', + timestamp: '2020-02-02T00:23:09.544Z', + type: 'track', + userId: 'identified user id', + }, + metadata: { + sourceId: '1pe7ty3hMMQCnrfZ0Mn2QG48884', + destinationId: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + jobId: 1, + destinationType: 'PERSONALIZE', + messageId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + messageIds: null, + rudderId: 'daf823fb-e8d3-413a-8313-d34cd756f968', + receivedAt: '2021-03-13T01:56:44.340+05:30', + }, + destination: { + ID: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + Name: 'personalize Dev Testing', + DestinationDefinition: { + ID: '1pdthjPnz8gQhSTE2QTbm2LUMGM', + Name: 'PERSONALIZE', + DisplayName: 'AWS Personalize', + Config: { + destConfig: { + defaultConfig: [ + 'accessKeyId', + 'secretAccessKey', + 'region', + 'trackingId', + 'eventName', + 'customMappings', + ], + }, + excludeKeys: [], + includeKeys: [], + saveDestinationResponse: true, + secretKeys: ['accessKeyId', 'secretAccessKey'], + supportedSourceTypes: [ + 'android', + 'ios', + 'web', + 'unity', + 'amp', + 'cloud', + 'reactnative', + ], + transformAt: 'processor', + }, + }, + Config: { + accessKeyId: 'ABC', + customMappings: [ + { from: 'TYPE_OF_MOVIE', to: 'typeOfMovie' }, + { from: 'NUMBER_OF_RATINGS', to: 'numberOfRatings' }, + { from: 'ITEM_ID', to: 'itemId' }, + ], + datasetARN: '', + eventChoice: 'PutEvents', + region: 'us-east-1', + secretAccessKey: 'DEF', + trackingId: 'c60', + }, + Enabled: true, + Transformations: [], + IsProcessorEnabled: true, + }, + libraries: [], + request: { query: {} }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + metadata: { + sourceId: '1pe7ty3hMMQCnrfZ0Mn2QG48884', + destinationId: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + jobId: 1, + destinationType: 'PERSONALIZE', + messageId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + messageIds: null, + rudderId: 'daf823fb-e8d3-413a-8313-d34cd756f968', + receivedAt: '2021-03-13T01:56:44.340+05:30', + }, + output: { + sessionId: 'anon-id-new', + trackingId: 'c60', + userId: 'identified user id', + eventList: [ + { + itemId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + eventType: 'PRODUCT DELETED', + sentAt: '2020-02-02T00:23:09.544Z', + properties: { + typeOfMovie: 'Art Film', + numberOfRatings: 'checking with webapp change', + }, + }, + ], + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'personalize', + description: 'Test 3', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + anonymousId: 'anon-id-new', + context: { ip: '14.5.67.21', library: { name: 'http' } }, + event: 'PRODUCT DELETED', + messageId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + originalTimestamp: '2021-03-13T01:56:46.896+05:30', + properties: { + numberOfRatings: 'checking with webapp change', + typeOfMovie: 'Art Film', + itemId: 'item 1', + }, + receivedAt: '2021-03-13T01:56:44.340+05:30', + request_ip: '[::1]', + rudderId: 'daf823fb-e8d3-413a-8313-d34cd756f968', + sentAt: '2021-03-13T01:56:46.896+05:30', + timestamp: '2020-02-02T00:23:09.544Z', + type: 'track', + userId: 'identified user id', + }, + metadata: { + sourceId: '1pe7ty3hMMQCnrfZ0Mn2QG48884', + destinationId: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + jobId: 1, + destinationType: 'PERSONALIZE', + messageId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + messageIds: null, + rudderId: 'daf823fb-e8d3-413a-8313-d34cd756f968', + receivedAt: '2021-03-13T01:56:44.340+05:30', + }, + destination: { + ID: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + Name: 'personalize Dev Testing', + DestinationDefinition: { + ID: '1pdthjPnz8gQhSTE2QTbm2LUMGM', + Name: 'PERSONALIZE', + DisplayName: 'AWS Personalize', + Config: { + destConfig: { + defaultConfig: [ + 'accessKeyId', + 'secretAccessKey', + 'region', + 'trackingId', + 'eventName', + 'customMappings', + ], + }, + excludeKeys: [], + includeKeys: [], + saveDestinationResponse: true, + secretKeys: ['accessKeyId', 'secretAccessKey'], + supportedSourceTypes: [ + 'android', + 'ios', + 'web', + 'unity', + 'amp', + 'cloud', + 'reactnative', + ], + transformAt: 'processor', + }, + }, + Config: { + accessKeyId: 'ABC', + customMappings: [ + { from: 'TYPE_OF_MOVIE', to: 'typeOfMovie' }, + { from: 'NUMBER_OF_RATINGS', to: 'numberOfRatings' }, + { from: 'ITEM_ID', to: 'itemId' }, + ], + datasetARN: '', + eventChoice: 'PutEvents', + region: 'us-east-1', + secretAccessKey: 'DEF', + trackingId: 'c60', + }, + Enabled: true, + Transformations: [], + IsProcessorEnabled: true, + }, + libraries: [], + request: { query: {} }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + metadata: { + sourceId: '1pe7ty3hMMQCnrfZ0Mn2QG48884', + destinationId: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + jobId: 1, + destinationType: 'PERSONALIZE', + messageId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + messageIds: null, + rudderId: 'daf823fb-e8d3-413a-8313-d34cd756f968', + receivedAt: '2021-03-13T01:56:44.340+05:30', + }, + output: { + sessionId: 'anon-id-new', + trackingId: 'c60', + userId: 'identified user id', + eventList: [ + { + itemId: 'item 1', + eventType: 'PRODUCT DELETED', + sentAt: '2020-02-02T00:23:09.544Z', + properties: { + typeOfMovie: 'Art Film', + numberOfRatings: 'checking with webapp change', + }, + }, + ], + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'personalize', + description: 'Test 4', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + anonymousId: 'anon-id-new', + context: { ip: '14.5.67.21', library: { name: 'http' } }, + event: 'PRODUCT DELETED', + messageId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + originalTimestamp: '2021-03-13T01:56:46.896+05:30', + properties: { + numberOfRatings: 'checking with webapp change', + typeOfMovie: 'Art Film', + itemId: 'item 1', + }, + receivedAt: '2021-03-13T01:56:44.340+05:30', + request_ip: '[::1]', + rudderId: 'daf823fb-e8d3-413a-8313-d34cd756f968', + sentAt: '2021-03-13T01:56:46.896+05:30', + timestamp: '2020-02-02T00:23:09.544Z', + type: 'track', + userId: 'identified user id', + }, + metadata: { + sourceId: '1pe7ty3hMMQCnrfZ0Mn2QG48884', + destinationId: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + jobId: 1, + destinationType: 'PERSONALIZE', + messageId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + messageIds: null, + rudderId: 'daf823fb-e8d3-413a-8313-d34cd756f968', + receivedAt: '2021-03-13T01:56:44.340+05:30', + }, + destination: { + ID: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + Name: 'personalize Dev Testing', + DestinationDefinition: { + ID: '1pdthjPnz8gQhSTE2QTbm2LUMGM', + Name: 'PERSONALIZE', + DisplayName: 'AWS Personalize', + Config: { + destConfig: { + defaultConfig: [ + 'accessKeyId', + 'secretAccessKey', + 'region', + 'trackingId', + 'eventName', + 'customMappings', + ], + }, + excludeKeys: [], + includeKeys: [], + saveDestinationResponse: true, + secretKeys: ['accessKeyId', 'secretAccessKey'], + supportedSourceTypes: [ + 'android', + 'ios', + 'web', + 'unity', + 'amp', + 'cloud', + 'reactnative', + ], + transformAt: 'processor', + }, + }, + Config: { + accessKeyId: 'ABC', + customMappings: [ + { from: 'TYPE_OF_MOVIE', to: 'typeOfMovie' }, + { from: 'NUMBER_OF_RATINGS', to: 'numberOfRatings' }, + ], + datasetARN: '', + eventChoice: 'PutEvents', + region: 'us-east-1', + secretAccessKey: 'DEF', + trackingId: 'c60', + }, + Enabled: true, + Transformations: [], + IsProcessorEnabled: true, + }, + libraries: [], + request: { query: {} }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + metadata: { + sourceId: '1pe7ty3hMMQCnrfZ0Mn2QG48884', + destinationId: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + jobId: 1, + destinationType: 'PERSONALIZE', + messageId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + messageIds: null, + rudderId: 'daf823fb-e8d3-413a-8313-d34cd756f968', + receivedAt: '2021-03-13T01:56:44.340+05:30', + }, + output: { + sessionId: 'anon-id-new', + trackingId: 'c60', + userId: 'identified user id', + eventList: [ + { + itemId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + eventType: 'PRODUCT DELETED', + sentAt: '2020-02-02T00:23:09.544Z', + properties: { + typeOfMovie: 'Art Film', + numberOfRatings: 'checking with webapp change', + }, + }, + ], + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'personalize', + description: 'Test 5', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + anonymousId: 'anon-id-new', + context: { ip: '14.5.67.21', library: { name: 'http' } }, + event: 'PRODUCT DELETED', + messageId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + originalTimestamp: '2021-03-13T01:56:46.896+05:30', + properties: { + numberOfRatings: 'checking with webapp change', + typeOfMovie: 'Art Film', + itemId: 'item 1', + }, + receivedAt: '2021-03-13T01:56:44.340+05:30', + request_ip: '[::1]', + rudderId: 'daf823fb-e8d3-413a-8313-d34cd756f968', + sentAt: '2021-03-13T01:56:46.896+05:30', + timestamp: '2020-02-02T00:23:09.544Z', + type: 'track', + userId: 'identified user id', + }, + metadata: { + sourceId: '1pe7ty3hMMQCnrfZ0Mn2QG48884', + destinationId: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + jobId: 1, + destinationType: 'PERSONALIZE', + messageId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + messageIds: null, + rudderId: 'daf823fb-e8d3-413a-8313-d34cd756f968', + receivedAt: '2021-03-13T01:56:44.340+05:30', + }, + destination: { + ID: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + Name: 'personalize Dev Testing', + DestinationDefinition: { + ID: '1pdthjPnz8gQhSTE2QTbm2LUMGM', + Name: 'PERSONALIZE', + DisplayName: 'AWS Personalize', + Config: { + destConfig: { + defaultConfig: [ + 'accessKeyId', + 'secretAccessKey', + 'region', + 'trackingId', + 'eventName', + 'customMappings', + ], + }, + excludeKeys: [], + includeKeys: [], + saveDestinationResponse: true, + secretKeys: ['accessKeyId', 'secretAccessKey'], + supportedSourceTypes: [ + 'android', + 'ios', + 'web', + 'unity', + 'amp', + 'cloud', + 'reactnative', + ], + transformAt: 'processor', + }, + }, + Config: { + accessKeyId: 'ABC', + customMappings: [ + { from: 'TYPE_OF_MOVIE', to: 'typeOfMovie' }, + { from: 'NUMBER_OF_RATINGS', to: 'numberOfRatings' }, + { from: 'USER_ID', to: 'userId' }, + ], + datasetARN: '', + eventChoice: 'PutEvents', + region: 'us-east-1', + secretAccessKey: 'DEF', + trackingId: 'c60', + }, + Enabled: true, + Transformations: [], + IsProcessorEnabled: true, + }, + libraries: [], + request: { query: {} }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + metadata: { + sourceId: '1pe7ty3hMMQCnrfZ0Mn2QG48884', + destinationId: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + jobId: 1, + destinationType: 'PERSONALIZE', + messageId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + messageIds: null, + rudderId: 'daf823fb-e8d3-413a-8313-d34cd756f968', + receivedAt: '2021-03-13T01:56:44.340+05:30', + }, + output: { + sessionId: 'anon-id-new', + trackingId: 'c60', + userId: 'identified user id', + eventList: [ + { + itemId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + eventType: 'PRODUCT DELETED', + sentAt: '2020-02-02T00:23:09.544Z', + properties: { + typeOfMovie: 'Art Film', + numberOfRatings: 'checking with webapp change', + }, + }, + ], + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'personalize', + description: 'Test 6', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + anonymousId: 'anon-id-new', + context: { ip: '14.5.67.21', library: { name: 'http' } }, + event: 'PRODUCT DELETED', + messageId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + originalTimestamp: '2021-03-13T01:56:46.896+05:30', + properties: { + numberOfRatings: 'checking with webapp change', + typeOfMovie: 'Art Film', + itemId: 'item 1', + userId: 'user 1', + }, + receivedAt: '2021-03-13T01:56:44.340+05:30', + request_ip: '[::1]', + rudderId: 'daf823fb-e8d3-413a-8313-d34cd756f968', + sentAt: '2021-03-13T01:56:46.896+05:30', + timestamp: '2020-02-02T00:23:09.544Z', + type: 'track', + userId: 'identified user id', + }, + metadata: { + sourceId: '1pe7ty3hMMQCnrfZ0Mn2QG48884', + destinationId: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + jobId: 1, + destinationType: 'PERSONALIZE', + messageId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + messageIds: null, + rudderId: 'daf823fb-e8d3-413a-8313-d34cd756f968', + receivedAt: '2021-03-13T01:56:44.340+05:30', + }, + destination: { + ID: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + Name: 'personalize Dev Testing', + DestinationDefinition: { + ID: '1pdthjPnz8gQhSTE2QTbm2LUMGM', + Name: 'PERSONALIZE', + DisplayName: 'AWS Personalize', + Config: { + destConfig: { + defaultConfig: [ + 'accessKeyId', + 'secretAccessKey', + 'region', + 'trackingId', + 'eventName', + 'customMappings', + ], + }, + excludeKeys: [], + includeKeys: [], + saveDestinationResponse: true, + secretKeys: ['accessKeyId', 'secretAccessKey'], + supportedSourceTypes: [ + 'android', + 'ios', + 'web', + 'unity', + 'amp', + 'cloud', + 'reactnative', + ], + transformAt: 'processor', + }, + }, + Config: { + accessKeyId: 'ABC', + customMappings: [ + { from: 'TYPE_OF_MOVIE', to: 'typeOfMovie' }, + { from: 'NUMBER_OF_RATINGS', to: 'numberOfRatings' }, + { from: 'USER_ID', to: 'userId' }, + ], + datasetARN: '', + eventChoice: 'PutEvents', + region: 'us-east-1', + secretAccessKey: 'DEF', + trackingId: 'c60', + }, + Enabled: true, + Transformations: [], + IsProcessorEnabled: true, + }, + libraries: [], + request: { query: {} }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + metadata: { + sourceId: '1pe7ty3hMMQCnrfZ0Mn2QG48884', + destinationId: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + jobId: 1, + destinationType: 'PERSONALIZE', + messageId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + messageIds: null, + rudderId: 'daf823fb-e8d3-413a-8313-d34cd756f968', + receivedAt: '2021-03-13T01:56:44.340+05:30', + }, + output: { + sessionId: 'anon-id-new', + trackingId: 'c60', + userId: 'user 1', + eventList: [ + { + itemId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + eventType: 'PRODUCT DELETED', + sentAt: '2020-02-02T00:23:09.544Z', + properties: { + typeOfMovie: 'Art Film', + numberOfRatings: 'checking with webapp change', + }, + }, + ], + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'personalize', + description: 'Test 7', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + anonymousId: 'anon-id-new', + context: { ip: '14.5.67.21', library: { name: 'http' } }, + event: 'PRODUCT DELETED', + messageId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + originalTimestamp: '2021-03-13T01:56:46.896+05:30', + properties: { + numberOfRatings: 'checking with webapp change', + typeOfMovie: 'Art Film', + itemId: 'item 1', + userId: 'user 1', + }, + receivedAt: '2021-03-13T01:56:44.340+05:30', + request_ip: '[::1]', + rudderId: 'daf823fb-e8d3-413a-8313-d34cd756f968', + sentAt: '2021-03-13T01:56:46.896+05:30', + timestamp: '2020-02-02T00:23:09.544Z', + type: 'track', + userId: 'identified user id', + }, + metadata: { + sourceId: '1pe7ty3hMMQCnrfZ0Mn2QG48884', + destinationId: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + jobId: 1, + destinationType: 'PERSONALIZE', + messageId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + messageIds: null, + rudderId: 'daf823fb-e8d3-413a-8313-d34cd756f968', + receivedAt: '2021-03-13T01:56:44.340+05:30', + }, + destination: { + ID: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + Name: 'personalize Dev Testing', + DestinationDefinition: { + ID: '1pdthjPnz8gQhSTE2QTbm2LUMGM', + Name: 'PERSONALIZE', + DisplayName: 'AWS Personalize', + Config: { + destConfig: { + defaultConfig: [ + 'accessKeyId', + 'secretAccessKey', + 'region', + 'trackingId', + 'eventName', + 'customMappings', + ], + }, + excludeKeys: [], + includeKeys: [], + saveDestinationResponse: true, + secretKeys: ['accessKeyId', 'secretAccessKey'], + supportedSourceTypes: [ + 'android', + 'ios', + 'web', + 'unity', + 'amp', + 'cloud', + 'reactnative', + ], + transformAt: 'processor', + }, + }, + Config: { + accessKeyId: 'ABC', + customMappings: [ + { from: 'TYPE_OF_MOVIE', to: 'typeOfMovie' }, + { from: 'NUMBER_OF_RATINGS', to: 'numberOfRatings' }, + ], + datasetARN: '', + eventChoice: 'PutEvents', + region: 'us-east-1', + secretAccessKey: 'DEF', + trackingId: 'c60', + }, + Enabled: true, + Transformations: [], + IsProcessorEnabled: true, + }, + libraries: [], + request: { query: {} }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + metadata: { + sourceId: '1pe7ty3hMMQCnrfZ0Mn2QG48884', + destinationId: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + jobId: 1, + destinationType: 'PERSONALIZE', + messageId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + messageIds: null, + rudderId: 'daf823fb-e8d3-413a-8313-d34cd756f968', + receivedAt: '2021-03-13T01:56:44.340+05:30', + }, + output: { + sessionId: 'anon-id-new', + trackingId: 'c60', + userId: 'identified user id', + eventList: [ + { + itemId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + eventType: 'PRODUCT DELETED', + sentAt: '2020-02-02T00:23:09.544Z', + properties: { + typeOfMovie: 'Art Film', + numberOfRatings: 'checking with webapp change', + }, + }, + ], + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'personalize', + description: 'Test 8', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + anonymousId: 'anon-id-new', + context: { ip: '14.5.67.21', library: { name: 'http' } }, + event: 'PRODUCT DELETED', + messageId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + originalTimestamp: '2021-03-13T01:56:46.896+05:30', + properties: { + numberOfRatings: 'checking with webapp change', + typeOfMovie: 'Art Film', + itemId: 'item 1', + userId: 'user 1', + impressions: 'abc', + }, + receivedAt: '2021-03-13T01:56:44.340+05:30', + request_ip: '[::1]', + rudderId: 'daf823fb-e8d3-413a-8313-d34cd756f968', + sentAt: '2021-03-13T01:56:46.896+05:30', + timestamp: '2020-02-02T00:23:09.544Z', + type: 'track', + userId: 'identified user id', + }, + metadata: { + sourceId: '1pe7ty3hMMQCnrfZ0Mn2QG48884', + destinationId: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + jobId: 1, + destinationType: 'PERSONALIZE', + messageId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + messageIds: null, + rudderId: 'daf823fb-e8d3-413a-8313-d34cd756f968', + receivedAt: '2021-03-13T01:56:44.340+05:30', + }, + destination: { + ID: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + Name: 'personalize Dev Testing', + DestinationDefinition: { + ID: '1pdthjPnz8gQhSTE2QTbm2LUMGM', + Name: 'PERSONALIZE', + DisplayName: 'AWS Personalize', + Config: { + destConfig: { + defaultConfig: [ + 'accessKeyId', + 'secretAccessKey', + 'region', + 'trackingId', + 'eventName', + 'customMappings', + ], + }, + excludeKeys: [], + includeKeys: [], + saveDestinationResponse: true, + secretKeys: ['accessKeyId', 'secretAccessKey'], + supportedSourceTypes: [ + 'android', + 'ios', + 'web', + 'unity', + 'amp', + 'cloud', + 'reactnative', + ], + transformAt: 'processor', + }, + }, + Config: { + accessKeyId: 'ABC', + customMappings: [ + { from: 'TYPE_OF_MOVIE', to: 'typeOfMovie' }, + { from: 'NUMBER_OF_RATINGS', to: 'numberOfRatings' }, + { from: 'IMPRESSION', to: 'impressions' }, + ], + datasetARN: '', + eventChoice: 'PutEvents', + region: 'us-east-1', + secretAccessKey: 'DEF', + trackingId: 'c60', + }, + Enabled: true, + Transformations: [], + IsProcessorEnabled: true, + }, + libraries: [], + request: { query: {} }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + metadata: { + sourceId: '1pe7ty3hMMQCnrfZ0Mn2QG48884', + destinationId: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + jobId: 1, + destinationType: 'PERSONALIZE', + messageId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + messageIds: null, + rudderId: 'daf823fb-e8d3-413a-8313-d34cd756f968', + receivedAt: '2021-03-13T01:56:44.340+05:30', + }, + output: { + userId: 'identified user id', + sessionId: 'anon-id-new', + trackingId: 'c60', + eventList: [ + { + eventType: 'PRODUCT DELETED', + sentAt: '2020-02-02T00:23:09.544Z', + properties: { + typeOfMovie: 'Art Film', + numberOfRatings: 'checking with webapp change', + }, + impression: ['abc'], + itemId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + }, + ], + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'personalize', + description: 'Test 9', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + anonymousId: 'anon-id-new', + context: { ip: '14.5.67.21', library: { name: 'http' } }, + event: 'PRODUCT DELETED', + messageId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + originalTimestamp: '2021-03-13T01:56:46.896+05:30', + properties: { + numberOfRatings: 'checking with webapp change', + typeOfMovie: 'Art Film', + itemId: 'item 1', + userId: 'user 1', + impressions: 'abc', + eventValue: '3.4abc', + }, + receivedAt: '2021-03-13T01:56:44.340+05:30', + request_ip: '[::1]', + rudderId: 'daf823fb-e8d3-413a-8313-d34cd756f968', + sentAt: '2021-03-13T01:56:46.896+05:30', + timestamp: '2020-02-02T00:23:09.544Z', + type: 'track', + userId: 'identified user id', + }, + metadata: { + sourceId: '1pe7ty3hMMQCnrfZ0Mn2QG48884', + destinationId: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + jobId: 1, + destinationType: 'PERSONALIZE', + messageId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + messageIds: null, + rudderId: 'daf823fb-e8d3-413a-8313-d34cd756f968', + receivedAt: '2021-03-13T01:56:44.340+05:30', + }, + destination: { + ID: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + Name: 'personalize Dev Testing', + DestinationDefinition: { + ID: '1pdthjPnz8gQhSTE2QTbm2LUMGM', + Name: 'PERSONALIZE', + DisplayName: 'AWS Personalize', + Config: { + destConfig: { + defaultConfig: [ + 'accessKeyId', + 'secretAccessKey', + 'region', + 'trackingId', + 'eventName', + 'customMappings', + ], + }, + excludeKeys: [], + includeKeys: [], + saveDestinationResponse: true, + secretKeys: ['accessKeyId', 'secretAccessKey'], + supportedSourceTypes: [ + 'android', + 'ios', + 'web', + 'unity', + 'amp', + 'cloud', + 'reactnative', + ], + transformAt: 'processor', + }, + }, + Config: { + accessKeyId: 'ABC', + customMappings: [ + { from: 'TYPE_OF_MOVIE', to: 'typeOfMovie' }, + { from: 'NUMBER_OF_RATINGS', to: 'numberOfRatings' }, + { from: 'IMPRESSION', to: 'impressions' }, + { from: 'EVENT_VALUE', to: 'eventValue' }, + ], + datasetARN: '', + eventChoice: 'PutEvents', + region: 'us-east-1', + secretAccessKey: 'DEF', + trackingId: 'c60', + }, + Enabled: true, + Transformations: [], + IsProcessorEnabled: true, + }, + libraries: [], + request: { query: {} }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + metadata: { + sourceId: '1pe7ty3hMMQCnrfZ0Mn2QG48884', + destinationId: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + jobId: 1, + destinationType: 'PERSONALIZE', + messageId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + messageIds: null, + rudderId: 'daf823fb-e8d3-413a-8313-d34cd756f968', + receivedAt: '2021-03-13T01:56:44.340+05:30', + }, + output: { + userId: 'identified user id', + sessionId: 'anon-id-new', + trackingId: 'c60', + eventList: [ + { + eventType: 'PRODUCT DELETED', + sentAt: '2020-02-02T00:23:09.544Z', + properties: { + typeOfMovie: 'Art Film', + numberOfRatings: 'checking with webapp change', + }, + impression: ['abc'], + eventValue: 3.4, + itemId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + }, + ], + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'personalize', + description: 'Test 10', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + anonymousId: 'anon-id-new', + context: { ip: '14.5.67.21', library: { name: 'http' } }, + event: 'PRODUCT DELETED', + messageId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + originalTimestamp: '2021-03-13T01:56:46.896+05:30', + properties: { + numberOfRatings: 'checking with webapp change', + typeOfMovie: 'Art Film', + itemId: 'item 1', + userId: 'user 1', + impressions: [2, 3], + eventValue: '3.4abc', + }, + receivedAt: '2021-03-13T01:56:44.340+05:30', + request_ip: '[::1]', + rudderId: 'daf823fb-e8d3-413a-8313-d34cd756f968', + sentAt: '2021-03-13T01:56:46.896+05:30', + timestamp: '2020-02-02T00:23:09.544Z', + type: 'track', + userId: 'identified user id', + }, + metadata: { + sourceId: '1pe7ty3hMMQCnrfZ0Mn2QG48884', + destinationId: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + jobId: 1, + destinationType: 'PERSONALIZE', + messageId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + messageIds: null, + rudderId: 'daf823fb-e8d3-413a-8313-d34cd756f968', + receivedAt: '2021-03-13T01:56:44.340+05:30', + }, + destination: { + ID: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + Name: 'personalize Dev Testing', + DestinationDefinition: { + ID: '1pdthjPnz8gQhSTE2QTbm2LUMGM', + Name: 'PERSONALIZE', + DisplayName: 'AWS Personalize', + Config: { + destConfig: { + defaultConfig: [ + 'accessKeyId', + 'secretAccessKey', + 'region', + 'trackingId', + 'eventName', + 'customMappings', + ], + }, + excludeKeys: [], + includeKeys: [], + saveDestinationResponse: true, + secretKeys: ['accessKeyId', 'secretAccessKey'], + supportedSourceTypes: [ + 'android', + 'ios', + 'web', + 'unity', + 'amp', + 'cloud', + 'reactnative', + ], + transformAt: 'processor', + }, + }, + Config: { + accessKeyId: 'ABC', + customMappings: [ + { from: 'TYPE_OF_MOVIE', to: 'typeOfMovie' }, + { from: 'NUMBER_OF_RATINGS', to: 'numberOfRatings' }, + { from: 'IMPRESSION', to: 'impressions' }, + { from: 'EVENT_VALUE', to: 'eventValue' }, + ], + datasetARN: '', + eventChoice: 'PutEvents', + region: 'us-east-1', + secretAccessKey: 'DEF', + trackingId: 'c60', + }, + Enabled: true, + Transformations: [], + IsProcessorEnabled: true, + }, + libraries: [], + request: { query: {} }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + metadata: { + sourceId: '1pe7ty3hMMQCnrfZ0Mn2QG48884', + destinationId: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + jobId: 1, + destinationType: 'PERSONALIZE', + messageId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + messageIds: null, + rudderId: 'daf823fb-e8d3-413a-8313-d34cd756f968', + receivedAt: '2021-03-13T01:56:44.340+05:30', + }, + output: { + userId: 'identified user id', + sessionId: 'anon-id-new', + trackingId: 'c60', + eventList: [ + { + eventType: 'PRODUCT DELETED', + sentAt: '2020-02-02T00:23:09.544Z', + properties: { + typeOfMovie: 'Art Film', + numberOfRatings: 'checking with webapp change', + }, + impression: ['2', '3'], + eventValue: 3.4, + itemId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + }, + ], + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'personalize', + description: 'Test 11', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + context: { ip: '14.5.67.21', library: { name: 'http' } }, + event: 'PRODUCT DELETED', + messageId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + originalTimestamp: '2021-03-13T01:56:46.896+05:30', + properties: { + numberOfRatings: 'checking with webapp change', + typeOfMovie: 'Art Film', + itemId: 'item 1', + userId: 'user 1', + impressions: [2, 3], + eventValue: '3.4abc', + }, + receivedAt: '2021-03-13T01:56:44.340+05:30', + request_ip: '[::1]', + rudderId: 'daf823fb-e8d3-413a-8313-d34cd756f968', + sentAt: '2021-03-13T01:56:46.896+05:30', + timestamp: '2020-02-02T00:23:09.544Z', + type: 'track', + userId: 'identified user id', + }, + metadata: { + sourceId: '1pe7ty3hMMQCnrfZ0Mn2QG48884', + destinationId: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + jobId: 1, + destinationType: 'PERSONALIZE', + messageId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + messageIds: null, + rudderId: 'daf823fb-e8d3-413a-8313-d34cd756f968', + receivedAt: '2021-03-13T01:56:44.340+05:30', + }, + destination: { + ID: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + Name: 'personalize Dev Testing', + DestinationDefinition: { + ID: '1pdthjPnz8gQhSTE2QTbm2LUMGM', + Name: 'PERSONALIZE', + DisplayName: 'AWS Personalize', + Config: { + destConfig: { + defaultConfig: [ + 'accessKeyId', + 'secretAccessKey', + 'region', + 'trackingId', + 'eventName', + 'customMappings', + ], + }, + excludeKeys: [], + includeKeys: [], + saveDestinationResponse: true, + secretKeys: ['accessKeyId', 'secretAccessKey'], + supportedSourceTypes: [ + 'android', + 'ios', + 'web', + 'unity', + 'amp', + 'cloud', + 'reactnative', + ], + transformAt: 'processor', + }, + }, + Config: { + accessKeyId: 'ABC', + customMappings: [ + { from: 'TYPE_OF_MOVIE', to: 'typeOfMovie' }, + { from: 'NUMBER_OF_RATINGS', to: 'numberOfRatings' }, + { from: 'IMPRESSION', to: 'impressions' }, + { from: 'EVENT_VALUE', to: 'eventValue' }, + ], + datasetARN: '', + eventChoice: 'PutEvents', + region: 'us-east-1', + secretAccessKey: 'DEF', + trackingId: 'c60', + }, + Enabled: true, + Transformations: [], + IsProcessorEnabled: true, + }, + libraries: [], + request: { query: {} }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + metadata: { + sourceId: '1pe7ty3hMMQCnrfZ0Mn2QG48884', + destinationId: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + jobId: 1, + destinationType: 'PERSONALIZE', + messageId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + messageIds: null, + rudderId: 'daf823fb-e8d3-413a-8313-d34cd756f968', + receivedAt: '2021-03-13T01:56:44.340+05:30', + }, + output: { + userId: 'identified user id', + sessionId: 'identified user id', + trackingId: 'c60', + eventList: [ + { + eventType: 'PRODUCT DELETED', + sentAt: '2020-02-02T00:23:09.544Z', + properties: { + typeOfMovie: 'Art Film', + numberOfRatings: 'checking with webapp change', + }, + impression: ['2', '3'], + eventValue: 3.4, + itemId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + }, + ], + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'personalize', + description: 'Test 12', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + channel: 'web', + context: { + app: { + build: '1.0.0', + name: 'RudderLabs JavaScript SDK', + namespace: 'com.rudderlabs.javascript', + 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 }, + }, + messageId: '84e26acc-56a5-4835-8233-591137fca468', + session_id: '3049dc4c-5a95-4ccd-a3e7-d74a7e411f22', + originalTimestamp: '2019-10-14T09:03:17.562Z', + anonymousId: 'anon_id', + userId: '123456', + type: 'identify', + traits: { + anonymousId: 'anon_id', + typeOfMovie: 'art film', + numberOfRatings: '13', + lastName: 'Doe', + phone: '92374162212', + }, + integrations: { All: true }, + sentAt: '2019-10-14T09:03:22.563Z', + }, + metadata: { + sourceId: '1pe7ty3hMMQCnrfZ0Mn2QG48884', + destinationId: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + jobId: 1, + destinationType: 'PERSONALIZE', + messageId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + messageIds: null, + rudderId: 'daf823fb-e8d3-413a-8313-d34cd756f968', + receivedAt: '2021-03-13T01:56:44.340+05:30', + }, + destination: { + ID: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + Name: 'personalize Dev Testing', + DestinationDefinition: { + ID: '1pdthjPnz8gQhSTE2QTbm2LUMGM', + Name: 'PERSONALIZE', + DisplayName: 'AWS Personalize', + Config: { + destConfig: { + defaultConfig: [ + 'accessKeyId', + 'secretAccessKey', + 'region', + 'trackingId', + 'eventName', + 'customMappings', + ], + }, + excludeKeys: [], + includeKeys: [], + saveDestinationResponse: true, + secretKeys: ['accessKeyId', 'secretAccessKey'], + supportedSourceTypes: [ + 'android', + 'ios', + 'web', + 'unity', + 'amp', + 'cloud', + 'reactnative', + ], + transformAt: 'processor', + }, + }, + Config: { + accessKeyId: 'ABC', + customMappings: [ + { from: 'TYPE_OF_MOVIE', to: 'typeOfMovie' }, + { from: 'NUMBER_OF_RATINGS', to: 'numberOfRatings' }, + ], + region: 'us-east-1', + secretAccessKey: 'DEF', + trackingId: 'c60', + datasetARN: + 'arn:aws:personalize:us-east-1:454531037350:dataset/putTest_DataSetGroup/USERS', + eventChoice: 'PutUsers', + }, + Enabled: true, + Transformations: [], + IsProcessorEnabled: true, + }, + libraries: [], + request: { query: {} }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + metadata: { + sourceId: '1pe7ty3hMMQCnrfZ0Mn2QG48884', + destinationId: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + jobId: 1, + destinationType: 'PERSONALIZE', + messageId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + messageIds: null, + rudderId: 'daf823fb-e8d3-413a-8313-d34cd756f968', + receivedAt: '2021-03-13T01:56:44.340+05:30', + }, + output: { + payload: { + datasetArn: + 'arn:aws:personalize:us-east-1:454531037350:dataset/putTest_DataSetGroup/USERS', + users: [ + { + userId: '123456', + properties: { typeOfMovie: 'art film', numberOfRatings: '13' }, + }, + ], + }, + choice: 'PutUsers', + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'personalize', + description: 'Test 13', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + anonymousId: 'anon-id-new', + context: { ip: '14.5.67.21', library: { name: 'http' } }, + event: 'PRODUCT ADDED', + messageId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + originalTimestamp: '2021-03-13T01:56:46.896+05:30', + properties: { + numberOfRatings: 'checking with webapp change', + typeOfMovie: 'Art Film', + eventValue: 7.06, + itemId: 1, + }, + receivedAt: '2021-03-13T01:56:44.340+05:30', + request_ip: '[::1]', + rudderId: 'daf823fb-e8d3-413a-8313-d34cd756f968', + sentAt: '2021-03-13T01:56:46.896+05:30', + timestamp: '2020-02-02T00:23:09.544Z', + type: 'track', + userId: 'identified user id', + }, + metadata: { + sourceId: '1pe7ty3hMMQCnrfZ0Mn2QG48884', + destinationId: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + jobId: 1, + destinationType: 'PERSONALIZE', + messageId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + messageIds: null, + rudderId: 'daf823fb-e8d3-413a-8313-d34cd756f968', + receivedAt: '2021-03-13T01:56:44.340+05:30', + }, + destination: { + ID: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + Name: 'personalize Dev Testing', + DestinationDefinition: { + ID: '1pdthjPnz8gQhSTE2QTbm2LUMGM', + Name: 'PERSONALIZE', + DisplayName: 'AWS Personalize', + Config: { + destConfig: { + defaultConfig: [ + 'accessKeyId', + 'secretAccessKey', + 'region', + 'trackingId', + 'eventName', + 'customMappings', + ], + }, + excludeKeys: [], + includeKeys: [], + saveDestinationResponse: true, + secretKeys: ['accessKeyId', 'secretAccessKey'], + supportedSourceTypes: [ + 'android', + 'ios', + 'web', + 'unity', + 'amp', + 'cloud', + 'reactnative', + ], + transformAt: 'processor', + }, + }, + Config: { + accessKeyId: 'ABC', + customMappings: [ + { from: 'TYPE_OF_MOVIE', to: 'typeOfMovie' }, + { from: 'NUMBER_OF_RATINGS', to: 'numberOfRatings' }, + { from: 'ITEM_ID', to: 'properties.itemId' }, + ], + region: 'us-east-1', + secretAccessKey: 'DEF', + trackingId: 'c60', + datasetARN: + 'arn:aws:personalize:us-east-1:454531037350:dataset/putTest_DataSetGroup/ITEMS', + eventChoice: 'PutItems', + }, + Enabled: true, + Transformations: [], + IsProcessorEnabled: true, + }, + libraries: [], + request: { query: {} }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + metadata: { + sourceId: '1pe7ty3hMMQCnrfZ0Mn2QG48884', + destinationId: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + jobId: 1, + destinationType: 'PERSONALIZE', + messageId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + messageIds: null, + rudderId: 'daf823fb-e8d3-413a-8313-d34cd756f968', + receivedAt: '2021-03-13T01:56:44.340+05:30', + }, + output: { + payload: { + datasetArn: + 'arn:aws:personalize:us-east-1:454531037350:dataset/putTest_DataSetGroup/ITEMS', + items: [ + { + properties: { + typeOfMovie: 'Art Film', + numberOfRatings: 'checking with webapp change', + }, + itemId: '1', + }, + ], + }, + choice: 'PutItems', + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'personalize', + description: 'Test 14', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + anonymousId: 'anon-id-new', + context: { ip: '14.5.67.21', library: { name: 'http' } }, + event: 'PRODUCT ADDED', + messageId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + originalTimestamp: '2021-03-13T01:56:46.896+05:30', + properties: { + numberOfRatings: 'checking with webapp change', + typeOfMovie: 'Art Film', + eventValue: 7.06, + itemId: 1, + }, + receivedAt: '2021-03-13T01:56:44.340+05:30', + request_ip: '[::1]', + rudderId: 'daf823fb-e8d3-413a-8313-d34cd756f968', + sentAt: '2021-03-13T01:56:46.896+05:30', + timestamp: '2020-02-02T00:23:09.544Z', + userId: 'identified user id', + }, + metadata: { + sourceId: '1pe7ty3hMMQCnrfZ0Mn2QG48884', + destinationId: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + jobId: 1, + destinationType: 'PERSONALIZE', + messageId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + messageIds: null, + rudderId: 'daf823fb-e8d3-413a-8313-d34cd756f968', + receivedAt: '2021-03-13T01:56:44.340+05:30', + }, + destination: { + ID: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + Name: 'personalize Dev Testing', + DestinationDefinition: { + ID: '1pdthjPnz8gQhSTE2QTbm2LUMGM', + Name: 'PERSONALIZE', + DisplayName: 'AWS Personalize', + Config: { + destConfig: { + defaultConfig: [ + 'accessKeyId', + 'secretAccessKey', + 'region', + 'trackingId', + 'eventName', + 'customMappings', + ], + }, + excludeKeys: [], + includeKeys: [], + saveDestinationResponse: true, + secretKeys: ['accessKeyId', 'secretAccessKey'], + supportedSourceTypes: [ + 'android', + 'ios', + 'web', + 'unity', + 'amp', + 'cloud', + 'reactnative', + ], + transformAt: 'processor', + }, + }, + Config: { + accessKeyId: 'ABC', + customMappings: [ + { from: 'TYPE_OF_MOVIE', to: 'typeOfMovie' }, + { from: 'NUMBER_OF_RATINGS', to: 'numberOfRatings' }, + { from: 'ITEM_ID', to: 'properties.itemId' }, + ], + region: 'us-east-1', + secretAccessKey: 'DEF', + trackingId: 'c60', + datasetARN: + 'arn:aws:personalize:us-east-1:454531037350:dataset/putTest_DataSetGroup/ITEMS', + eventChoice: 'PutItems', + }, + Enabled: true, + Transformations: [], + IsProcessorEnabled: true, + }, + libraries: [], + request: { query: {} }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + error: 'Event type is required', + metadata: { + sourceId: '1pe7ty3hMMQCnrfZ0Mn2QG48884', + destinationId: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + jobId: 1, + destinationType: 'PERSONALIZE', + messageId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + messageIds: null, + rudderId: 'daf823fb-e8d3-413a-8313-d34cd756f968', + receivedAt: '2021-03-13T01:56:44.340+05:30', + }, + statTags: { + destType: 'PERSONALIZE', + errorCategory: 'dataValidation', + destinationId: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + errorType: 'instrumentation', + feature: 'processor', + implementation: 'native', + module: 'destination', + }, + statusCode: 400, + }, + ], + }, + }, + }, + { + name: 'personalize', + description: 'Test 15', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + anonymousId: 'anon-id-new', + context: { ip: '14.5.67.21', library: { name: 'http' } }, + event: 'PRODUCT ADDED', + messageId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + originalTimestamp: '2021-03-13T01:56:46.896+05:30', + properties: { + numberOfRatings: 'checking with webapp change', + eventValue: 7.06, + itemId: 1, + }, + receivedAt: '2021-03-13T01:56:44.340+05:30', + request_ip: '[::1]', + rudderId: 'daf823fb-e8d3-413a-8313-d34cd756f968', + sentAt: '2021-03-13T01:56:46.896+05:30', + timestamp: '2020-02-02T00:23:09.544Z', + type: 'track', + userId: 'identified user id', + }, + metadata: { + sourceId: '1pe7ty3hMMQCnrfZ0Mn2QG48884', + destinationId: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + jobId: 1, + destinationType: 'PERSONALIZE', + messageId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + messageIds: null, + rudderId: 'daf823fb-e8d3-413a-8313-d34cd756f968', + receivedAt: '2021-03-13T01:56:44.340+05:30', + }, + destination: { + ID: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + Name: 'personalize Dev Testing', + DestinationDefinition: { + ID: '1pdthjPnz8gQhSTE2QTbm2LUMGM', + Name: 'PERSONALIZE', + DisplayName: 'AWS Personalize', + Config: { + destConfig: { + defaultConfig: [ + 'accessKeyId', + 'secretAccessKey', + 'region', + 'trackingId', + 'eventName', + 'customMappings', + ], + }, + excludeKeys: [], + includeKeys: [], + saveDestinationResponse: true, + secretKeys: ['accessKeyId', 'secretAccessKey'], + supportedSourceTypes: [ + 'android', + 'ios', + 'web', + 'unity', + 'amp', + 'cloud', + 'reactnative', + ], + transformAt: 'processor', + }, + }, + Config: { + accessKeyId: 'ABC', + customMappings: [ + { from: 'TYPE_OF_MOVIE', to: 'typeOfMovie' }, + { from: 'NUMBER_OF_RATINGS', to: 'numberOfRatings' }, + { from: 'ITEM_ID', to: 'properties.itemId' }, + ], + region: 'us-east-1', + secretAccessKey: 'DEF', + trackingId: 'c60', + datasetARN: + 'arn:aws:personalize:us-east-1:454531037350:dataset/putTest_DataSetGroup/ITEMS', + eventChoice: 'PutItems', + }, + Enabled: true, + Transformations: [], + IsProcessorEnabled: true, + }, + libraries: [], + request: { query: {} }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + error: 'Mapped property typeOfMovie not found', + metadata: { + sourceId: '1pe7ty3hMMQCnrfZ0Mn2QG48884', + destinationId: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + jobId: 1, + destinationType: 'PERSONALIZE', + messageId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + messageIds: null, + rudderId: 'daf823fb-e8d3-413a-8313-d34cd756f968', + receivedAt: '2021-03-13T01:56:44.340+05:30', + }, + statTags: { + destType: 'PERSONALIZE', + errorCategory: 'dataValidation', + destinationId: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + errorType: 'instrumentation', + feature: 'processor', + implementation: 'native', + module: 'destination', + }, + statusCode: 400, + }, + ], + }, + }, + }, + { + name: 'personalize', + description: 'Test 16', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + anonymousId: 'anon-id-new', + context: { ip: '14.5.67.21', library: { name: 'http' } }, + event: 'PRODUCT ADDED', + messageId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + originalTimestamp: '2021-03-13T01:56:46.896+05:30', + properties: { + numberOfRatings: 'checking with webapp change', + typeOfMovie: 'Art Film', + eventValue: 7.06, + itemId: 1, + }, + receivedAt: '2021-03-13T01:56:44.340+05:30', + request_ip: '[::1]', + rudderId: 'daf823fb-e8d3-413a-8313-d34cd756f968', + sentAt: '2021-03-13T01:56:46.896+05:30', + timestamp: '2020-02-02T00:23:09.544Z', + type: 'track', + userId: 'identified user id', + }, + metadata: { + sourceId: '1pe7ty3hMMQCnrfZ0Mn2QG48884', + destinationId: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + jobId: 1, + destinationType: 'PERSONALIZE', + messageId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + messageIds: null, + rudderId: 'daf823fb-e8d3-413a-8313-d34cd756f968', + receivedAt: '2021-03-13T01:56:44.340+05:30', + }, + destination: { + ID: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + Name: 'personalize Dev Testing', + DestinationDefinition: { + ID: '1pdthjPnz8gQhSTE2QTbm2LUMGM', + Name: 'PERSONALIZE', + DisplayName: 'AWS Personalize', + Config: { + destConfig: { + defaultConfig: [ + 'accessKeyId', + 'secretAccessKey', + 'region', + 'trackingId', + 'eventName', + 'customMappings', + ], + }, + excludeKeys: [], + includeKeys: [], + saveDestinationResponse: true, + secretKeys: ['accessKeyId', 'secretAccessKey'], + supportedSourceTypes: [ + 'android', + 'ios', + 'web', + 'unity', + 'amp', + 'cloud', + 'reactnative', + ], + transformAt: 'processor', + }, + }, + Config: { + accessKeyId: 'ABC', + customMappings: [ + { from: 'TYPE_OF_MOVIE', to: 'typeOfMovie' }, + { from: 'NUMBER_OF_RATINGS', to: 'numberOfRatings' }, + { from: 'ITEM_ID', to: 'properties.itemId' }, + ], + region: 'us-east-1', + secretAccessKey: 'DEF', + trackingId: 'c60', + datasetARN: + 'arn:aws:personalize:us-east-1:454531037350:dataset/putTest_DataSetGroup', + eventChoice: 'PutItems', + }, + Enabled: true, + Transformations: [], + IsProcessorEnabled: true, + }, + libraries: [], + request: { query: {} }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + error: 'Either Dataset ARN is not correctly entered or invalid', + metadata: { + sourceId: '1pe7ty3hMMQCnrfZ0Mn2QG48884', + destinationId: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + jobId: 1, + destinationType: 'PERSONALIZE', + messageId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + messageIds: null, + rudderId: 'daf823fb-e8d3-413a-8313-d34cd756f968', + receivedAt: '2021-03-13T01:56:44.340+05:30', + }, + statTags: { + destType: 'PERSONALIZE', + errorCategory: 'dataValidation', + destinationId: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + errorType: 'configuration', + feature: 'processor', + implementation: 'native', + module: 'destination', + }, + statusCode: 400, + }, + ], + }, + }, + }, + { + name: 'personalize', + description: 'Test 17', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + anonymousId: 'anon-id-new', + context: { ip: '14.5.67.21', library: { name: 'http' } }, + event: 'PRODUCT ADDED', + messageId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + originalTimestamp: '2021-03-13T01:56:46.896+05:30', + properties: { + numberOfRatings: 'checking with webapp change', + typeOfMovie: 'Art Film', + eventValue: 7.06, + itemId: 1, + }, + receivedAt: '2021-03-13T01:56:44.340+05:30', + request_ip: '[::1]', + rudderId: 'daf823fb-e8d3-413a-8313-d34cd756f968', + sentAt: '2021-03-13T01:56:46.896+05:30', + timestamp: '2020-02-02T00:23:09.544Z', + type: 'track', + userId: 'identified user id', + }, + metadata: { + sourceId: '1pe7ty3hMMQCnrfZ0Mn2QG48884', + destinationId: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + jobId: 1, + destinationType: 'PERSONALIZE', + messageId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + messageIds: null, + rudderId: 'daf823fb-e8d3-413a-8313-d34cd756f968', + receivedAt: '2021-03-13T01:56:44.340+05:30', + }, + destination: { + ID: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + Name: 'personalize Dev Testing', + DestinationDefinition: { + ID: '1pdthjPnz8gQhSTE2QTbm2LUMGM', + Name: 'PERSONALIZE', + DisplayName: 'AWS Personalize', + Config: { + destConfig: { + defaultConfig: [ + 'accessKeyId', + 'secretAccessKey', + 'region', + 'trackingId', + 'eventName', + 'customMappings', + ], + }, + excludeKeys: [], + includeKeys: [], + saveDestinationResponse: true, + secretKeys: ['accessKeyId', 'secretAccessKey'], + supportedSourceTypes: [ + 'android', + 'ios', + 'web', + 'unity', + 'amp', + 'cloud', + 'reactnative', + ], + transformAt: 'processor', + }, + }, + Config: { + accessKeyId: 'ABC', + customMappings: [ + { from: 'TYPE_OF_MOVIE', to: 'typeOfMovie' }, + { from: 'NUMBER_OF_RATINGS', to: 'numberOfRatings' }, + { from: 'ITEM_ID', to: 'properties.itemId' }, + ], + region: 'us-east-1', + secretAccessKey: 'DEF', + trackingId: 'c60', + datasetARN: '', + eventChoice: 'PutItems', + }, + Enabled: true, + Transformations: [], + IsProcessorEnabled: true, + }, + libraries: [], + request: { query: {} }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + error: 'Dataset ARN is a mandatory information to use putItems', + metadata: { + sourceId: '1pe7ty3hMMQCnrfZ0Mn2QG48884', + destinationId: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + jobId: 1, + destinationType: 'PERSONALIZE', + messageId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + messageIds: null, + rudderId: 'daf823fb-e8d3-413a-8313-d34cd756f968', + receivedAt: '2021-03-13T01:56:44.340+05:30', + }, + statTags: { + destType: 'PERSONALIZE', + errorCategory: 'dataValidation', + destinationId: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + errorType: 'configuration', + feature: 'processor', + implementation: 'native', + module: 'destination', + }, + statusCode: 400, + }, + ], + }, + }, + }, + { + name: 'personalize', + description: 'Test 18', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + anonymousId: 'anon-id-new', + context: { ip: '14.5.67.21', library: { name: 'http' } }, + event: 'PRODUCT ADDED', + messageId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + originalTimestamp: '2021-03-13T01:56:46.896+05:30', + properties: { + numberOfRatings: 'checking with webapp change', + typeOfMovie: 'Art Film', + eventValue: 7.06, + itemId: 1, + }, + receivedAt: '2021-03-13T01:56:44.340+05:30', + request_ip: '[::1]', + rudderId: 'daf823fb-e8d3-413a-8313-d34cd756f968', + sentAt: '2021-03-13T01:56:46.896+05:30', + timestamp: '2020-02-02T00:23:09.544Z', + type: 'track', + userId: 'identified user id', + }, + metadata: { + sourceId: '1pe7ty3hMMQCnrfZ0Mn2QG48884', + destinationId: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + jobId: 1, + destinationType: 'PERSONALIZE', + messageId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + messageIds: null, + rudderId: 'daf823fb-e8d3-413a-8313-d34cd756f968', + receivedAt: '2021-03-13T01:56:44.340+05:30', + }, + destination: { + ID: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + Name: 'personalize Dev Testing', + DestinationDefinition: { + ID: '1pdthjPnz8gQhSTE2QTbm2LUMGM', + Name: 'PERSONALIZE', + DisplayName: 'AWS Personalize', + Config: { + destConfig: { + defaultConfig: [ + 'accessKeyId', + 'secretAccessKey', + 'region', + 'trackingId', + 'eventName', + 'customMappings', + ], + }, + excludeKeys: [], + includeKeys: [], + saveDestinationResponse: true, + secretKeys: ['accessKeyId', 'secretAccessKey'], + supportedSourceTypes: [ + 'android', + 'ios', + 'web', + 'unity', + 'amp', + 'cloud', + 'reactnative', + ], + transformAt: 'processor', + }, + }, + Config: { + accessKeyId: 'ABC', + customMappings: [ + { from: 'TYPE_OF_MOVIE', to: 'typeOfMovie' }, + { from: 'NUMBER_OF_RATINGS', to: 'numberOfRatings' }, + { from: 'ITEM_ID', to: 'properties.itemId' }, + ], + region: 'us-east-1', + secretAccessKey: 'DEF', + trackingId: 'c60', + datasetARN: '', + eventChoice: 'PutUsers', + }, + Enabled: true, + Transformations: [], + IsProcessorEnabled: true, + }, + libraries: [], + request: { query: {} }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + error: 'PutUsers is not supported for Track Calls', + metadata: { + sourceId: '1pe7ty3hMMQCnrfZ0Mn2QG48884', + destinationId: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + jobId: 1, + destinationType: 'PERSONALIZE', + messageId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + messageIds: null, + rudderId: 'daf823fb-e8d3-413a-8313-d34cd756f968', + receivedAt: '2021-03-13T01:56:44.340+05:30', + }, + statTags: { + destType: 'PERSONALIZE', + errorCategory: 'dataValidation', + destinationId: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + errorType: 'configuration', + feature: 'processor', + implementation: 'native', + module: 'destination', + }, + statusCode: 400, + }, + ], + }, + }, + }, + { + name: 'personalize', + description: 'Test 19', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + anonymousId: 'anon-id-new', + context: { ip: '14.5.67.21', library: { name: 'http' } }, + event: 'PRODUCT ADDED', + messageId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + originalTimestamp: '2021-03-13T01:56:46.896+05:30', + properties: { + numberOfRatings: 'checking with webapp change', + typeOfMovie: 'Art Film', + eventValue: 7.06, + itemId: 1, + }, + receivedAt: '2021-03-13T01:56:44.340+05:30', + request_ip: '[::1]', + rudderId: 'daf823fb-e8d3-413a-8313-d34cd756f968', + sentAt: '2021-03-13T01:56:46.896+05:30', + timestamp: '2020-02-02T00:23:09.544Z', + type: 'track', + userId: 'identified user id', + }, + metadata: { + sourceId: '1pe7ty3hMMQCnrfZ0Mn2QG48884', + destinationId: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + jobId: 1, + destinationType: 'PERSONALIZE', + messageId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + messageIds: null, + rudderId: 'daf823fb-e8d3-413a-8313-d34cd756f968', + receivedAt: '2021-03-13T01:56:44.340+05:30', + }, + destination: { + ID: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + Name: 'personalize Dev Testing', + DestinationDefinition: { + ID: '1pdthjPnz8gQhSTE2QTbm2LUMGM', + Name: 'PERSONALIZE', + DisplayName: 'AWS Personalize', + Config: { + destConfig: { + defaultConfig: [ + 'accessKeyId', + 'secretAccessKey', + 'region', + 'trackingId', + 'eventName', + 'customMappings', + ], + }, + excludeKeys: [], + includeKeys: [], + saveDestinationResponse: true, + secretKeys: ['accessKeyId', 'secretAccessKey'], + supportedSourceTypes: [ + 'android', + 'ios', + 'web', + 'unity', + 'amp', + 'cloud', + 'reactnative', + ], + transformAt: 'processor', + }, + }, + Config: { + accessKeyId: 'ABC', + customMappings: [ + { from: 'TYPE_OF_MOVIE', to: 'typeOfMovie' }, + { from: 'NUMBER_OF_RATINGS', to: 'numberOfRatings' }, + { from: 'ITEM_ID', to: 'properties.itemId' }, + ], + region: 'us-east-1', + secretAccessKey: 'DEF', + trackingId: '', + datasetARN: + 'arn:aws:personalize:us-east-1:454531037350:dataset/putTest_DataSetGroup/ITEMS', + eventChoice: 'PutEvents', + }, + Enabled: true, + Transformations: [], + IsProcessorEnabled: true, + }, + libraries: [], + request: { query: {} }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + error: 'Tracking Id is a mandatory information to use putEvents', + metadata: { + sourceId: '1pe7ty3hMMQCnrfZ0Mn2QG48884', + destinationId: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + jobId: 1, + destinationType: 'PERSONALIZE', + messageId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + messageIds: null, + rudderId: 'daf823fb-e8d3-413a-8313-d34cd756f968', + receivedAt: '2021-03-13T01:56:44.340+05:30', + }, + statTags: { + destType: 'PERSONALIZE', + errorCategory: 'dataValidation', + destinationId: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + errorType: 'configuration', + feature: 'processor', + implementation: 'native', + module: 'destination', + }, + statusCode: 400, + }, + ], + }, + }, + }, + { + name: 'personalize', + description: 'Test 20', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + anonymousId: 'anon-id-new', + context: { ip: '14.5.67.21', library: { name: 'http' } }, + event: 'PRODUCT ADDED', + messageId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + originalTimestamp: '2021-03-13T01:56:46.896+05:30', + properties: { + numberOfRatings: 'checking with webapp change', + typeOfMovie: 'Art Film', + eventValue: 7.06, + itemId: '', + }, + receivedAt: '2021-03-13T01:56:44.340+05:30', + request_ip: '[::1]', + rudderId: 'daf823fb-e8d3-413a-8313-d34cd756f968', + sentAt: '2021-03-13T01:56:46.896+05:30', + timestamp: '2020-02-02T00:23:09.544Z', + type: 'track', + userId: 'identified user id', + }, + metadata: { + sourceId: '1pe7ty3hMMQCnrfZ0Mn2QG48884', + destinationId: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + jobId: 1, + destinationType: 'PERSONALIZE', + messageId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + messageIds: null, + rudderId: 'daf823fb-e8d3-413a-8313-d34cd756f968', + receivedAt: '2021-03-13T01:56:44.340+05:30', + }, + destination: { + ID: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + Name: 'personalize Dev Testing', + DestinationDefinition: { + ID: '1pdthjPnz8gQhSTE2QTbm2LUMGM', + Name: 'PERSONALIZE', + DisplayName: 'AWS Personalize', + Config: { + destConfig: { + defaultConfig: [ + 'accessKeyId', + 'secretAccessKey', + 'region', + 'trackingId', + 'eventName', + 'customMappings', + ], + }, + excludeKeys: [], + includeKeys: [], + saveDestinationResponse: true, + secretKeys: ['accessKeyId', 'secretAccessKey'], + supportedSourceTypes: [ + 'android', + 'ios', + 'web', + 'unity', + 'amp', + 'cloud', + 'reactnative', + ], + transformAt: 'processor', + }, + }, + Config: { + accessKeyId: 'ABC', + customMappings: [ + { from: 'TYPE_OF_MOVIE', to: 'typeOfMovie' }, + { from: 'NUMBER_OF_RATINGS', to: 'numberOfRatings' }, + { from: 'ITEM_ID', to: 'properties.itemId' }, + ], + region: 'us-east-1', + secretAccessKey: 'DEF', + trackingId: 'c60', + datasetARN: + 'arn:aws:personalize:us-east-1:454531037350:dataset/putTest_DataSetGroup/ITEMS', + eventChoice: 'PutItems', + }, + Enabled: true, + Transformations: [], + IsProcessorEnabled: true, + }, + libraries: [], + request: { query: {} }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + error: 'itemId is a mandatory property for using PutItems', + metadata: { + sourceId: '1pe7ty3hMMQCnrfZ0Mn2QG48884', + destinationId: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + jobId: 1, + destinationType: 'PERSONALIZE', + messageId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + messageIds: null, + rudderId: 'daf823fb-e8d3-413a-8313-d34cd756f968', + receivedAt: '2021-03-13T01:56:44.340+05:30', + }, + statTags: { + destType: 'PERSONALIZE', + errorCategory: 'dataValidation', + destinationId: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + errorType: 'instrumentation', + feature: 'processor', + implementation: 'native', + module: 'destination', + }, + statusCode: 400, + }, + ], + }, + }, + }, + { + name: 'personalize', + description: 'Test 21', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + anonymousId: 'anon-id-new', + context: { ip: '14.5.67.21', library: { name: 'http' } }, + event: '', + messageId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + originalTimestamp: '2021-03-13T01:56:46.896+05:30', + properties: { + numberOfRatings: 'checking with webapp change', + typeOfMovie: 'Art Film', + eventValue: 7.06, + itemId: '', + }, + receivedAt: '2021-03-13T01:56:44.340+05:30', + request_ip: '[::1]', + rudderId: 'daf823fb-e8d3-413a-8313-d34cd756f968', + sentAt: '2021-03-13T01:56:46.896+05:30', + timestamp: '2020-02-02T00:23:09.544Z', + type: 'track', + userId: 'identified user id', + }, + metadata: { + sourceId: '1pe7ty3hMMQCnrfZ0Mn2QG48884', + destinationId: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + jobId: 1, + destinationType: 'PERSONALIZE', + messageId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + messageIds: null, + rudderId: 'daf823fb-e8d3-413a-8313-d34cd756f968', + receivedAt: '2021-03-13T01:56:44.340+05:30', + }, + destination: { + ID: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + Name: 'personalize Dev Testing', + DestinationDefinition: { + ID: '1pdthjPnz8gQhSTE2QTbm2LUMGM', + Name: 'PERSONALIZE', + DisplayName: 'AWS Personalize', + Config: { + destConfig: { + defaultConfig: [ + 'accessKeyId', + 'secretAccessKey', + 'region', + 'trackingId', + 'eventName', + 'customMappings', + ], + }, + excludeKeys: [], + includeKeys: [], + saveDestinationResponse: true, + secretKeys: ['accessKeyId', 'secretAccessKey'], + supportedSourceTypes: [ + 'android', + 'ios', + 'web', + 'unity', + 'amp', + 'cloud', + 'reactnative', + ], + transformAt: 'processor', + }, + }, + Config: { + accessKeyId: 'ABC', + customMappings: [ + { from: 'TYPE_OF_MOVIE', to: 'typeOfMovie' }, + { from: 'NUMBER_OF_RATINGS', to: 'numberOfRatings' }, + { from: 'ITEM_ID', to: 'properties.itemId' }, + ], + region: 'us-east-1', + secretAccessKey: 'DEF', + trackingId: 'c60', + datasetARN: + 'arn:aws:personalize:us-east-1:454531037350:dataset/putTest_DataSetGroup/ITEMS', + eventChoice: 'PutEvents', + }, + Enabled: true, + Transformations: [], + IsProcessorEnabled: true, + }, + libraries: [], + request: { query: {} }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + error: 'Cannot process if no event name specified', + metadata: { + sourceId: '1pe7ty3hMMQCnrfZ0Mn2QG48884', + destinationId: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + jobId: 1, + destinationType: 'PERSONALIZE', + messageId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + messageIds: null, + rudderId: 'daf823fb-e8d3-413a-8313-d34cd756f968', + receivedAt: '2021-03-13T01:56:44.340+05:30', + }, + statTags: { + destType: 'PERSONALIZE', + errorCategory: 'dataValidation', + destinationId: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + errorType: 'instrumentation', + feature: 'processor', + implementation: 'native', + module: 'destination', + }, + statusCode: 400, + }, + ], + }, + }, + }, + { + name: 'personalize', + description: 'Test 22', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + channel: 'web', + context: { + app: { + build: '1.0.0', + name: 'RudderLabs JavaScript SDK', + namespace: 'com.rudderlabs.javascript', + 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 }, + }, + messageId: '84e26acc-56a5-4835-8233-591137fca468', + session_id: '3049dc4c-5a95-4ccd-a3e7-d74a7e411f22', + originalTimestamp: '2019-10-14T09:03:17.562Z', + anonymousId: 'anon_id', + userId: '123456', + type: 'identify', + traits: { + anonymousId: 'anon_id', + typeOfMovie: 'art film', + numberOfRatings: 'DDLJ', + lastName: 'Doe', + phone: '92374162212', + }, + integrations: { All: true }, + sentAt: '2019-10-14T09:03:22.563Z', + }, + metadata: { + sourceId: '1pe7ty3hMMQCnrfZ0Mn2QG48884', + destinationId: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + jobId: 1, + destinationType: 'PERSONALIZE', + messageId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + messageIds: null, + rudderId: 'daf823fb-e8d3-413a-8313-d34cd756f968', + receivedAt: '2021-03-13T01:56:44.340+05:30', + }, + destination: { + ID: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + Name: 'personalize Dev Testing', + DestinationDefinition: { + ID: '1pdthjPnz8gQhSTE2QTbm2LUMGM', + Name: 'PERSONALIZE', + DisplayName: 'AWS Personalize', + Config: { + destConfig: { + defaultConfig: [ + 'accessKeyId', + 'secretAccessKey', + 'region', + 'trackingId', + 'eventName', + 'customMappings', + ], + }, + excludeKeys: [], + includeKeys: [], + saveDestinationResponse: true, + secretKeys: ['accessKeyId', 'secretAccessKey'], + supportedSourceTypes: [ + 'android', + 'ios', + 'web', + 'unity', + 'amp', + 'cloud', + 'reactnative', + ], + transformAt: 'processor', + }, + }, + Config: { + accessKeyId: 'ABC', + customMappings: [ + { from: 'TYPE_OF_MOVIE', to: 'typeOfMovie' }, + { from: 'NUMBER_OF_RATINGS', to: 'numberOfRatings' }, + ], + region: 'us-east-1', + secretAccessKey: 'DEF', + trackingId: '', + datasetARN: + 'arn:aws:personalize:us-east-1:454531037350:dataset/putTest_DataSetGroup/USERS', + eventChoice: 'PutItems', + }, + Enabled: true, + Transformations: [], + IsProcessorEnabled: true, + }, + libraries: [], + request: { query: {} }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + error: 'This Message Type does not support PutItems. Aborting message', + metadata: { + sourceId: '1pe7ty3hMMQCnrfZ0Mn2QG48884', + destinationId: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + jobId: 1, + destinationType: 'PERSONALIZE', + messageId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + messageIds: null, + rudderId: 'daf823fb-e8d3-413a-8313-d34cd756f968', + receivedAt: '2021-03-13T01:56:44.340+05:30', + }, + statTags: { + destType: 'PERSONALIZE', + destinationId: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + errorCategory: 'dataValidation', + errorType: 'configuration', + feature: 'processor', + implementation: 'native', + module: 'destination', + }, + statusCode: 400, + }, + ], + }, + }, + }, + { + name: 'personalize', + description: 'Test 23', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + channel: 'web', + context: { + app: { + build: '1.0.0', + name: 'RudderLabs JavaScript SDK', + namespace: 'com.rudderlabs.javascript', + 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 }, + }, + messageId: '84e26acc-56a5-4835-8233-591137fca468', + session_id: '3049dc4c-5a95-4ccd-a3e7-d74a7e411f22', + originalTimestamp: '2019-10-14T09:03:17.562Z', + anonymousId: 'anon_id', + userId: '123456', + type: 'identify', + traits: { + anonymousId: 'anon_id', + typeOfMovie: 'art film', + numberOfRatings: 'DDLJ', + lastName: 'Doe', + phone: '92374162212', + }, + integrations: { All: true }, + sentAt: '2019-10-14T09:03:22.563Z', + }, + metadata: { + sourceId: '1pe7ty3hMMQCnrfZ0Mn2QG48884', + destinationId: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + jobId: 1, + destinationType: 'PERSONALIZE', + messageId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + messageIds: null, + rudderId: 'daf823fb-e8d3-413a-8313-d34cd756f968', + receivedAt: '2021-03-13T01:56:44.340+05:30', + }, + destination: { + ID: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + Name: 'personalize Dev Testing', + DestinationDefinition: { + ID: '1pdthjPnz8gQhSTE2QTbm2LUMGM', + Name: 'PERSONALIZE', + DisplayName: 'AWS Personalize', + Config: { + destConfig: { + defaultConfig: [ + 'accessKeyId', + 'secretAccessKey', + 'region', + 'trackingId', + 'eventName', + 'customMappings', + ], + }, + excludeKeys: [], + includeKeys: [], + saveDestinationResponse: true, + secretKeys: ['accessKeyId', 'secretAccessKey'], + supportedSourceTypes: [ + 'android', + 'ios', + 'web', + 'unity', + 'amp', + 'cloud', + 'reactnative', + ], + transformAt: 'processor', + }, + }, + Config: { + accessKeyId: 'ABC', + customMappings: [ + { from: 'TYPE_OF_MOVIE', to: 'typeOfMovie' }, + { from: 'NUMBER_OF_RATINGS', to: 'numberOfRatings' }, + ], + region: 'us-east-1', + secretAccessKey: 'DEF', + trackingId: '', + datasetARN: '', + eventChoice: 'PutUsers', + }, + Enabled: true, + Transformations: [], + IsProcessorEnabled: true, + }, + libraries: [], + request: { query: {} }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + error: 'Dataset ARN is a mandatory information to use putUsers', + metadata: { + sourceId: '1pe7ty3hMMQCnrfZ0Mn2QG48884', + destinationId: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + jobId: 1, + destinationType: 'PERSONALIZE', + messageId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + messageIds: null, + rudderId: 'daf823fb-e8d3-413a-8313-d34cd756f968', + receivedAt: '2021-03-13T01:56:44.340+05:30', + }, + statTags: { + destType: 'PERSONALIZE', + errorCategory: 'dataValidation', + destinationId: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + errorType: 'configuration', + feature: 'processor', + implementation: 'native', + module: 'destination', + }, + statusCode: 400, + }, + ], + }, + }, + }, + { + name: 'personalize', + description: 'Test 24', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + channel: 'web', + context: { + app: { + build: '1.0.0', + name: 'RudderLabs JavaScript SDK', + namespace: 'com.rudderlabs.javascript', + 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 }, + }, + messageId: '84e26acc-56a5-4835-8233-591137fca468', + session_id: '3049dc4c-5a95-4ccd-a3e7-d74a7e411f22', + originalTimestamp: '2019-10-14T09:03:17.562Z', + anonymousId: 'anon_id', + userId: '123456', + type: 'identify', + traits: { + anonymousId: 'anon_id', + typeOfMovie: 'art film', + numberOfRatings: 'DDLJ', + lastName: 'Doe', + phone: '92374162212', + }, + integrations: { All: true }, + sentAt: '2019-10-14T09:03:22.563Z', + }, + metadata: { + sourceId: '1pe7ty3hMMQCnrfZ0Mn2QG48884', + destinationId: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + jobId: 1, + destinationType: 'PERSONALIZE', + messageId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + messageIds: null, + rudderId: 'daf823fb-e8d3-413a-8313-d34cd756f968', + receivedAt: '2021-03-13T01:56:44.340+05:30', + }, + destination: { + ID: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + Name: 'personalize Dev Testing', + DestinationDefinition: { + ID: '1pdthjPnz8gQhSTE2QTbm2LUMGM', + Name: 'PERSONALIZE', + DisplayName: 'AWS Personalize', + Config: { + destConfig: { + defaultConfig: [ + 'accessKeyId', + 'secretAccessKey', + 'region', + 'trackingId', + 'eventName', + 'customMappings', + ], + }, + excludeKeys: [], + includeKeys: [], + saveDestinationResponse: true, + secretKeys: ['accessKeyId', 'secretAccessKey'], + supportedSourceTypes: [ + 'android', + 'ios', + 'web', + 'unity', + 'amp', + 'cloud', + 'reactnative', + ], + transformAt: 'processor', + }, + }, + Config: { + accessKeyId: 'ABC', + customMappings: [ + { from: 'TYPE_OF_MOVIE', to: 'typeOfMovie' }, + { from: 'NUMBER_OF_RATINGS', to: 'numberOfRatings' }, + ], + region: 'us-east-1', + secretAccessKey: 'DEF', + trackingId: '', + datasetARN: + 'arn:aws:personalize:us-east-1:454531037350:dataset/putTest_DataSetGroup', + eventChoice: 'PutUsers', + }, + Enabled: true, + Transformations: [], + IsProcessorEnabled: true, + }, + libraries: [], + request: { query: {} }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + error: 'Either Dataset ARN is not correctly entered or invalid', + metadata: { + sourceId: '1pe7ty3hMMQCnrfZ0Mn2QG48884', + destinationId: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + jobId: 1, + destinationType: 'PERSONALIZE', + messageId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + messageIds: null, + rudderId: 'daf823fb-e8d3-413a-8313-d34cd756f968', + receivedAt: '2021-03-13T01:56:44.340+05:30', + }, + statTags: { + destType: 'PERSONALIZE', + errorCategory: 'dataValidation', + destinationId: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + errorType: 'configuration', + feature: 'processor', + implementation: 'native', + module: 'destination', + }, + statusCode: 400, + }, + ], + }, + }, + }, + { + name: 'personalize', + description: 'Test 25', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + channel: 'web', + context: { + app: { + build: '1.0.0', + name: 'RudderLabs JavaScript SDK', + namespace: 'com.rudderlabs.javascript', + 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 }, + }, + messageId: '84e26acc-56a5-4835-8233-591137fca468', + session_id: '3049dc4c-5a95-4ccd-a3e7-d74a7e411f22', + originalTimestamp: '2019-10-14T09:03:17.562Z', + anonymousId: 'anon_id', + userId: '123456', + type: 'identify', + traits: { + anonymousId: 'anon_id', + typeOfMovie: 'art film', + lastName: 'Doe', + phone: '92374162212', + }, + integrations: { All: true }, + sentAt: '2019-10-14T09:03:22.563Z', + }, + metadata: { + sourceId: '1pe7ty3hMMQCnrfZ0Mn2QG48884', + destinationId: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + jobId: 1, + destinationType: 'PERSONALIZE', + messageId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + messageIds: null, + rudderId: 'daf823fb-e8d3-413a-8313-d34cd756f968', + receivedAt: '2021-03-13T01:56:44.340+05:30', + }, + destination: { + ID: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + Name: 'personalize Dev Testing', + DestinationDefinition: { + ID: '1pdthjPnz8gQhSTE2QTbm2LUMGM', + Name: 'PERSONALIZE', + DisplayName: 'AWS Personalize', + Config: { + destConfig: { + defaultConfig: [ + 'accessKeyId', + 'secretAccessKey', + 'region', + 'trackingId', + 'eventName', + 'customMappings', + ], + }, + excludeKeys: [], + includeKeys: [], + saveDestinationResponse: true, + secretKeys: ['accessKeyId', 'secretAccessKey'], + supportedSourceTypes: [ + 'android', + 'ios', + 'web', + 'unity', + 'amp', + 'cloud', + 'reactnative', + ], + transformAt: 'processor', + }, + }, + Config: { + accessKeyId: 'ABC', + customMappings: [ + { from: 'TYPE_OF_MOVIE', to: 'typeOfMovie' }, + { from: 'NUMBER_OF_RATINGS', to: 'numberOfRatings' }, + ], + region: 'us-east-1', + secretAccessKey: 'DEF', + trackingId: '', + datasetARN: + 'arn:aws:personalize:us-east-1:454531037350:dataset/putTest_DataSetGroup/USERS', + eventChoice: 'PutUsers', + }, + Enabled: true, + Transformations: [], + IsProcessorEnabled: true, + }, + libraries: [], + request: { query: {} }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + error: 'Mapped property numberOfRatings not found', + metadata: { + sourceId: '1pe7ty3hMMQCnrfZ0Mn2QG48884', + destinationId: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + jobId: 1, + destinationType: 'PERSONALIZE', + messageId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + messageIds: null, + rudderId: 'daf823fb-e8d3-413a-8313-d34cd756f968', + receivedAt: '2021-03-13T01:56:44.340+05:30', + }, + statTags: { + destType: 'PERSONALIZE', + errorCategory: 'dataValidation', + destinationId: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + errorType: 'instrumentation', + feature: 'processor', + implementation: 'native', + module: 'destination', + }, + statusCode: 400, + }, + ], + }, + }, + }, + { + name: 'personalize', + description: 'Test 26', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + anonymousId: 'anon-id-new', + context: { ip: '14.5.67.21', library: { name: 'http' } }, + event: '', + messageId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + originalTimestamp: '2021-03-13T01:56:46.896+05:30', + properties: { + numberOfRatings: 'checking with webapp change', + typeOfMovie: 'Art Film', + eventValue: 7.06, + itemId: '', + }, + receivedAt: '2021-03-13T01:56:44.340+05:30', + request_ip: '[::1]', + rudderId: 'daf823fb-e8d3-413a-8313-d34cd756f968', + sentAt: '2021-03-13T01:56:46.896+05:30', + timestamp: '2020-02-02T00:23:09.544Z', + type: 'screen', + userId: 'identified user id', + }, + metadata: { + sourceId: '1pe7ty3hMMQCnrfZ0Mn2QG48884', + destinationId: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + jobId: 1, + destinationType: 'PERSONALIZE', + messageId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + messageIds: null, + rudderId: 'daf823fb-e8d3-413a-8313-d34cd756f968', + receivedAt: '2021-03-13T01:56:44.340+05:30', + }, + destination: { + ID: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + Name: 'personalize Dev Testing', + DestinationDefinition: { + ID: '1pdthjPnz8gQhSTE2QTbm2LUMGM', + Name: 'PERSONALIZE', + DisplayName: 'AWS Personalize', + Config: { + destConfig: { + defaultConfig: [ + 'accessKeyId', + 'secretAccessKey', + 'region', + 'trackingId', + 'eventName', + 'customMappings', + ], + }, + excludeKeys: [], + includeKeys: [], + saveDestinationResponse: true, + secretKeys: ['accessKeyId', 'secretAccessKey'], + supportedSourceTypes: [ + 'android', + 'ios', + 'web', + 'unity', + 'amp', + 'cloud', + 'reactnative', + ], + transformAt: 'processor', + }, + }, + Config: { + accessKeyId: 'ABC', + customMappings: [ + { from: 'TYPE_OF_MOVIE', to: 'typeOfMovie' }, + { from: 'NUMBER_OF_RATINGS', to: 'numberOfRatings' }, + { from: 'ITEM_ID', to: 'properties.itemId' }, + ], + region: 'us-east-1', + secretAccessKey: 'DEF', + trackingId: 'c60', + datasetARN: + 'arn:aws:personalize:us-east-1:454531037350:dataset/putTest_DataSetGroup/ITEMS', + eventChoice: 'PutEvents', + }, + Enabled: true, + Transformations: [], + IsProcessorEnabled: true, + }, + libraries: [], + request: { query: {} }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + error: 'Event type screen is not supported', + metadata: { + sourceId: '1pe7ty3hMMQCnrfZ0Mn2QG48884', + destinationId: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + jobId: 1, + destinationType: 'PERSONALIZE', + messageId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + messageIds: null, + rudderId: 'daf823fb-e8d3-413a-8313-d34cd756f968', + receivedAt: '2021-03-13T01:56:44.340+05:30', + }, + statTags: { + destType: 'PERSONALIZE', + errorCategory: 'dataValidation', + destinationId: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + errorType: 'instrumentation', + feature: 'processor', + implementation: 'native', + module: 'destination', + }, + statusCode: 400, + }, + ], + }, + }, + }, + { + name: 'personalize', + description: 'Test 27', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + anonymousId: 'anon-id-new', + context: { ip: '14.5.67.21', library: { name: 'http' } }, + event: 'PRODUCT ADDED', + messageId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + originalTimestamp: '2021-03-13T01:56:46.896+05:30', + properties: { + numberOfRatings: 'checking with webapp change', + movieWatched: 2, + eventValue: 7.06, + }, + receivedAt: '2021-03-13T01:56:44.340+05:30', + request_ip: '[::1]', + rudderId: 'daf823fb-e8d3-413a-8313-d34cd756f968', + sentAt: '2021-03-13T01:56:46.896+05:30', + timestamp: '2020-02-02T00:23:09.544Z', + type: 'track', + userId: 'identified user id', + }, + metadata: { + sourceId: '1pe7ty3hMMQCnrfZ0Mn2QG48884', + destinationId: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + jobId: 1, + destinationType: 'PERSONALIZE', + messageId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + messageIds: null, + rudderId: 'daf823fb-e8d3-413a-8313-d34cd756f968', + receivedAt: '2021-03-13T01:56:44.340+05:30', + }, + destination: { + ID: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + Name: 'personalize Dev Testing', + DestinationDefinition: { + ID: '1pdthjPnz8gQhSTE2QTbm2LUMGM', + Name: 'PERSONALIZE', + DisplayName: 'AWS Personalize', + Config: { + destConfig: { + defaultConfig: [ + 'accessKeyId', + 'secretAccessKey', + 'region', + 'trackingId', + 'eventName', + 'customMappings', + ], + }, + excludeKeys: [], + includeKeys: [], + saveDestinationResponse: true, + secretKeys: ['accessKeyId', 'secretAccessKey'], + supportedSourceTypes: [ + 'android', + 'ios', + 'web', + 'unity', + 'amp', + 'cloud', + 'reactnative', + ], + transformAt: 'processor', + }, + }, + Config: { + accessKeyId: 'ABC', + customMappings: [ + { from: 'MOVIE_WATCHED', to: 'movieWatched' }, + { from: 'NUMBER_OF_RATINGS', to: 'numberOfRatings' }, + ], + datasetARN: '', + eventChoice: 'PutEvents', + stringifyProperty: true, + region: 'us-east-1', + secretAccessKey: 'DEF', + trackingId: 'c60', + }, + Enabled: true, + Transformations: [], + IsProcessorEnabled: true, + }, + libraries: [], + request: { query: {} }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + metadata: { + sourceId: '1pe7ty3hMMQCnrfZ0Mn2QG48884', + destinationId: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + jobId: 1, + destinationType: 'PERSONALIZE', + messageId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + messageIds: null, + rudderId: 'daf823fb-e8d3-413a-8313-d34cd756f968', + receivedAt: '2021-03-13T01:56:44.340+05:30', + }, + output: { + sessionId: 'anon-id-new', + trackingId: 'c60', + userId: 'identified user id', + eventList: [ + { + itemId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + eventType: 'PRODUCT ADDED', + sentAt: '2020-02-02T00:23:09.544Z', + properties: { movieWatched: '2', numberOfRatings: 'checking with webapp change' }, + }, + ], + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'personalize', + description: 'Test 28', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + anonymousId: 'anon-id-new', + context: { ip: '14.5.67.21', library: { name: 'http' } }, + event: 'PRODUCT ADDED', + messageId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + originalTimestamp: '2021-03-13T01:56:46.896+05:30', + properties: { + numberOfRatings: 'checking with webapp change', + movieWatched: 2, + eventValue: 7.06, + }, + receivedAt: '2021-03-13T01:56:44.340+05:30', + request_ip: '[::1]', + rudderId: 'daf823fb-e8d3-413a-8313-d34cd756f968', + sentAt: '2021-03-13T01:56:46.896+05:30', + timestamp: '2020-02-02T00:23:09.544Z', + type: 'track', + userId: 'identified user id', + }, + metadata: { + sourceId: '1pe7ty3hMMQCnrfZ0Mn2QG48884', + destinationId: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + jobId: 1, + destinationType: 'PERSONALIZE', + messageId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + messageIds: null, + rudderId: 'daf823fb-e8d3-413a-8313-d34cd756f968', + receivedAt: '2021-03-13T01:56:44.340+05:30', + }, + destination: { + ID: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + Name: 'personalize Dev Testing', + DestinationDefinition: { + ID: '1pdthjPnz8gQhSTE2QTbm2LUMGM', + Name: 'PERSONALIZE', + DisplayName: 'AWS Personalize', + Config: { + destConfig: { + defaultConfig: [ + 'accessKeyId', + 'secretAccessKey', + 'region', + 'trackingId', + 'eventName', + 'customMappings', + ], + }, + excludeKeys: [], + includeKeys: [], + saveDestinationResponse: true, + secretKeys: ['accessKeyId', 'secretAccessKey'], + supportedSourceTypes: [ + 'android', + 'ios', + 'web', + 'unity', + 'amp', + 'cloud', + 'reactnative', + ], + transformAt: 'processor', + }, + }, + Config: { + accessKeyId: 'ABC', + customMappings: [ + { from: 'MOVIE_WATCHED', to: 'movieWatched' }, + { from: 'NUMBER_OF_RATINGS', to: 'numberOfRatings' }, + ], + datasetARN: '', + eventChoice: 'PutEvents', + disableStringify: true, + region: 'us-east-1', + secretAccessKey: 'DEF', + trackingId: 'c60', + }, + Enabled: true, + Transformations: [], + IsProcessorEnabled: true, + }, + libraries: [], + request: { query: {} }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + metadata: { + sourceId: '1pe7ty3hMMQCnrfZ0Mn2QG48884', + destinationId: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + jobId: 1, + destinationType: 'PERSONALIZE', + messageId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + messageIds: null, + rudderId: 'daf823fb-e8d3-413a-8313-d34cd756f968', + receivedAt: '2021-03-13T01:56:44.340+05:30', + }, + output: { + sessionId: 'anon-id-new', + trackingId: 'c60', + userId: 'identified user id', + eventList: [ + { + itemId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + eventType: 'PRODUCT ADDED', + sentAt: '2020-02-02T00:23:09.544Z', + properties: { movieWatched: 2, numberOfRatings: 'checking with webapp change' }, + }, + ], + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'personalize', + description: 'Test 29', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + anonymousId: 'anon-id-new', + context: { ip: '14.5.67.21', library: { name: 'http' } }, + event: 'PRODUCT ADDED', + messageId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + originalTimestamp: '2021-03-13T01:56:46.896+05:30', + properties: { + numberOfRatings: 'checking with webapp change', + movieWatched: 2, + eventValue: 7.06, + }, + receivedAt: '2021-03-13T01:56:44.340+05:30', + request_ip: '[::1]', + rudderId: 'daf823fb-e8d3-413a-8313-d34cd756f968', + sentAt: '2021-03-13T01:56:46.896+05:30', + timestamp: '2020-02-02T00:23:09.544Z', + type: 'track', + userId: 'identified user id', + }, + metadata: { + sourceId: '1pe7ty3hMMQCnrfZ0Mn2QG48884', + destinationId: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + jobId: 1, + destinationType: 'PERSONALIZE', + messageId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + messageIds: null, + rudderId: 'daf823fb-e8d3-413a-8313-d34cd756f968', + receivedAt: '2021-03-13T01:56:44.340+05:30', + }, + destination: { + ID: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + Name: 'personalize Dev Testing', + DestinationDefinition: { + ID: '1pdthjPnz8gQhSTE2QTbm2LUMGM', + Name: 'PERSONALIZE', + DisplayName: 'AWS Personalize', + Config: { + destConfig: { + defaultConfig: [ + 'accessKeyId', + 'secretAccessKey', + 'region', + 'trackingId', + 'eventName', + 'customMappings', + ], + }, + excludeKeys: [], + includeKeys: [], + saveDestinationResponse: true, + secretKeys: ['accessKeyId', 'secretAccessKey'], + supportedSourceTypes: [ + 'android', + 'ios', + 'web', + 'unity', + 'amp', + 'cloud', + 'reactnative', + ], + transformAt: 'processor', + }, + }, + Config: { + accessKeyId: 'ABC', + customMappings: [ + { from: 'MOVIE_WATCHED', to: 'movieWatched' }, + { from: 'NUMBER_OF_RATINGS', to: 'numberOfRatings' }, + ], + datasetARN: '', + eventChoice: 'PutEvents', + disableStringify: false, + region: 'us-east-1', + secretAccessKey: 'DEF', + trackingId: 'c60', + }, + Enabled: true, + Transformations: [], + IsProcessorEnabled: true, + }, + libraries: [], + request: { query: {} }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + metadata: { + sourceId: '1pe7ty3hMMQCnrfZ0Mn2QG48884', + destinationId: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + jobId: 1, + destinationType: 'PERSONALIZE', + messageId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + messageIds: null, + rudderId: 'daf823fb-e8d3-413a-8313-d34cd756f968', + receivedAt: '2021-03-13T01:56:44.340+05:30', + }, + output: { + sessionId: 'anon-id-new', + trackingId: 'c60', + userId: 'identified user id', + eventList: [ + { + itemId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + eventType: 'PRODUCT ADDED', + sentAt: '2020-02-02T00:23:09.544Z', + properties: { movieWatched: '2', numberOfRatings: 'checking with webapp change' }, + }, + ], + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'personalize', + description: 'Test 30', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + context: { + ip: '14.5.67.21', + library: { name: 'http' }, + sessionId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + }, + event: 'PRODUCT ADDED', + messageId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + originalTimestamp: '2023-01-10T01:56:46.896+05:30', + properties: { + numberOfRatings: 'checking with webapp change', + movieWatched: 2, + eventValue: 7.06, + }, + type: 'track', + }, + metadata: { + sourceId: '1pe7ty3hMMQCnrfZ0Mn2QG48884', + destinationId: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + jobId: 1, + destinationType: 'PERSONALIZE', + messageId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + messageIds: null, + rudderId: 'daf823fb-e8d3-413a-8313-d34cd756f968', + }, + destination: { + ID: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + Name: 'personalize Dev Testing', + DestinationDefinition: { + ID: '1pdthjPnz8gQhSTE2QTbm2LUMGM', + Name: 'PERSONALIZE', + DisplayName: 'AWS Personalize', + Config: { + destConfig: { + defaultConfig: [ + 'accessKeyId', + 'secretAccessKey', + 'region', + 'trackingId', + 'eventName', + 'customMappings', + ], + }, + excludeKeys: [], + includeKeys: [], + saveDestinationResponse: true, + secretKeys: ['accessKeyId', 'secretAccessKey'], + supportedSourceTypes: [ + 'android', + 'ios', + 'web', + 'unity', + 'amp', + 'cloud', + 'reactnative', + ], + transformAt: 'processor', + }, + }, + Config: { + accessKeyId: 'ABC', + customMappings: [ + { from: 'MOVIE_WATCHED', to: 'movieWatched' }, + { from: 'NUMBER_OF_RATINGS', to: 'numberOfRatings' }, + ], + datasetARN: '', + eventChoice: 'PutEvents', + disableStringify: false, + region: 'us-east-1', + secretAccessKey: 'DEF', + trackingId: 'c60', + }, + Enabled: true, + Transformations: [], + IsProcessorEnabled: true, + }, + libraries: [], + request: { query: {} }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + metadata: { + sourceId: '1pe7ty3hMMQCnrfZ0Mn2QG48884', + destinationId: '1pe9WgFOuFHOSIfmUkkhVTD1Rsd', + jobId: 1, + destinationType: 'PERSONALIZE', + messageId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + messageIds: null, + rudderId: 'daf823fb-e8d3-413a-8313-d34cd756f968', + }, + output: { + sessionId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + trackingId: 'c60', + userId: '', + eventList: [ + { + itemId: '4bb69e26-b5a6-446a-a140-dbb6263369c9', + eventType: 'PRODUCT ADDED', + sentAt: '2023-01-10T01:56:46.896+05:30', + properties: { movieWatched: '2', numberOfRatings: 'checking with webapp change' }, + }, + ], + }, + statusCode: 200, + }, + ], + }, + }, + }, +]; diff --git a/test/integrations/destinations/pinterest_tag/processor/data.ts b/test/integrations/destinations/pinterest_tag/processor/data.ts new file mode 100644 index 0000000000..344d4ff507 --- /dev/null +++ b/test/integrations/destinations/pinterest_tag/processor/data.ts @@ -0,0 +1,3435 @@ +export const data = [ + { + name: 'pinterest_tag', + description: 'Test 0', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + type: 'track', + event: 'ABC Searched', + sentAt: '2020-08-14T05:30:30.118Z', + channel: 'web', + context: { + source: 'test', + userAgent: 'chrome', + traits: { + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + email: 'abc@gmail.com', + phone: '+1234589947', + gender: 'non-binary', + db: '19950715', + lastname: 'Rudderlabs', + firstName: 'Test', + address: { city: 'Kolkata', state: 'WB', zip: '700114', country: 'IN' }, + }, + 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: { + tax: 2, + total: 27.5, + coupon: 'hasbros', + revenue: 48, + price: 25, + quantity: 2, + currency: 'USD', + discount: 2.5, + order_id: '50314b8e9bcf000000000000', + requestIP: '123.0.0.0', + optOutType: 'LDP', + 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', + }, + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + integrations: { All: true }, + }, + destination: { + DestinationDefinition: { Config: { cdkV2Enabled: true } }, + ID: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', + Name: 'PINTEREST_TAG', + Config: { + tagId: '123456789', + advertiserId: '429047995', + appId: '429047995', + enhancedMatch: true, + enableDeduplication: true, + deduplicationKey: 'messageId', + sendingUnHashedData: true, + sendAsTestEvent: true, + customProperties: [{ properties: 'presentclass' }, { properties: 'presentgrade' }], + eventsMapping: [{ from: 'ABC Searched', to: 'WatchVideo' }], + }, + Enabled: true, + Transformations: [], + }, + metadata: { destintionId: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq' }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + metadata: { destintionId: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq' }, + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://ct.pinterest.com/events/v3', + headers: { 'Content-Type': 'application/json' }, + params: { test: true }, + body: { + JSON: { + action_source: 'web', + event_name: 'watch_video', + event_time: 1597383030, + event_id: '7208bbb6-2c4e-45bb-bf5b-ad426f3593e9', + app_id: '429047995', + advertiser_id: '429047995', + user_data: { + em: ['48ddb93f0b30c475423fe177832912c5bcdce3cc72872f8051627967ef278e08'], + ph: ['d164bbe036663cb5c96835e9ccc6501e9a521127ea62f6359744928ba932413b'], + ln: ['dcf000c2386fb76d22cefc0d118a8511bb75999019cd373df52044bccd1bd251'], + fn: ['9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08'], + ct: ['6689106ca7922c30b2fd2c175c85bc7fc2d52cc4941bdd7bb622c6cdc6284a85'], + st: ['3b45022ab36728cdae12e709e945bba267c50ee8a91e6e4388539a8e03a3fdcd'], + zp: ['1a4292e00780e18d00e76fde9850aee5344e939ba593333cd5e4b4aa2cd33b0c'], + country: ['582967534d0f909d196b97f9e6921342777aea87b46fa52df165389db1fb8ccf'], + hashed_maids: [ + '6ca13d52ca70c883e0f0bb101e425a89e8624de51db2d2392593af6a84118090', + ], + client_user_agent: 'chrome', + ge: ['1b16b1df538ba12dc3f97edbb85caa7050d46c148134290feba80f8236c83db9'], + }, + custom_data: { + currency: 'USD', + value: '27.5', + order_id: '50314b8e9bcf000000000000', + opt_out_type: 'LDP', + num_items: 3, + content_ids: ['507f1f77bcf86cd799439011', '505bd76785ebb509fc183733'], + contents: [ + { quantity: 1, item_price: '19' }, + { quantity: 2, item_price: '3' }, + ], + }, + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'pinterest_tag', + description: 'Test 1', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + type: 'track', + event: 'Order completed', + sentAt: '2020-08-14T05:30:30.118Z', + channel: 'web', + context: { + source: 'test', + userAgent: 'chrome', + traits: { + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + email: 'abc@gmail.com', + phone: '+1234589947', + ge: 'male', + db: '19950715', + lastname: 'Rudderlabs', + firstName: 'Test', + address: { city: 'Kolkata', state: 'WB', zip: '700114', country: 'IN' }, + }, + 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: { + tax: 2, + total: 27.5, + coupon: 'hasbros', + revenue: 48, + price: 25, + quantity: 2, + currency: 'USD', + discount: 2.5, + order_id: '50314b8e9bcf000000000000', + requestIP: '123.0.0.0', + 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', + }, + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + integrations: { All: true }, + }, + destination: { + DestinationDefinition: { Config: { cdkV2Enabled: true } }, + ID: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', + Name: 'PINTEREST_TAG', + Config: { + sendAsTestEvent: false, + tagId: '123456789', + advertiserId: '429047995', + appId: '429047995', + sendingUnHashedData: true, + enableDeduplication: true, + deduplicationKey: 'messageId', + enhancedMatch: true, + customProperties: [{ properties: 'presentclass' }, { properties: 'presentgrade' }], + eventsMapping: [{ from: 'ABC Searched', to: 'WatchVideo' }], + }, + Enabled: true, + Transformations: [], + }, + metadata: { destintionId: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq' }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + metadata: { destintionId: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq' }, + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://ct.pinterest.com/events/v3', + headers: { 'Content-Type': 'application/json' }, + params: {}, + body: { + JSON: { + action_source: 'web', + event_name: 'checkout', + event_time: 1597383030, + event_id: '7208bbb6-2c4e-45bb-bf5b-ad426f3593e9', + app_id: '429047995', + advertiser_id: '429047995', + user_data: { + em: ['48ddb93f0b30c475423fe177832912c5bcdce3cc72872f8051627967ef278e08'], + ph: ['d164bbe036663cb5c96835e9ccc6501e9a521127ea62f6359744928ba932413b'], + ln: ['dcf000c2386fb76d22cefc0d118a8511bb75999019cd373df52044bccd1bd251'], + fn: ['9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08'], + ct: ['6689106ca7922c30b2fd2c175c85bc7fc2d52cc4941bdd7bb622c6cdc6284a85'], + st: ['3b45022ab36728cdae12e709e945bba267c50ee8a91e6e4388539a8e03a3fdcd'], + zp: ['1a4292e00780e18d00e76fde9850aee5344e939ba593333cd5e4b4aa2cd33b0c'], + country: ['582967534d0f909d196b97f9e6921342777aea87b46fa52df165389db1fb8ccf'], + hashed_maids: [ + '6ca13d52ca70c883e0f0bb101e425a89e8624de51db2d2392593af6a84118090', + ], + client_user_agent: 'chrome', + }, + custom_data: { + currency: 'USD', + value: '27.5', + order_id: '50314b8e9bcf000000000000', + num_items: 3, + content_ids: ['507f1f77bcf86cd799439011', '505bd76785ebb509fc183733'], + contents: [ + { quantity: 1, item_price: '19' }, + { quantity: 2, item_price: '3' }, + ], + }, + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'pinterest_tag', + description: 'Test 2', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + type: 'track', + event: 'product added', + sentAt: '2020-08-14T05:30:30.118Z', + channel: 'web', + context: { + source: 'test', + userAgent: 'chrome', + traits: { + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + email: 'abc@gmail.com', + phone: '+1234589947', + ge: 'male', + db: '19950715', + lastname: 'Rudderlabs', + firstName: 'Test', + address: { city: 'Kolkata', state: 'WB', zip: '700114', country: 'IN' }, + }, + 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: { + product_id: '123', + tax: 2, + total: 27.5, + coupon: 'hasbros', + revenue: 48, + price: 25, + quantity: 2, + currency: 'USD', + discount: 2.5, + order_id: '50314b8e9bcf000000000000', + requestIP: '123.0.0.0', + shipping: 3, + subtotal: 22.5, + affiliation: 'Google Store', + checkout_id: 'fksdjfsdjfisjf9sdfjsd9f', + }, + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + integrations: { All: true }, + }, + destination: { + DestinationDefinition: { Config: { cdkV2Enabled: true } }, + ID: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', + Name: 'PINTEREST_TAG', + Config: { + sendAsTestEvent: false, + tagId: '123456789', + advertiserId: '429047995', + appId: '429047995', + sendingUnHashedData: true, + enableDeduplication: true, + deduplicationKey: 'messageId', + enhancedMatch: true, + customProperties: [{ properties: 'presentclass' }, { properties: 'presentgrade' }], + eventsMapping: [{ from: 'ABC Searched', to: 'WatchVideo' }], + }, + Enabled: true, + Transformations: [], + }, + metadata: { destintionId: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq' }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + metadata: { destintionId: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq' }, + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://ct.pinterest.com/events/v3', + headers: { 'Content-Type': 'application/json' }, + params: {}, + body: { + JSON: { + event_name: 'add_to_cart', + action_source: 'web', + event_time: 1597383030, + event_id: '7208bbb6-2c4e-45bb-bf5b-ad426f3593e9', + app_id: '429047995', + advertiser_id: '429047995', + user_data: { + em: ['48ddb93f0b30c475423fe177832912c5bcdce3cc72872f8051627967ef278e08'], + ph: ['d164bbe036663cb5c96835e9ccc6501e9a521127ea62f6359744928ba932413b'], + ln: ['dcf000c2386fb76d22cefc0d118a8511bb75999019cd373df52044bccd1bd251'], + fn: ['9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08'], + ct: ['6689106ca7922c30b2fd2c175c85bc7fc2d52cc4941bdd7bb622c6cdc6284a85'], + st: ['3b45022ab36728cdae12e709e945bba267c50ee8a91e6e4388539a8e03a3fdcd'], + zp: ['1a4292e00780e18d00e76fde9850aee5344e939ba593333cd5e4b4aa2cd33b0c'], + country: ['582967534d0f909d196b97f9e6921342777aea87b46fa52df165389db1fb8ccf'], + hashed_maids: [ + '6ca13d52ca70c883e0f0bb101e425a89e8624de51db2d2392593af6a84118090', + ], + client_user_agent: 'chrome', + }, + custom_data: { + currency: 'USD', + value: '27.5', + order_id: '50314b8e9bcf000000000000', + num_items: 2, + content_ids: ['123'], + contents: [{ quantity: 2, item_price: '25' }], + }, + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'pinterest_tag', + description: 'Test 3', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + type: 'track', + event: 'Product List Filtered', + sentAt: '2020-08-14T05:30:30.118Z', + context: { + source: 'test', + userAgent: 'chrome', + traits: { + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + email: 'abc@gmail.com', + phone: '+1234589947', + ge: 'male', + db: '19950715', + lastname: 'Rudderlabs', + firstName: 'Test', + address: { city: 'Kolkata', state: 'WB', zip: '700114', country: 'IN' }, + }, + 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: { + tax: 2, + total: 27.5, + coupon: 'hasbros', + revenue: 48, + price: 25, + quantity: 2, + currency: 'USD', + discount: 2.5, + order_id: '50314b8e9bcf000000000000', + requestIP: '123.0.0.0', + 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', + }, + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + integrations: { All: true }, + }, + destination: { + DestinationDefinition: { Config: { cdkV2Enabled: true } }, + ID: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', + Name: 'PINTEREST_TAG', + destinationDefinition: { Config: { cdkV2Enabled: true } }, + Config: { + sendAsTestEvent: false, + tagId: '123456789', + advertiserId: '', + appId: '429047995', + sendingUnHashedData: true, + enableDeduplication: true, + deduplicationKey: 'messageId', + enhancedMatch: true, + customProperties: [{ properties: 'presentclass' }, { properties: 'presentgrade' }], + eventsMapping: [{ from: 'ABC Searched', to: 'WatchVideo' }], + }, + Enabled: true, + Transformations: [], + }, + metadata: { destintionId: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq' }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + error: + 'Advertiser Id not found. Aborting: Workflow: procWorkflow, Step: validateInput, ChildStep: undefined, OriginalError: Advertiser Id not found. Aborting', + metadata: { destintionId: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq' }, + statTags: { + destType: 'PINTEREST_TAG', + errorCategory: 'platform', + feature: 'processor', + implementation: 'cdkV2', + module: 'destination', + }, + statusCode: 400, + }, + ], + }, + }, + }, + { + name: 'pinterest_tag', + description: 'Test 4', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + type: 'track', + event: 'Product List Filtered', + sentAt: '2020-08-14T05:30:30.118Z', + channel: 'web', + context: { + source: 'test', + userAgent: 'chrome', + traits: { + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + phone: '+1234589947', + ge: 'male', + db: '19950715', + lastname: 'Rudderlabs', + firstName: 'Test', + address: { city: 'Kolkata', state: 'WB', zip: '700114', country: 'IN' }, + }, + library: { name: 'rudder-sdk-ruby-sync', version: '1.0.6' }, + }, + messageId: '7208bbb6-2c4e-45bb-bf5b-ad426f3593e9', + timestamp: '2020-08-14T05:30:30.118Z', + properties: { + tax: 2, + total: 27.5, + coupon: 'hasbros', + revenue: 48, + price: 25, + quantity: 2, + currency: 'USD', + discount: 2.5, + order_id: '50314b8e9bcf000000000000', + requestIP: '123.0.0.0', + 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', + }, + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + integrations: { All: true }, + }, + destination: { + DestinationDefinition: { Config: { cdkV2Enabled: true } }, + ID: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', + Name: 'PINTEREST_TAG', + Config: { + sendAsTestEvent: false, + tagId: '123456789', + advertiserId: '429047995', + appId: '429047995', + sendingUnHashedData: true, + enableDeduplication: true, + deduplicationKey: 'messageId', + enhancedMatch: true, + customProperties: [{ properties: 'presentclass' }, { properties: 'presentgrade' }], + eventsMapping: [{ from: 'ABC Searched', to: 'WatchVideo' }], + }, + Enabled: true, + Transformations: [], + }, + metadata: { destintionId: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq' }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + metadata: { destintionId: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq' }, + error: + 'It is required at least one of em, hashed_maids or pair of client_ip_address and client_user_agent: Workflow: procWorkflow, Step: validateUserFields, ChildStep: undefined, OriginalError: It is required at least one of em, hashed_maids or pair of client_ip_address and client_user_agent', + statTags: { + destType: 'PINTEREST_TAG', + errorCategory: 'platform', + feature: 'processor', + implementation: 'cdkV2', + module: 'destination', + }, + statusCode: 400, + }, + ], + }, + }, + }, + { + name: 'pinterest_tag', + description: 'Test 5', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + type: 'track', + event: 'ABC Searched', + sentAt: '2020-08-14T05:30:30.118Z', + channel: 'web', + context: { + source: 'test', + userAgent: 'chrome', + traits: { + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + email: 'abc@gmail.com', + phone: '+1234589947', + ge: 'male', + db: '19950715', + lastname: 'Rudderlabs', + firstName: 'Test', + address: { city: 'Kolkata', state: 'WB', zip: '700114', country: 'IN' }, + }, + 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: { + tax: 2, + total: 27.5, + coupon: 'hasbros', + revenue: 48, + price: 25, + quantity: 2, + currency: 'USD', + discount: 2.5, + order_id: '50314b8e9bcf000000000000', + requestIP: '123.0.0.0', + numOfItems: 2, + 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', + }, + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + integrations: { All: true }, + }, + destination: { + DestinationDefinition: { Config: { cdkV2Enabled: true } }, + ID: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', + Name: 'PINTEREST_TAG', + Config: { + sendAsTestEvent: false, + tagId: '123456789', + advertiserId: '429047995', + appId: '429047995', + sendingUnHashedData: true, + enableDeduplication: true, + deduplicationKey: 'messageId', + enhancedMatch: true, + customProperties: [{ properties: 'presentclass' }, { properties: 'presentgrade' }], + eventsMapping: [{ from: 'ABC Searched', to: 'WatchVideo' }], + }, + Enabled: true, + Transformations: [], + }, + metadata: { destintionId: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq' }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + metadata: { destintionId: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq' }, + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://ct.pinterest.com/events/v3', + headers: { 'Content-Type': 'application/json' }, + params: {}, + body: { + JSON: { + event_name: 'watch_video', + event_time: 1597383030, + action_source: 'web', + event_id: '7208bbb6-2c4e-45bb-bf5b-ad426f3593e9', + app_id: '429047995', + advertiser_id: '429047995', + user_data: { + em: ['48ddb93f0b30c475423fe177832912c5bcdce3cc72872f8051627967ef278e08'], + ph: ['d164bbe036663cb5c96835e9ccc6501e9a521127ea62f6359744928ba932413b'], + ln: ['dcf000c2386fb76d22cefc0d118a8511bb75999019cd373df52044bccd1bd251'], + fn: ['9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08'], + ct: ['6689106ca7922c30b2fd2c175c85bc7fc2d52cc4941bdd7bb622c6cdc6284a85'], + st: ['3b45022ab36728cdae12e709e945bba267c50ee8a91e6e4388539a8e03a3fdcd'], + zp: ['1a4292e00780e18d00e76fde9850aee5344e939ba593333cd5e4b4aa2cd33b0c'], + country: ['582967534d0f909d196b97f9e6921342777aea87b46fa52df165389db1fb8ccf'], + hashed_maids: [ + '6ca13d52ca70c883e0f0bb101e425a89e8624de51db2d2392593af6a84118090', + ], + client_user_agent: 'chrome', + }, + custom_data: { + currency: 'USD', + value: '27.5', + num_items: 2, + order_id: '50314b8e9bcf000000000000', + content_ids: ['507f1f77bcf86cd799439011', '505bd76785ebb509fc183733'], + contents: [ + { quantity: 1, item_price: '19' }, + { quantity: 2, item_price: '3' }, + ], + }, + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'pinterest_tag', + description: 'Test 6', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + type: 'track', + event: 'ABC Searched', + sentAt: '2020-08-14T05:30:30.118Z', + channel: 'web', + context: { + source: 'test', + userAgent: 'chrome', + traits: { + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + email: 'abc@gmail.com', + phone: '+1234589947', + ge: 'male', + db: '19950715', + lastname: 'Rudderlabs', + firstName: 'Test', + address: { city: 'Kolkata', state: 'WB', zip: '700114', country: 'IN' }, + }, + 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: { + tax: 2, + total: 27.5, + coupon: 'hasbros', + revenue: 48, + price: 25, + quantity: 2, + currency: 'USD', + discount: 2.5, + order_id: '50314b8e9bcf000000000000', + requestIP: '123.0.0.0', + numOfItems: 2, + 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', + }, + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + integrations: { All: true }, + }, + destination: { + DestinationDefinition: { Config: { cdkV2Enabled: true } }, + ID: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', + Name: 'PINTEREST_TAG', + Config: { + sendAsTestEvent: false, + tagId: '123456789', + advertiserId: '', + appId: '429047995', + sendingUnHashedData: true, + enableDeduplication: true, + deduplicationKey: 'messageId', + enhancedMatch: true, + customProperties: [{ properties: 'presentclass' }, { properties: 'presentgrade' }], + eventsMapping: [{ from: 'ABC Searched', to: 'WatchVideo' }], + }, + Enabled: true, + Transformations: [], + }, + metadata: { destintionId: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq' }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + error: + 'Advertiser Id not found. Aborting: Workflow: procWorkflow, Step: validateInput, ChildStep: undefined, OriginalError: Advertiser Id not found. Aborting', + metadata: { destintionId: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq' }, + statTags: { + destType: 'PINTEREST_TAG', + errorCategory: 'platform', + feature: 'processor', + implementation: 'cdkV2', + module: 'destination', + }, + statusCode: 400, + }, + ], + }, + }, + }, + { + name: 'pinterest_tag', + description: 'Test 7', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + type: 'group', + event: 'ABC Searched', + sentAt: '2020-08-14T05:30:30.118Z', + context: { + source: 'test', + userAgent: 'chrome', + traits: { + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + email: 'abc@gmail.com', + phone: '+1234589947', + ge: 'male', + db: '19950715', + lastname: 'Rudderlabs', + firstName: 'Test', + address: { city: 'Kolkata', state: 'WB', zip: '700114', country: 'IN' }, + }, + 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: { + tax: 2, + total: 27.5, + coupon: 'hasbros', + revenue: 48, + price: 25, + quantity: 2, + currency: 'USD', + discount: 2.5, + order_id: '50314b8e9bcf000000000000', + requestIP: '123.0.0.0', + numOfItems: 2, + 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', + }, + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + integrations: { All: true }, + }, + destination: { + DestinationDefinition: { Config: { cdkV2Enabled: true } }, + ID: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', + Name: 'PINTEREST_TAG', + Config: { + sendAsTestEvent: false, + tagId: '123456789', + advertiserId: '123456', + appId: '429047995', + enhancedMatch: true, + sendingUnHashedData: true, + enableDeduplication: true, + deduplicationKey: 'messageId', + customProperties: [{ properties: 'presentclass' }, { properties: 'presentgrade' }], + eventsMapping: [{ from: 'ABC Searched', to: 'WatchVideo' }], + }, + Enabled: true, + Transformations: [], + }, + metadata: { destintionId: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq' }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + error: + 'message type group is not supported: Workflow: procWorkflow, Step: validateInput, ChildStep: undefined, OriginalError: message type group is not supported', + metadata: { destintionId: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq' }, + statTags: { + destType: 'PINTEREST_TAG', + errorCategory: 'platform', + feature: 'processor', + implementation: 'cdkV2', + module: 'destination', + }, + statusCode: 400, + }, + ], + }, + }, + }, + { + name: 'pinterest_tag', + description: 'Test 8', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + type: 'track', + event: 'ABC Searched', + channel: 'abc', + sentAt: '2020-08-14T05:30:30.118Z', + context: { + source: 'test', + userAgent: 'chrome', + traits: { + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + email: 'abc@gmail.com', + phone: '+1234589947', + ge: 'male', + db: '19950715', + lastname: 'Rudderlabs', + firstName: 'Test', + address: { city: 'Kolkata', state: 'WB', zip: '700114', country: 'IN' }, + }, + 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: { + tax: 2, + total: 27.5, + coupon: 'hasbros', + revenue: 48, + price: 25, + quantity: 2, + currency: 'USD', + discount: 2.5, + order_id: '50314b8e9bcf000000000000', + requestIP: '123.0.0.0', + numOfItems: 2, + 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', + }, + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + integrations: { All: true }, + }, + destination: { + DestinationDefinition: { Config: { cdkV2Enabled: true } }, + ID: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', + Name: 'PINTEREST_TAG', + Config: { + sendAsTestEvent: false, + tagId: '123456789', + advertiserId: '123456', + appId: '429047995', + sendingUnHashedData: true, + enableDeduplication: true, + deduplicationKey: 'messageId', + enhancedMatch: true, + customProperties: [{ properties: 'presentclass' }, { properties: 'presentgrade' }], + eventsMapping: [{ from: 'ABC Searched', to: 'WatchVideo' }], + }, + Enabled: true, + Transformations: [], + }, + metadata: { destintionId: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq' }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + metadata: { destintionId: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq' }, + error: + 'Action source must be one of app_android, app_ios, web, offline: Workflow: procWorkflow, Step: validateCommonFields, ChildStep: undefined, OriginalError: Action source must be one of app_android, app_ios, web, offline', + statTags: { + destType: 'PINTEREST_TAG', + errorCategory: 'platform', + feature: 'processor', + implementation: 'cdkV2', + module: 'destination', + }, + statusCode: 400, + }, + ], + }, + }, + }, + { + name: 'pinterest_tag', + description: 'Test 9', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + type: 'track', + event: 'custom event', + channel: 'web', + sentAt: '2020-08-14T05:30:30.118Z', + context: { + source: 'test', + userAgent: 'chrome', + traits: { + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + email: 'abc@gmail.com', + phone: '+1234589947', + ge: 'male', + db: '19950715', + lastname: 'Rudderlabs', + firstName: 'Test', + address: { city: 'Kolkata', state: 'WB', zip: '700114', country: 'IN' }, + }, + 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: { + tax: 2, + total: 27.5, + coupon: 'hasbros', + revenue: 48, + price: 25, + quantity: 2, + currency: 'USD', + discount: 2.5, + order_id: '50314b8e9bcf000000000000', + requestIP: '123.0.0.0', + numOfItems: 2, + 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', + }, + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + integrations: { All: true }, + }, + destination: { + DestinationDefinition: { Config: { cdkV2Enabled: true } }, + ID: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', + Name: 'PINTEREST_TAG', + Config: { + sendAsTestEvent: false, + tagId: '123456789', + advertiserId: '123456', + appId: '429047995', + sendingUnHashedData: true, + enableDeduplication: true, + deduplicationKey: 'messageId', + enhancedMatch: true, + sendAsCustomEvent: true, + customProperties: [{ properties: 'presentclass' }, { properties: 'presentgrade' }], + eventsMapping: [{ from: 'ABC Searched', to: 'WatchVideo' }], + }, + Enabled: true, + Transformations: [], + }, + metadata: { destintionId: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq' }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + metadata: { destintionId: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq' }, + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://ct.pinterest.com/events/v3', + headers: { 'Content-Type': 'application/json' }, + params: {}, + body: { + JSON: { + event_name: 'custom', + event_time: 1597383030, + event_id: '7208bbb6-2c4e-45bb-bf5b-ad426f3593e9', + app_id: '429047995', + action_source: 'web', + advertiser_id: '123456', + user_data: { + em: ['48ddb93f0b30c475423fe177832912c5bcdce3cc72872f8051627967ef278e08'], + ph: ['d164bbe036663cb5c96835e9ccc6501e9a521127ea62f6359744928ba932413b'], + ln: ['dcf000c2386fb76d22cefc0d118a8511bb75999019cd373df52044bccd1bd251'], + fn: ['9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08'], + ct: ['6689106ca7922c30b2fd2c175c85bc7fc2d52cc4941bdd7bb622c6cdc6284a85'], + st: ['3b45022ab36728cdae12e709e945bba267c50ee8a91e6e4388539a8e03a3fdcd'], + zp: ['1a4292e00780e18d00e76fde9850aee5344e939ba593333cd5e4b4aa2cd33b0c'], + country: ['582967534d0f909d196b97f9e6921342777aea87b46fa52df165389db1fb8ccf'], + hashed_maids: [ + '6ca13d52ca70c883e0f0bb101e425a89e8624de51db2d2392593af6a84118090', + ], + client_user_agent: 'chrome', + }, + custom_data: { + currency: 'USD', + value: '27.5', + num_items: 2, + order_id: '50314b8e9bcf000000000000', + content_ids: ['507f1f77bcf86cd799439011', '505bd76785ebb509fc183733'], + contents: [ + { quantity: 1, item_price: '19' }, + { quantity: 2, item_price: '3' }, + ], + }, + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'pinterest_tag', + description: 'Test 10', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + type: 'page', + name: 'ApplicationLoaded', + channel: 'web', + sentAt: '2020-08-14T05:30:30.118Z', + context: { + source: 'test', + userAgent: 'chrome', + traits: { + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + email: 'abc@gmail.com', + phone: '+1234589947', + ge: 'male', + db: '19950715', + lastname: 'Rudderlabs', + firstName: 'Test', + address: { city: 'Kolkata', state: 'WB', zip: '700114', country: 'IN' }, + }, + 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: { path: '', referrer: '', search: '', title: '', url: '' }, + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + integrations: { All: true }, + }, + destination: { + DestinationDefinition: { Config: { cdkV2Enabled: true } }, + ID: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', + Name: 'PINTEREST_TAG', + Config: { + sendAsTestEvent: false, + tagId: '123456789', + advertiserId: '123456', + appId: '429047995', + sendingUnHashedData: true, + enableDeduplication: true, + deduplicationKey: 'messageId', + enhancedMatch: true, + customProperties: [{ properties: 'presentclass' }, { properties: 'presentgrade' }], + eventsMapping: [{ from: 'ABC Searched', to: 'WatchVideo' }], + }, + Enabled: true, + Transformations: [], + }, + metadata: { destintionId: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq' }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + metadata: { destintionId: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq' }, + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://ct.pinterest.com/events/v3', + headers: { 'Content-Type': 'application/json' }, + params: {}, + body: { + JSON: { + event_time: 1597383030, + event_id: '7208bbb6-2c4e-45bb-bf5b-ad426f3593e9', + action_source: 'web', + event_name: 'page_visit', + app_id: '429047995', + advertiser_id: '123456', + user_data: { + em: ['48ddb93f0b30c475423fe177832912c5bcdce3cc72872f8051627967ef278e08'], + ph: ['d164bbe036663cb5c96835e9ccc6501e9a521127ea62f6359744928ba932413b'], + ln: ['dcf000c2386fb76d22cefc0d118a8511bb75999019cd373df52044bccd1bd251'], + fn: ['9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08'], + ct: ['6689106ca7922c30b2fd2c175c85bc7fc2d52cc4941bdd7bb622c6cdc6284a85'], + st: ['3b45022ab36728cdae12e709e945bba267c50ee8a91e6e4388539a8e03a3fdcd'], + zp: ['1a4292e00780e18d00e76fde9850aee5344e939ba593333cd5e4b4aa2cd33b0c'], + country: ['582967534d0f909d196b97f9e6921342777aea87b46fa52df165389db1fb8ccf'], + hashed_maids: [ + '6ca13d52ca70c883e0f0bb101e425a89e8624de51db2d2392593af6a84118090', + ], + client_user_agent: 'chrome', + }, + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'pinterest_tag', + description: 'Test 11', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + type: 'page', + name: 'ApplicationLoaded', + category: 'test category', + channel: 'web', + sentAt: '2020-08-14T05:30:30.118Z', + context: { + source: 'test', + userAgent: 'chrome', + traits: { + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + email: 'abc@gmail.com', + phone: '+1234589947', + ge: 'male', + db: '19950715', + lastname: 'Rudderlabs', + firstName: 'Test', + address: { city: 'Kolkata', state: 'WB', zip: '700114', country: 'IN' }, + }, + 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: { path: '', referrer: '', search: '', title: '', url: '' }, + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + integrations: { All: true }, + }, + destination: { + DestinationDefinition: { Config: { cdkV2Enabled: true } }, + ID: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', + Name: 'PINTEREST_TAG', + Config: { + sendAsTestEvent: false, + tagId: '123456789', + advertiserId: '123456', + appId: '429047995', + sendingUnHashedData: true, + enableDeduplication: true, + deduplicationKey: 'messageId', + enhancedMatch: true, + customProperties: [{ properties: 'presentclass' }, { properties: 'presentgrade' }], + eventsMapping: [{ from: 'ABC Searched', to: 'WatchVideo' }], + }, + Enabled: true, + Transformations: [], + }, + metadata: { destintionId: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq' }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + metadata: { destintionId: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq' }, + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://ct.pinterest.com/events/v3', + headers: { 'Content-Type': 'application/json' }, + params: {}, + body: { + JSON: { + event_time: 1597383030, + event_id: '7208bbb6-2c4e-45bb-bf5b-ad426f3593e9', + action_source: 'web', + event_name: 'view_category', + app_id: '429047995', + advertiser_id: '123456', + user_data: { + em: ['48ddb93f0b30c475423fe177832912c5bcdce3cc72872f8051627967ef278e08'], + ph: ['d164bbe036663cb5c96835e9ccc6501e9a521127ea62f6359744928ba932413b'], + ln: ['dcf000c2386fb76d22cefc0d118a8511bb75999019cd373df52044bccd1bd251'], + fn: ['9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08'], + ct: ['6689106ca7922c30b2fd2c175c85bc7fc2d52cc4941bdd7bb622c6cdc6284a85'], + st: ['3b45022ab36728cdae12e709e945bba267c50ee8a91e6e4388539a8e03a3fdcd'], + zp: ['1a4292e00780e18d00e76fde9850aee5344e939ba593333cd5e4b4aa2cd33b0c'], + country: ['582967534d0f909d196b97f9e6921342777aea87b46fa52df165389db1fb8ccf'], + hashed_maids: [ + '6ca13d52ca70c883e0f0bb101e425a89e8624de51db2d2392593af6a84118090', + ], + client_user_agent: 'chrome', + }, + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'pinterest_tag', + description: 'Test 12', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + type: 'page', + name: 'ApplicationLoaded', + category: 'test category', + channel: 'web', + sentAt: '2020-08-14T05:30:30.118Z', + context: { + source: 'test', + userAgent: 'chrome', + traits: { + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + email: 'abc@gmail.com', + phone: '+1234589947', + ge: 'male', + db: '19950715', + lastname: 'Rudderlabs', + firstName: 'Test', + address: { city: 'Kolkata', state: 'WB', zip: '700114', country: 'IN' }, + }, + device: { advertisingId: 'abc123', adTrackingEnabled: true }, + library: { name: 'rudder-sdk-ruby-sync', version: '1.0.6' }, + }, + messageId: '7208bbb6-2c4e-45bb-bf5b-ad426f3593e9', + timestamp: '2020-08-14T05:30:30.118Z', + properties: { path: '', referrer: '', search: '', title: '', url: '' }, + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + integrations: { All: true }, + }, + destination: { + DestinationDefinition: { Config: { cdkV2Enabled: true } }, + ID: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', + Name: 'PINTEREST_TAG', + Config: { + sendAsTestEvent: false, + tagId: '123456789', + advertiserId: '123456', + appId: '429047995', + sendingUnHashedData: true, + enableDeduplication: true, + deduplicationKey: 'messageId', + enhancedMatch: true, + customProperties: [{ properties: 'presentclass' }, { properties: 'presentgrade' }], + eventsMapping: [{ from: 'ABC Searched', to: 'WatchVideo' }], + }, + Enabled: true, + Transformations: [], + }, + metadata: { destintionId: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq' }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + metadata: { destintionId: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq' }, + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://ct.pinterest.com/events/v3', + headers: { 'Content-Type': 'application/json' }, + params: {}, + body: { + JSON: { + event_time: 1597383030, + opt_out: false, + event_id: '7208bbb6-2c4e-45bb-bf5b-ad426f3593e9', + action_source: 'web', + event_name: 'view_category', + app_id: '429047995', + advertiser_id: '123456', + user_data: { + em: ['48ddb93f0b30c475423fe177832912c5bcdce3cc72872f8051627967ef278e08'], + ph: ['d164bbe036663cb5c96835e9ccc6501e9a521127ea62f6359744928ba932413b'], + ln: ['dcf000c2386fb76d22cefc0d118a8511bb75999019cd373df52044bccd1bd251'], + fn: ['9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08'], + ct: ['6689106ca7922c30b2fd2c175c85bc7fc2d52cc4941bdd7bb622c6cdc6284a85'], + st: ['3b45022ab36728cdae12e709e945bba267c50ee8a91e6e4388539a8e03a3fdcd'], + zp: ['1a4292e00780e18d00e76fde9850aee5344e939ba593333cd5e4b4aa2cd33b0c'], + country: ['582967534d0f909d196b97f9e6921342777aea87b46fa52df165389db1fb8ccf'], + hashed_maids: [ + '6ca13d52ca70c883e0f0bb101e425a89e8624de51db2d2392593af6a84118090', + ], + client_user_agent: 'chrome', + }, + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'pinterest_tag', + description: 'Test 13', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + type: 'page', + name: 'ApplicationLoaded', + category: 'test category', + channel: 'web', + sentAt: '2020-08-14T05:30:30.118Z', + context: { + source: 'test', + userAgent: 'chrome', + ip: '127.0.0.0', + traits: { + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + phone: '+1234589947', + ge: 'male', + db: '19950715', + lastname: 'Rudderlabs', + firstName: 'Test', + address: { city: 'Kolkata', state: 'WB', zip: '700114', country: 'IN' }, + }, + device: { adTrackingEnabled: false }, + library: { name: 'rudder-sdk-ruby-sync', version: '1.0.6' }, + }, + messageId: '7208bbb6-2c4e-45bb-bf5b-ad426f3593e9', + timestamp: '2020-08-14T05:30:30.118Z', + properties: { path: '', referrer: '', search: '', title: '', url: '' }, + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + integrations: { All: true }, + }, + destination: { + DestinationDefinition: { Config: { cdkV2Enabled: true } }, + ID: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', + Name: 'PINTEREST_TAG', + Config: { + sendAsTestEvent: false, + tagId: '123456789', + advertiserId: '123456', + appId: '429047995', + sendingUnHashedData: true, + enableDeduplication: true, + deduplicationKey: 'messageId', + enhancedMatch: true, + customProperties: [{ properties: 'presentclass' }, { properties: 'presentgrade' }], + eventsMapping: [{ from: 'ABC Searched', to: 'WatchVideo' }], + }, + Enabled: true, + Transformations: [], + }, + metadata: { destintionId: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq' }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + metadata: { destintionId: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq' }, + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://ct.pinterest.com/events/v3', + headers: { 'Content-Type': 'application/json' }, + params: {}, + body: { + JSON: { + event_time: 1597383030, + opt_out: true, + event_id: '7208bbb6-2c4e-45bb-bf5b-ad426f3593e9', + action_source: 'web', + event_name: 'view_category', + app_id: '429047995', + advertiser_id: '123456', + user_data: { + ph: ['d164bbe036663cb5c96835e9ccc6501e9a521127ea62f6359744928ba932413b'], + ln: ['dcf000c2386fb76d22cefc0d118a8511bb75999019cd373df52044bccd1bd251'], + fn: ['9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08'], + ct: ['6689106ca7922c30b2fd2c175c85bc7fc2d52cc4941bdd7bb622c6cdc6284a85'], + st: ['3b45022ab36728cdae12e709e945bba267c50ee8a91e6e4388539a8e03a3fdcd'], + zp: ['1a4292e00780e18d00e76fde9850aee5344e939ba593333cd5e4b4aa2cd33b0c'], + country: ['582967534d0f909d196b97f9e6921342777aea87b46fa52df165389db1fb8ccf'], + client_ip_address: '127.0.0.0', + client_user_agent: 'chrome', + }, + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'pinterest_tag', + description: 'Test 14', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + type: 'page', + name: 'ApplicationLoaded', + category: 'test category', + channel: 'web', + sentAt: '2020-08-14T05:30:30.118Z', + context: { + source: 'test', + userAgent: 'chrome', + requestIP: '127.0.0.0', + traits: { + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + phone: 'Hashed phone', + gender: 'Hashed Gender', + dob: 'Hashed DB', + lastname: 'Hashed Lastname', + firstName: 'Hashed FirstName', + address: { + city: 'Hashed City', + state: 'Hashed State', + zip: 'Hashed Zip', + country: 'Hashed country', + }, + }, + device: { adTrackingEnabled: false, advertisingId: 'Hashed maids' }, + library: { name: 'rudder-sdk-ruby-sync', version: '1.0.6' }, + }, + messageId: '7208bbb6-2c4e-45bb-bf5b-ad426f3593e9', + timestamp: '2020-08-14T05:30:30.118Z', + properties: { path: '', referrer: '', search: '', title: '', url: '' }, + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + }, + destination: { + DestinationDefinition: { Config: { cdkV2Enabled: true } }, + ID: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', + Name: 'PINTEREST_TAG', + Config: { + sendAsTestEvent: false, + tagId: '123456789', + advertiserId: '123456', + appId: '429047995', + sendingUnHashedData: false, + enhancedMatch: true, + customProperties: [{ properties: 'presentclass' }, { properties: 'presentgrade' }], + eventsMapping: [{ from: 'ABC Searched', to: 'WatchVideo' }], + }, + Enabled: true, + Transformations: [], + }, + metadata: { destintionId: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq' }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + metadata: { destintionId: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq' }, + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://ct.pinterest.com/events/v3', + headers: { 'Content-Type': 'application/json' }, + params: {}, + body: { + JSON: { + event_time: 1597383030, + action_source: 'web', + opt_out: true, + event_name: 'view_category', + app_id: '429047995', + advertiser_id: '123456', + event_id: '7208bbb6-2c4e-45bb-bf5b-ad426f3593e9', + user_data: { + ph: ['Hashed phone'], + db: ['Hashed DB'], + ln: ['Hashed Lastname'], + fn: ['Hashed FirstName'], + ct: ['Hashed City'], + st: ['Hashed State'], + zp: ['Hashed Zip'], + country: ['Hashed country'], + hashed_maids: ['Hashed maids'], + ge: ['Hashed Gender'], + client_user_agent: 'chrome', + }, + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'pinterest_tag', + description: 'Test 15', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + type: 'page', + name: 'ApplicationLoaded', + category: 'test category', + channel: 'web', + sentAt: '2020-08-14T05:30:30.118Z', + context: { + source: 'test', + userAgent: 'chrome', + requestIP: '127.0.0.0', + traits: { + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + phone: ['Hashed phone', 'Hashed phone1'], + gender: ['Hashed Gender', 'Hashed Gender1'], + dob: ['Hashed DB', 'Hashed DB1'], + lastname: ['Hashed Lastname', 'Hashed Lastname1'], + firstName: ['Hashed FirstName', 'Hashed FirstName1'], + address: { + city: ['Hashed City', 'Hashed City1'], + state: ['Hashed State', 'Hashed State1'], + zip: ['Hashed Zip', 'Hashed Zip1'], + country: ['Hashed country', 'Hashed country1'], + }, + }, + device: { adTrackingEnabled: false, advertisingId: 'Hashed maids' }, + library: { name: 'rudder-sdk-ruby-sync', version: '1.0.6' }, + }, + messageId: '7208bbb6-2c4e-45bb-bf5b-ad426f3593e9', + timestamp: '2020-08-14T05:30:30.118Z', + properties: { path: '', referrer: '', search: '', title: '', url: '' }, + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + }, + destination: { + DestinationDefinition: { Config: { cdkV2Enabled: true } }, + ID: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', + Name: 'PINTEREST_TAG', + Config: { + sendAsTestEvent: false, + tagId: '123456789', + advertiserId: '123456', + appId: '429047995', + sendingUnHashedData: false, + enhancedMatch: true, + customProperties: [{ properties: 'presentclass' }, { properties: 'presentgrade' }], + eventsMapping: [{ from: 'ABC Searched', to: 'WatchVideo' }], + }, + Enabled: true, + Transformations: [], + }, + metadata: { destintionId: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq' }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + metadata: { destintionId: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq' }, + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://ct.pinterest.com/events/v3', + headers: { 'Content-Type': 'application/json' }, + params: {}, + body: { + JSON: { + event_time: 1597383030, + action_source: 'web', + opt_out: true, + event_name: 'view_category', + app_id: '429047995', + advertiser_id: '123456', + event_id: '7208bbb6-2c4e-45bb-bf5b-ad426f3593e9', + user_data: { + ph: ['Hashed phone', 'Hashed phone1'], + db: ['Hashed DB', 'Hashed DB1'], + ln: ['Hashed Lastname', 'Hashed Lastname1'], + fn: ['Hashed FirstName', 'Hashed FirstName1'], + ct: ['Hashed City', 'Hashed City1'], + st: ['Hashed State', 'Hashed State1'], + zp: ['Hashed Zip', 'Hashed Zip1'], + country: ['Hashed country', 'Hashed country1'], + hashed_maids: ['Hashed maids'], + ge: ['Hashed Gender', 'Hashed Gender1'], + client_user_agent: 'chrome', + }, + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'pinterest_tag', + description: 'Test 16', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + name: 'Test Tool', + type: 'page', + sentAt: '2023-02-01T00:00:00.379Z', + userId: '', + channel: 'web', + context: { + os: { name: '', version: '' }, + app: { + name: 'RudderLabs JavaScript SDK', + version: '2.22.3', + namespace: 'com.rudderlabs.javascript', + }, + page: { + url: 'https://www.abc.com/s598907', + path: '/test-path/s598907', + title: 'Test Tool + Reviews | Rudderstack', + search: '', + tab_url: 'https://www.abc.com/s598907', + referrer: '$direct', + initial_referrer: '$direct', + referring_domain: '', + initial_referring_domain: '', + }, + locale: 'en-US', + screen: { + width: 1024, + height: 1024, + density: 1, + innerWidth: 1024, + innerHeight: 1024, + }, + traits: {}, + library: { name: 'RudderLabs JavaScript SDK', version: '2.22.3' }, + campaign: {}, + doNotSell: false, + sessionId: 1675209600203, + userAgent: + 'Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; Googlebot/2.1; +http://www.google.com/bot.html) Chrome/109.0.5414.101 Safari/537.36', + gaClientId: { + integrations: { + 'Google Ads': { gclid: '' }, + 'Google Analytics': { clientId: '1518934611.1234569600' }, + }, + }, + sessionStart: true, + }, + rudderId: '7291a10f-e7dd-49f9-94ce-0154f53897y6', + messageId: '1c77a616-13a7-4a2e-a8e7-e1a0971897y6', + timestamp: '2023-02-01T12:47:30.030Z', + properties: { + sku: '45790-32', + url: 'https://www.abc.com/23rty', + name: 'Test Tool', + path: '/test-path/tool', + email: '', + title: 'Test Tool + Reviews | Rudderstack', + review: { reviewCount: 2, averageReview: 5, reviewContentID: ['238300132'] }, + search: '', + tab_url: 'https://www.abc/com', + pageInfo: { + pageId: 's592897', + category: { + pageType: 'product', + subCategory: 'Dining & Kitchen Furniture', + pageTemplate: 'product detail grouper', + primaryCategory: 'Furniture', + }, + brandType: 'new brand', + }, + referrer: '', + subCategory: 'Dining & Kitchen Furniture', + primaryCategory: 'Furniture', + initial_referrer: '$direct', + referring_domain: '', + initial_referring_domain: '', + }, + receivedAt: '2023-02-01T12:47:30.038Z', + request_ip: '66.249.72.218', + anonymousId: 'a61c77a6-1613-474a-aee8-e7e1a0971047', + integrations: { All: true }, + originalTimestamp: '2023-02-01T00:00:00.371Z', + }, + destination: { + DestinationDefinition: { Config: { cdkV2Enabled: true } }, + ID: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', + Name: 'PINTEREST_TAG', + Config: { + sendAsTestEvent: false, + tagId: '123456789', + advertiserId: '123478671210', + sendingUnHashedData: false, + enableDeduplication: false, + eventsMapping: [ + { from: 'Product Added', to: 'AddToCart' }, + { from: 'Order Completed', to: 'Checkout' }, + { from: 'Product Viewed', to: 'PageVisit' }, + { from: 'Lead', to: 'Lead' }, + { from: 'Signup', to: 'Signup' }, + ], + enhancedMatch: true, + }, + Enabled: true, + Transformations: [], + }, + metadata: { destintionId: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq' }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + metadata: { destintionId: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq' }, + output: { + body: { + JSON: { + event_time: 1675255650, + event_source_url: 'https://www.abc.com/s598907', + action_source: 'web', + app_name: 'RudderLabs JavaScript SDK', + app_version: '2.22.3', + language: 'en-US', + event_id: '1c77a616-13a7-4a2e-a8e7-e1a0971897y6', + advertiser_id: '123478671210', + user_data: { + client_ip_address: '66.249.72.218', + client_user_agent: + 'Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; Googlebot/2.1; +http://www.google.com/bot.html) Chrome/109.0.5414.101 Safari/537.36', + }, + event_name: 'page_visit', + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://ct.pinterest.com/events/v3', + headers: { 'Content-Type': 'application/json' }, + params: {}, + files: {}, + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'pinterest_tag', + description: 'Test 17', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + type: 'track', + event: 'test', + channel: 'web', + sentAt: '2020-08-14T05:30:30.118Z', + context: { + source: 'test', + userAgent: 'chrome', + traits: { + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + email: 'abc@gmail.com', + phone: '+1234589947', + ge: 'male', + db: '19950715', + lastname: 'Rudderlabs', + firstName: 'Test', + address: { city: 'Kolkata', state: 'WB', zip: '700114', country: 'IN' }, + }, + 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: { + sku: '1234', + tax: 2, + total: 27.5, + coupon: 'hasbros', + revenue: 48, + currency: 'USD', + discount: 2.5, + order_id: '50314b8e9bcf000000000000', + requestIP: '123.0.0.0', + shipping: 3, + subtotal: 22.5, + affiliation: 'Google Store', + checkout_id: 'fksdjfsdjfisjf9sdfjsd9f', + }, + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + integrations: { All: true }, + }, + destination: { + DestinationDefinition: { Config: { cdkV2Enabled: true } }, + ID: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', + Name: 'PINTEREST_TAG', + Config: { + sendAsTestEvent: false, + tagId: '123456789', + advertiserId: '123456', + appId: '429047995', + sendingUnHashedData: true, + enableDeduplication: true, + deduplicationKey: 'messageId', + enhancedMatch: true, + sendAsCustomEvent: true, + customProperties: [{ properties: 'presentclass' }, { properties: 'presentgrade' }], + eventsMapping: [{ from: 'ABC Searched', to: 'WatchVideo' }], + }, + Enabled: true, + Transformations: [], + }, + metadata: { destintionId: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq' }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + metadata: { destintionId: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq' }, + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://ct.pinterest.com/events/v3', + headers: { 'Content-Type': 'application/json' }, + params: {}, + body: { + JSON: { + event_name: 'custom', + event_time: 1597383030, + action_source: 'web', + event_id: '7208bbb6-2c4e-45bb-bf5b-ad426f3593e9', + app_id: '429047995', + advertiser_id: '123456', + user_data: { + em: ['48ddb93f0b30c475423fe177832912c5bcdce3cc72872f8051627967ef278e08'], + ph: ['d164bbe036663cb5c96835e9ccc6501e9a521127ea62f6359744928ba932413b'], + ln: ['dcf000c2386fb76d22cefc0d118a8511bb75999019cd373df52044bccd1bd251'], + fn: ['9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08'], + ct: ['6689106ca7922c30b2fd2c175c85bc7fc2d52cc4941bdd7bb622c6cdc6284a85'], + st: ['3b45022ab36728cdae12e709e945bba267c50ee8a91e6e4388539a8e03a3fdcd'], + zp: ['1a4292e00780e18d00e76fde9850aee5344e939ba593333cd5e4b4aa2cd33b0c'], + country: ['582967534d0f909d196b97f9e6921342777aea87b46fa52df165389db1fb8ccf'], + hashed_maids: [ + '6ca13d52ca70c883e0f0bb101e425a89e8624de51db2d2392593af6a84118090', + ], + client_user_agent: 'chrome', + }, + custom_data: { + currency: 'USD', + value: '27.5', + order_id: '50314b8e9bcf000000000000', + num_items: 0, + content_ids: ['1234'], + contents: [{ quantity: 1, item_price: 'undefined' }], + }, + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'pinterest_tag', + description: 'Test 18', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + type: 'track', + event: 'custom event', + channel: 'web', + sentAt: '2020-08-14T05:30:30.118Z', + context: { + source: 'test', + userAgent: 'chrome', + traits: { + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + email: 'abc@gmail.com', + phone: '+1234589947', + ge: 'male', + db: '19950715', + lastname: 'Rudderlabs', + firstName: 'Test', + address: { city: 'Kolkata', state: 'WB', zip: '700114', country: 'IN' }, + }, + 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: { + sku: '1234', + tax: 2, + total: 27.5, + coupon: 'hasbros', + revenue: 48, + currency: 'USD', + discount: 2.5, + order_id: '50314b8e9bcf000000000000', + requestIP: '123.0.0.0', + shipping: 3, + subtotal: 22.5, + affiliation: 'Google Store', + checkout_id: 'fksdjfsdjfisjf9sdfjsd9f', + 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', + }, + ], + }, + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + integrations: { All: true }, + }, + destination: { + DestinationDefinition: { Config: { cdkV2Enabled: true } }, + ID: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', + Name: 'PINTEREST_TAG', + Config: { + sendAsTestEvent: false, + tagId: '123456789', + advertiserId: '123456', + appId: '429047995', + sendingUnHashedData: true, + enableDeduplication: true, + deduplicationKey: 'messageId', + enhancedMatch: true, + sendAsCustomEvent: true, + customProperties: [{ properties: 'presentclass' }, { properties: 'presentgrade' }], + eventsMapping: [{ from: 'ABC Searched', to: 'WatchVideo' }], + }, + Enabled: true, + Transformations: [], + }, + metadata: { destintionId: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq' }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + metadata: { destintionId: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq' }, + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://ct.pinterest.com/events/v3', + headers: { 'Content-Type': 'application/json' }, + params: {}, + body: { + JSON: { + event_name: 'custom', + event_time: 1597383030, + action_source: 'web', + event_id: '7208bbb6-2c4e-45bb-bf5b-ad426f3593e9', + app_id: '429047995', + advertiser_id: '123456', + user_data: { + em: ['48ddb93f0b30c475423fe177832912c5bcdce3cc72872f8051627967ef278e08'], + ph: ['d164bbe036663cb5c96835e9ccc6501e9a521127ea62f6359744928ba932413b'], + ln: ['dcf000c2386fb76d22cefc0d118a8511bb75999019cd373df52044bccd1bd251'], + fn: ['9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08'], + ct: ['6689106ca7922c30b2fd2c175c85bc7fc2d52cc4941bdd7bb622c6cdc6284a85'], + st: ['3b45022ab36728cdae12e709e945bba267c50ee8a91e6e4388539a8e03a3fdcd'], + zp: ['1a4292e00780e18d00e76fde9850aee5344e939ba593333cd5e4b4aa2cd33b0c'], + country: ['582967534d0f909d196b97f9e6921342777aea87b46fa52df165389db1fb8ccf'], + hashed_maids: [ + '6ca13d52ca70c883e0f0bb101e425a89e8624de51db2d2392593af6a84118090', + ], + client_user_agent: 'chrome', + }, + custom_data: { + currency: 'USD', + value: '27.5', + order_id: '50314b8e9bcf000000000000', + num_items: 1, + content_ids: ['507f1f77bcf86cd799439011'], + contents: [{ quantity: 1, item_price: '19' }], + }, + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'pinterest_tag', + description: 'Test 19', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + type: 'track', + event: 'custom event', + channel: 'web', + sentAt: '2020-08-14T05:30:30.118Z', + context: { + source: 'test', + userAgent: 'chrome', + traits: { + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + email: 'abc@gmail.com', + phone: '+1234589947', + ge: 'male', + db: '19950715', + lastname: 'Rudderlabs', + firstName: 'Test', + address: { city: 'Kolkata', state: 'WB', zip: '700114', country: 'IN' }, + }, + 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: { + tax: 2, + total: 27.5, + coupon: 'hasbros', + revenue: 48, + currency: 'USD', + discount: 2.5, + order_id: '50314b8e9bcf000000000000', + requestIP: '123.0.0.0', + shipping: 3, + subtotal: 22.5, + affiliation: 'Google Store', + checkout_id: 'fksdjfsdjfisjf9sdfjsd9f', + }, + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + integrations: { All: true }, + }, + destination: { + DestinationDefinition: { Config: { cdkV2Enabled: true } }, + ID: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', + Name: 'PINTEREST_TAG', + Config: { + sendAsTestEvent: false, + tagId: '123456789', + advertiserId: '123456', + appId: '429047995', + sendingUnHashedData: true, + enableDeduplication: true, + deduplicationKey: 'messageId', + enhancedMatch: true, + customProperties: [{ properties: 'presentclass' }, { properties: 'presentgrade' }], + eventsMapping: [{ from: 'ABC Searched', to: 'WatchVideo' }], + }, + Enabled: true, + Transformations: [], + }, + metadata: { destintionId: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq' }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + metadata: { destintionId: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq' }, + output: { + body: { + FORM: {}, + JSON: { + action_source: 'web', + advertiser_id: '123456', + app_id: '429047995', + custom_data: { + contents: [{ item_price: 'undefined', quantity: 1 }], + currency: 'USD', + num_items: 0, + order_id: '50314b8e9bcf000000000000', + value: '27.5', + }, + event_id: '7208bbb6-2c4e-45bb-bf5b-ad426f3593e9', + event_name: 'custom event', + event_time: 1597383030, + user_data: { + client_user_agent: 'chrome', + country: ['582967534d0f909d196b97f9e6921342777aea87b46fa52df165389db1fb8ccf'], + ct: ['6689106ca7922c30b2fd2c175c85bc7fc2d52cc4941bdd7bb622c6cdc6284a85'], + em: ['48ddb93f0b30c475423fe177832912c5bcdce3cc72872f8051627967ef278e08'], + fn: ['9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08'], + hashed_maids: [ + '6ca13d52ca70c883e0f0bb101e425a89e8624de51db2d2392593af6a84118090', + ], + ln: ['dcf000c2386fb76d22cefc0d118a8511bb75999019cd373df52044bccd1bd251'], + ph: ['d164bbe036663cb5c96835e9ccc6501e9a521127ea62f6359744928ba932413b'], + st: ['3b45022ab36728cdae12e709e945bba267c50ee8a91e6e4388539a8e03a3fdcd'], + zp: ['1a4292e00780e18d00e76fde9850aee5344e939ba593333cd5e4b4aa2cd33b0c'], + }, + }, + JSON_ARRAY: {}, + XML: {}, + }, + endpoint: 'https://ct.pinterest.com/events/v3', + files: {}, + headers: { 'Content-Type': 'application/json' }, + method: 'POST', + params: {}, + type: 'REST', + version: '1', + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'pinterest_tag', + description: 'Test 20', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + description: 'Track call with v5 Api version and send external_id toggle enabled', + message: { + type: 'track', + event: 'ABC Searched', + sentAt: '2020-08-14T05:30:30.118Z', + channel: 'web', + context: { + source: 'test', + userAgent: 'chrome', + traits: { + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + email: 'abc@gmail.com', + phone: '+1234589947', + ge: 'male', + db: '19950715', + lastname: 'Rudderlabs', + firstName: 'Test', + address: { city: 'Kolkata', state: 'WB', zip: '700114', country: 'IN' }, + }, + 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: { + tax: 2, + total: 27.5, + coupon: 'hasbros', + revenue: 48, + price: 25, + quantity: 2, + currency: 'USD', + discount: 2.5, + order_id: '50314b8e9bcf000000000000', + requestIP: '123.0.0.0', + optOutType: 'LDP', + 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', + }, + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + integrations: { All: true }, + }, + destination: { + DestinationDefinition: { Config: { cdkV2Enabled: true } }, + ID: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', + Name: 'PINTEREST_TAG', + Config: { + sendAsTestEvent: false, + tagId: '123456789', + apiVersion: 'newApi', + adAccountId: 'accountId123', + conversionToken: 'conversionToken123', + appId: '429047995', + enhancedMatch: true, + enableDeduplication: true, + deduplicationKey: 'messageId', + sendingUnHashedData: true, + sendExternalId: true, + customProperties: [{ properties: 'presentclass' }, { properties: 'presentgrade' }], + eventsMapping: [{ from: 'ABC Searched', to: 'WatchVideo' }], + }, + Enabled: true, + Transformations: [], + }, + metadata: { destintionId: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq' }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + metadata: { destintionId: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq' }, + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://api.pinterest.com/v5/ad_accounts/accountId123/events', + headers: { + 'Content-Type': 'application/json', + Authorization: 'Bearer conversionToken123', + }, + params: {}, + body: { + JSON: { + action_source: 'web', + event_name: 'watch_video', + event_time: 1597383030, + event_id: '7208bbb6-2c4e-45bb-bf5b-ad426f3593e9', + app_id: '429047995', + user_data: { + em: ['48ddb93f0b30c475423fe177832912c5bcdce3cc72872f8051627967ef278e08'], + ph: ['d164bbe036663cb5c96835e9ccc6501e9a521127ea62f6359744928ba932413b'], + ln: ['dcf000c2386fb76d22cefc0d118a8511bb75999019cd373df52044bccd1bd251'], + fn: ['9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08'], + ct: ['6689106ca7922c30b2fd2c175c85bc7fc2d52cc4941bdd7bb622c6cdc6284a85'], + st: ['3b45022ab36728cdae12e709e945bba267c50ee8a91e6e4388539a8e03a3fdcd'], + zp: ['1a4292e00780e18d00e76fde9850aee5344e939ba593333cd5e4b4aa2cd33b0c'], + country: ['582967534d0f909d196b97f9e6921342777aea87b46fa52df165389db1fb8ccf'], + hashed_maids: [ + '6ca13d52ca70c883e0f0bb101e425a89e8624de51db2d2392593af6a84118090', + ], + client_user_agent: 'chrome', + external_id: [ + '3217d71a74c219d6e31e28267b313a7ceb6a2c032db1a091c9416b25b2ae2bc8', + ], + }, + custom_data: { + currency: 'USD', + value: '27.5', + order_id: '50314b8e9bcf000000000000', + opt_out_type: 'LDP', + num_items: 3, + content_ids: ['507f1f77bcf86cd799439011', '505bd76785ebb509fc183733'], + contents: [ + { quantity: 1, item_price: '19' }, + { quantity: 2, item_price: '3' }, + ], + }, + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'pinterest_tag', + description: 'Test 21', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + description: 'Custom event with v5 Api version', + message: { + type: 'track', + event: 'random', + sentAt: '2020-08-14T05:30:30.118Z', + channel: 'web', + context: { + source: 'test', + userAgent: 'chrome', + traits: { + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + email: 'abc@gmail.com', + phone: '+1234589947', + ge: 'male', + db: '19950715', + lastname: 'Rudderlabs', + firstName: 'Test', + address: { city: 'Kolkata', state: 'WB', zip: '700114', country: 'IN' }, + }, + 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: { + tax: 2, + total: 27.5, + coupon: 'hasbros', + revenue: 48, + price: 25, + quantity: 2, + currency: 'USD', + discount: 2.5, + order_id: '50314b8e9bcf000000000000', + requestIP: '123.0.0.0', + optOutType: 'LDP', + 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', + }, + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + integrations: { All: true }, + }, + destination: { + DestinationDefinition: { Config: { cdkV2Enabled: true } }, + ID: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', + Name: 'PINTEREST_TAG', + Config: { + sendAsTestEvent: false, + tagId: '123456789', + apiVersion: 'newApi', + adAccountId: 'accountId123', + conversionToken: 'conversionToken123', + appId: '429047995', + enhancedMatch: true, + enableDeduplication: true, + deduplicationKey: 'messageId', + sendingUnHashedData: true, + sendAsCustomEvent: true, + customProperties: [{ properties: 'presentclass' }, { properties: 'presentgrade' }], + eventsMapping: [{ from: 'ABC Searched', to: 'WatchVideo' }], + }, + Enabled: true, + Transformations: [], + }, + metadata: { destintionId: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq' }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + metadata: { destintionId: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq' }, + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://api.pinterest.com/v5/ad_accounts/accountId123/events', + headers: { + 'Content-Type': 'application/json', + Authorization: 'Bearer conversionToken123', + }, + params: {}, + body: { + JSON: { + action_source: 'web', + event_name: 'custom', + event_time: 1597383030, + event_id: '7208bbb6-2c4e-45bb-bf5b-ad426f3593e9', + app_id: '429047995', + user_data: { + em: ['48ddb93f0b30c475423fe177832912c5bcdce3cc72872f8051627967ef278e08'], + ph: ['d164bbe036663cb5c96835e9ccc6501e9a521127ea62f6359744928ba932413b'], + ln: ['dcf000c2386fb76d22cefc0d118a8511bb75999019cd373df52044bccd1bd251'], + fn: ['9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08'], + ct: ['6689106ca7922c30b2fd2c175c85bc7fc2d52cc4941bdd7bb622c6cdc6284a85'], + st: ['3b45022ab36728cdae12e709e945bba267c50ee8a91e6e4388539a8e03a3fdcd'], + zp: ['1a4292e00780e18d00e76fde9850aee5344e939ba593333cd5e4b4aa2cd33b0c'], + country: ['582967534d0f909d196b97f9e6921342777aea87b46fa52df165389db1fb8ccf'], + hashed_maids: [ + '6ca13d52ca70c883e0f0bb101e425a89e8624de51db2d2392593af6a84118090', + ], + client_user_agent: 'chrome', + }, + custom_data: { + currency: 'USD', + value: '27.5', + order_id: '50314b8e9bcf000000000000', + opt_out_type: 'LDP', + num_items: 3, + content_ids: ['507f1f77bcf86cd799439011', '505bd76785ebb509fc183733'], + contents: [ + { quantity: 1, item_price: '19' }, + { quantity: 2, item_price: '3' }, + ], + }, + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'pinterest_tag', + description: 'Test 22', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + description: + 'Custom event with v5 Api version, with unhashed User Data and the values are an array of strings', + message: { + type: 'track', + event: 'random', + sentAt: '2020-08-14T05:30:30.118Z', + channel: 'web', + context: { + source: 'test', + userAgent: 'chrome', + traits: { + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + email: ['abc@gmail.com', 'def@gmail.com'], + phone: ['+1234589947', '+1234589948'], + ge: ['male', 'male'], + db: ['19950715', '19970615'], + lastname: ['Rudderlabs', 'Xu'], + firstName: ['Test', 'Alex'], + address: { + city: ['Kolkata', 'Mumbai'], + state: ['WB', 'MH'], + zip: ['700114', '700115'], + country: ['IN', 'IN'], + }, + }, + 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: { + tax: 2, + total: 27.5, + coupon: 'hasbros', + revenue: 48, + price: 25, + quantity: 2, + currency: 'USD', + discount: 2.5, + order_id: '50314b8e9bcf000000000000', + requestIP: '123.0.0.0', + optOutType: 'LDP', + 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', + }, + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + integrations: { All: true }, + }, + destination: { + DestinationDefinition: { Config: { cdkV2Enabled: true } }, + ID: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', + Name: 'PINTEREST_TAG', + Config: { + sendAsTestEvent: false, + tagId: '123456789', + apiVersion: 'newApi', + adAccountId: 'accountId123', + conversionToken: 'conversionToken123', + appId: '429047995', + enhancedMatch: true, + enableDeduplication: true, + deduplicationKey: 'messageId', + sendingUnHashedData: true, + sendAsCustomEvent: true, + customProperties: [{ properties: 'presentclass' }, { properties: 'presentgrade' }], + eventsMapping: [{ from: 'ABC Searched', to: 'WatchVideo' }], + }, + Enabled: true, + Transformations: [], + }, + metadata: { destintionId: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq' }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + metadata: { destintionId: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq' }, + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://api.pinterest.com/v5/ad_accounts/accountId123/events', + headers: { + 'Content-Type': 'application/json', + Authorization: 'Bearer conversionToken123', + }, + params: {}, + body: { + JSON: { + action_source: 'web', + event_name: 'custom', + event_time: 1597383030, + event_id: '7208bbb6-2c4e-45bb-bf5b-ad426f3593e9', + app_id: '429047995', + user_data: { + em: [ + '48ddb93f0b30c475423fe177832912c5bcdce3cc72872f8051627967ef278e08', + 'c392e50ebeca7bea4405e9c545023451ac56620031f81263f681269bde14218b', + ], + ph: [ + 'd164bbe036663cb5c96835e9ccc6501e9a521127ea62f6359744928ba932413b', + '22bdde2594851294f2a6f4c34af704e68b398b03129ea9ceb58f0ffe33f6db52', + ], + ln: [ + 'dcf000c2386fb76d22cefc0d118a8511bb75999019cd373df52044bccd1bd251', + '9c2f138690fca4890c3c4a6691610fbbbdf32091cc001f7355cfdf574baa52b9', + ], + fn: [ + '9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08', + '4135aa9dc1b842a653dea846903ddb95bfb8c5a10c504a7fa16e10bc31d1fdf0', + ], + ct: [ + '6689106ca7922c30b2fd2c175c85bc7fc2d52cc4941bdd7bb622c6cdc6284a85', + 'd209bcc17778fd19fd2bc0c99a3868bf011da5162d3a75037a605768ebc276e2', + ], + st: [ + '3b45022ab36728cdae12e709e945bba267c50ee8a91e6e4388539a8e03a3fdcd', + '1b0316ed1cfed044035c55363e02ccafab26d66b1c2746b94d17285f043324aa', + ], + zp: [ + '1a4292e00780e18d00e76fde9850aee5344e939ba593333cd5e4b4aa2cd33b0c', + '4d6755aa1e85517191f06cc91448696c173e1195ae51f94a1670116ac7b5c47b', + ], + country: [ + '582967534d0f909d196b97f9e6921342777aea87b46fa52df165389db1fb8ccf', + '582967534d0f909d196b97f9e6921342777aea87b46fa52df165389db1fb8ccf', + ], + hashed_maids: [ + '6ca13d52ca70c883e0f0bb101e425a89e8624de51db2d2392593af6a84118090', + ], + client_user_agent: 'chrome', + }, + custom_data: { + currency: 'USD', + value: '27.5', + order_id: '50314b8e9bcf000000000000', + opt_out_type: 'LDP', + num_items: 3, + content_ids: ['507f1f77bcf86cd799439011', '505bd76785ebb509fc183733'], + contents: [ + { quantity: 1, item_price: '19' }, + { quantity: 2, item_price: '3' }, + ], + }, + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'pinterest_tag', + description: 'Test 23', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + description: 'Ad Account Id check in V5', + message: { + type: 'track', + event: 'random', + sentAt: '2020-08-14T05:30:30.118Z', + channel: 'web', + context: { + source: 'test', + userAgent: 'chrome', + traits: { + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + email: 'abc@gmail.com', + phone: '+1234589947', + ge: 'male', + db: '19950715', + lastname: 'Rudderlabs', + firstName: 'Test', + address: { city: 'Kolkata', state: 'WB', zip: '700114', country: 'IN' }, + }, + 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', + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + integrations: { All: true }, + }, + destination: { + DestinationDefinition: { Config: { cdkV2Enabled: true } }, + ID: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', + Name: 'PINTEREST_TAG', + Config: { + sendAsTestEvent: false, + tagId: '123456789', + apiVersion: 'newApi', + adAccountId: '', + conversionToken: 'conversionToken123', + appId: '429047995', + enhancedMatch: true, + enableDeduplication: true, + deduplicationKey: 'messageId', + sendingUnHashedData: true, + sendAsCustomEvent: true, + customProperties: [{ properties: 'presentclass' }, { properties: 'presentgrade' }], + eventsMapping: [{ from: 'ABC Searched', to: 'WatchVideo' }], + }, + Enabled: true, + Transformations: [], + }, + metadata: { destintionId: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq' }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + error: + 'Ad Account ID not found. Aborting: Workflow: procWorkflow, Step: validateInput, ChildStep: undefined, OriginalError: Ad Account ID not found. Aborting', + metadata: { destintionId: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq' }, + statTags: { + destType: 'PINTEREST_TAG', + errorCategory: 'platform', + feature: 'processor', + implementation: 'cdkV2', + module: 'destination', + }, + statusCode: 400, + }, + ], + }, + }, + }, + { + name: 'pinterest_tag', + description: 'Test 24', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + description: 'Conversion Token check in V5', + message: { + type: 'track', + event: 'random', + sentAt: '2020-08-14T05:30:30.118Z', + channel: 'web', + context: { + source: 'test', + userAgent: 'chrome', + traits: { + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + email: 'abc@gmail.com', + phone: '+1234589947', + ge: 'male', + db: '19950715', + lastname: 'Rudderlabs', + firstName: 'Test', + address: { city: 'Kolkata', state: 'WB', zip: '700114', country: 'IN' }, + }, + 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', + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + integrations: { All: true }, + }, + destination: { + DestinationDefinition: { Config: { cdkV2Enabled: true } }, + ID: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', + Name: 'PINTEREST_TAG', + Config: { + sendAsTestEvent: false, + tagId: '123456789', + apiVersion: 'newApi', + adAccountId: 'accountId123', + conversionToken: '', + appId: '429047995', + enhancedMatch: true, + enableDeduplication: true, + deduplicationKey: 'messageId', + sendingUnHashedData: true, + sendAsCustomEvent: true, + customProperties: [{ properties: 'presentclass' }, { properties: 'presentgrade' }], + eventsMapping: [{ from: 'ABC Searched', to: 'WatchVideo' }], + }, + Enabled: true, + Transformations: [], + }, + metadata: { destintionId: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq' }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + error: + 'Conversion Token not found. Aborting: Workflow: procWorkflow, Step: validateInput, ChildStep: undefined, OriginalError: Conversion Token not found. Aborting', + metadata: { destintionId: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq' }, + statTags: { + destType: 'PINTEREST_TAG', + errorCategory: 'platform', + feature: 'processor', + implementation: 'cdkV2', + module: 'destination', + }, + statusCode: 400, + }, + ], + }, + }, + }, + { + name: 'pinterest_tag', + description: 'Test 25', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + type: 'track', + event: 'custom event', + channel: 'web', + sentAt: '2020-08-14T05:30:30.118Z', + context: { + source: 'test', + userAgent: 'chrome', + traits: { + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + email: 'abc@gmail.com', + phone: '+1234589947', + ge: 'male', + db: '19950715', + lastname: 'Rudderlabs', + firstName: 'Test', + address: { city: 'Kolkata', state: 'WB', zip: '700114', country: 'IN' }, + }, + 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: { + tax: 2, + total: 27.5, + coupon: 'hasbros', + revenue: 48, + currency: 'USD', + discount: 2.5, + order_id: '50314b8e9bcf000000000000', + requestIP: '123.0.0.0', + shipping: 3, + subtotal: 22.5, + affiliation: 'Google Store', + checkout_id: 'fksdjfsdjfisjf9sdfjsd9f', + }, + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + integrations: { All: true }, + }, + destination: { + DestinationDefinition: { Config: { cdkV2Enabled: true } }, + ID: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', + Name: 'PINTEREST_TAG', + Config: { + sendAsTestEvent: false, + tagId: '123456789', + apiVersion: 'newApi', + adAccountId: 'accountId123', + conversionToken: 'conversionToken123', + appId: '429047995', + enhancedMatch: true, + enableDeduplication: true, + deduplicationKey: 'messageId', + sendingUnHashedData: true, + sendAsCustomEvent: false, + customProperties: [{ properties: 'presentclass' }, { properties: 'presentgrade' }], + eventsMapping: [{ from: 'ABC Searched', to: 'WatchVideo' }], + }, + Enabled: true, + Transformations: [], + }, + metadata: { destintionId: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq' }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + metadata: { destintionId: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq' }, + error: + "custom event is not mapped in UI. Make sure to map the event in UI or enable the 'send as custom event' setting: Workflow: procWorkflow, Step: eventNames, ChildStep: undefined, OriginalError: custom event is not mapped in UI. Make sure to map the event in UI or enable the 'send as custom event' setting", + statTags: { + destType: 'PINTEREST_TAG', + errorCategory: 'platform', + feature: 'processor', + implementation: 'cdkV2', + module: 'destination', + }, + statusCode: 400, + }, + ], + }, + }, + }, +]; diff --git a/test/integrations/destinations/pinterest_tag/router/data.ts b/test/integrations/destinations/pinterest_tag/router/data.ts new file mode 100644 index 0000000000..e004be25f0 --- /dev/null +++ b/test/integrations/destinations/pinterest_tag/router/data.ts @@ -0,0 +1,2153 @@ +export const data = [ + { + destType: 'pinterest_tag', + description: 'Test 0', + feature: 'router', + module: 'destination', + version: 'v0', + input: { + request: { + body: { + input: [ + { + message: { + type: 'track', + event: 'ABC Searched', + sentAt: '2020-08-14T05:30:30.118Z', + channel: 'web', + context: { + source: 'test', + userAgent: 'chrome', + traits: { + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + email: 'abc@gmail.com', + phone: '+1234589947', + ge: 'male', + db: '19950715', + lastname: 'Rudderlabs', + firstName: 'Test', + address: { + city: 'Kolkata', + state: 'WB', + zip: '700114', + country: 'IN', + }, + }, + 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: { + tax: 2, + total: 27.5, + coupon: 'hasbros', + revenue: 48, + price: 25, + quantity: 2, + currency: 'USD', + discount: 2.5, + order_id: '50314b8e9bcf000000000000', + requestIP: '123.0.0.0', + optOutType: 'LDP', + 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', + }, + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + integrations: { + All: true, + }, + }, + metadata: { + destintionId: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', + jobId: 1, + }, + destination: { + DestinationDefinition: { Config: { cdkV2Enabled: true } }, + ID: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', + Name: 'PINTEREST_TAG', + Config: { + sendAsTestEvent: false, + tagId: '123456789', + advertiserId: '429047995', + appId: '429047995', + sendingUnHashedData: true, + enableDeduplication: true, + deduplicationKey: 'messageId', + enhancedMatch: true, + customProperties: [ + { + properties: 'presentclass', + }, + { + properties: 'presentgrade', + }, + ], + eventsMapping: [ + { + from: 'ABC Searched', + to: 'WatchVideo', + }, + { + from: 'ABC Searched', + to: 'Signup', + }, + { + from: 'User Signup', + to: 'Signup', + }, + { + from: 'User Created', + to: 'Signup', + }, + ], + }, + Enabled: true, + Transformations: [], + }, + }, + { + message: { + type: 'track', + event: 'Order completed', + sentAt: '2020-08-14T05:30:30.118Z', + channel: 'web', + context: { + source: 'test', + userAgent: 'chrome', + traits: { + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + email: 'abc@gmail.com', + phone: '+1234589947', + ge: 'male', + db: '19950715', + lastname: 'Rudderlabs', + firstName: 'Test', + address: { + city: 'Kolkata', + state: 'WB', + zip: '700114', + country: 'IN', + }, + }, + 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: { + tax: 2, + total: 27.5, + coupon: 'hasbros', + revenue: 48, + price: 25, + quantity: 2, + currency: 'USD', + discount: 2.5, + order_id: '50314b8e9bcf000000000000', + requestIP: '123.0.0.0', + 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', + }, + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + integrations: { + All: true, + }, + }, + metadata: { + destintionId: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', + jobId: 2, + }, + destination: { + DestinationDefinition: { Config: { cdkV2Enabled: true } }, + ID: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', + Name: 'PINTEREST_TAG', + Config: { + sendAsTestEvent: false, + tagId: '123456789', + advertiserId: '429047995', + appId: '429047995', + sendingUnHashedData: true, + enableDeduplication: true, + deduplicationKey: 'messageId', + enhancedMatch: true, + customProperties: [ + { + properties: 'presentclass', + }, + { + properties: 'presentgrade', + }, + ], + eventsMapping: [ + { + from: 'ABC Searched', + to: 'WatchVideo', + }, + { + from: 'ABC Searched', + to: 'Signup', + }, + { + from: 'User Signup', + to: 'Signup', + }, + { + from: 'User Created', + to: 'Signup', + }, + ], + }, + Enabled: true, + Transformations: [], + }, + }, + { + message: { + type: 'track', + event: 'product added', + sentAt: '2020-08-14T05:30:30.118Z', + channel: 'web', + context: { + source: 'test', + userAgent: 'chrome', + traits: { + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + email: 'abc@gmail.com', + phone: '+1234589947', + ge: 'male', + db: '19950715', + lastname: 'Rudderlabs', + firstName: 'Test', + address: { + city: 'Kolkata', + state: 'WB', + zip: '700114', + country: 'IN', + }, + }, + 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: { + product_id: '123', + tax: 2, + total: 27.5, + coupon: 'hasbros', + revenue: 48, + price: 25, + quantity: 2, + currency: 'USD', + discount: 2.5, + order_id: '50314b8e9bcf000000000000', + requestIP: '123.0.0.0', + shipping: 3, + subtotal: 22.5, + affiliation: 'Google Store', + checkout_id: 'fksdjfsdjfisjf9sdfjsd9f', + }, + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + integrations: { + All: true, + }, + }, + metadata: { + destintionId: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', + jobId: 3, + }, + destination: { + DestinationDefinition: { Config: { cdkV2Enabled: true } }, + ID: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', + Name: 'PINTEREST_TAG', + Config: { + sendAsTestEvent: false, + tagId: '123456789', + advertiserId: '429047995', + appId: '429047995', + sendingUnHashedData: true, + enableDeduplication: true, + deduplicationKey: 'messageId', + enhancedMatch: true, + customProperties: [ + { + properties: 'presentclass', + }, + { + properties: 'presentgrade', + }, + ], + eventsMapping: [ + { + from: 'ABC Searched', + to: 'WatchVideo', + }, + { + from: 'ABC Searched', + to: 'Signup', + }, + { + from: 'User Signup', + to: 'Signup', + }, + { + from: 'User Created', + to: 'Signup', + }, + ], + }, + Enabled: true, + Transformations: [], + }, + }, + { + message: { + type: 'track', + event: 'Product List Filtered', + sentAt: '2020-08-14T05:30:30.118Z', + channel: 'web', + context: { + source: 'test', + userAgent: 'chrome', + traits: { + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + email: 'abc@gmail.com', + phone: '+1234589947', + ge: 'male', + db: '19950715', + lastname: 'Rudderlabs', + firstName: 'Test', + address: { + city: 'Kolkata', + state: 'WB', + zip: '700114', + country: 'IN', + }, + }, + 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: { + tax: 2, + total: 27.5, + coupon: 'hasbros', + revenue: 48, + price: 25, + quantity: 2, + currency: 'USD', + discount: 2.5, + order_id: '50314b8e9bcf000000000000', + requestIP: '123.0.0.0', + 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', + }, + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + integrations: { + All: true, + }, + }, + metadata: { + destintionId: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', + jobId: 4, + }, + destination: { + DestinationDefinition: { Config: { cdkV2Enabled: true } }, + ID: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', + Name: 'PINTEREST_TAG', + Config: { + sendAsTestEvent: false, + tagId: '123456789', + advertiserId: '429047995', + appId: '429047995', + sendingUnHashedData: true, + enableDeduplication: true, + deduplicationKey: 'messageId', + enhancedMatch: true, + customProperties: [ + { + properties: 'presentclass', + }, + { + properties: 'presentgrade', + }, + ], + eventsMapping: [ + { + from: 'ABC Searched', + to: 'WatchVideo', + }, + { + from: 'ABC Searched', + to: 'Signup', + }, + { + from: 'User Signup', + to: 'Signup', + }, + { + from: 'User Created', + to: 'Signup', + }, + ], + }, + Enabled: true, + Transformations: [], + }, + }, + { + message: { + type: 'Identify', + event: 'User Signup', + sentAt: '2020-08-14T05:30:30.118Z', + channel: 'web', + context: { + source: 'test', + userAgent: 'chrome', + traits: { + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + email: 'abc@gmail.com', + phone: '+1234589947', + ge: 'male', + db: '19950715', + lastname: 'Rudderlabs', + firstName: 'Test', + address: { + city: 'Kolkata', + state: 'WB', + zip: '700114', + country: 'IN', + }, + }, + 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: { + tax: 2, + total: 27.5, + coupon: 'hasbros', + revenue: 48, + price: 25, + quantity: 2, + currency: 'USD', + discount: 2.5, + order_id: '50314b8e9bcf000000000000', + requestIP: '123.0.0.0', + 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', + }, + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + integrations: { + All: true, + }, + }, + metadata: { + destintionId: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', + jobId: 5, + }, + destination: { + DestinationDefinition: { Config: { cdkV2Enabled: true } }, + ID: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', + Name: 'PINTEREST_TAG', + Config: { + sendAsTestEvent: false, + tagId: '123456789', + advertiserId: '429047995', + appId: '429047995', + sendingUnHashedData: true, + enableDeduplication: true, + deduplicationKey: 'messageId', + enhancedMatch: true, + customProperties: [ + { + properties: 'presentclass', + }, + { + properties: 'presentgrade', + }, + ], + eventsMapping: [ + { + from: 'ABC Searched', + to: 'WatchVideo', + }, + { + from: 'ABC Searched', + to: 'Signup', + }, + { + from: 'User Signup', + to: 'Signup', + }, + { + from: 'User Created', + to: 'Signup', + }, + ], + }, + Enabled: true, + Transformations: [], + }, + }, + { + message: { + type: 'track', + event: 'User Created', + sentAt: '2020-08-14T05:30:30.118Z', + channel: 'web', + context: { + source: 'test', + userAgent: 'chrome', + traits: { + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + email: 'abc@gmail.com', + phone: '+1234589947', + ge: 'male', + db: '19950715', + lastname: 'Rudderlabs', + firstName: 'Test', + address: { + city: 'Kolkata', + state: 'WB', + zip: '700114', + country: 'IN', + }, + }, + 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: { + tax: 2, + total: 27.5, + coupon: 'hasbros', + revenue: 48, + price: 25, + quantity: 2, + currency: 'USD', + discount: 2.5, + order_id: '50314b8e9bcf000000000000', + requestIP: '123.0.0.0', + 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', + }, + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + integrations: { + All: true, + }, + }, + metadata: { + destintionId: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', + jobId: 6, + }, + destination: { + DestinationDefinition: { Config: { cdkV2Enabled: true } }, + ID: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', + Name: 'PINTEREST_TAG', + Config: { + sendAsTestEvent: false, + tagId: '123456789', + advertiserId: '429047995', + appId: '429047995', + sendingUnHashedData: true, + enableDeduplication: true, + deduplicationKey: 'messageId', + enhancedMatch: true, + customProperties: [ + { + properties: 'presentclass', + }, + { + properties: 'presentgrade', + }, + ], + eventsMapping: [ + { + from: 'ABC Searched', + to: 'WatchVideo', + }, + { + from: 'ABC Searched', + to: 'Signup', + }, + { + from: 'User Signup', + to: 'Signup', + }, + { + from: 'User Created', + to: 'Signup', + }, + ], + }, + Enabled: true, + Transformations: [], + }, + }, + { + message: { + version: '1', + statusCode: 200, + type: 'REST', + method: 'POST', + endpoint: 'https://ct.pinterest.com/events/v3', + headers: { + 'Content-Type': 'application/json', + }, + params: {}, + body: { + JSON: { + action_source: 'web', + event_name: 'WatchVideo', + event_time: 1597383030, + event_id: '7208bbb6-2c4e-45bb-bf5b-ad426f3593e9', + app_id: '429047995', + advertiser_id: '429047995', + user_data: { + em: ['48ddb93f0b30c475423fe177832912c5bcdce3cc72872f8051627967ef278e08'], + ph: ['d164bbe036663cb5c96835e9ccc6501e9a521127ea62f6359744928ba932413b'], + ln: ['bdfdee6414a89d72bfbf5ee90b1f85924467bae1e3980d83c2cd348dc31d5819'], + fn: ['ee5db3fe0253b651aca3676692e0c59b25909304f5c51d223a02a215d104144b'], + ct: ['6689106ca7922c30b2fd2c175c85bc7fc2d52cc4941bdd7bb622c6cdc6284a85'], + st: ['3b45022ab36728cdae12e709e945bba267c50ee8a91e6e4388539a8e03a3fdcd'], + zp: ['1a4292e00780e18d00e76fde9850aee5344e939ba593333cd5e4b4aa2cd33b0c'], + country: ['582967534d0f909d196b97f9e6921342777aea87b46fa52df165389db1fb8ccf'], + hashed_maids: [ + '6ca13d52ca70c883e0f0bb101e425a89e8624de51db2d2392593af6a84118090', + ], + client_user_agent: 'chrome', + }, + custom_data: { + currency: 'USD', + value: '27.5', + order_id: '50314b8e9bcf000000000000', + num_items: 3, + content_ids: ['507f1f77bcf86cd799439011', '505bd76785ebb509fc183733'], + contents: [ + { + quantity: 1, + item_price: '19', + }, + { + quantity: 2, + item_price: '3', + }, + ], + }, + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + }, + metadata: { + destintionId: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', + jobId: 7, + }, + destination: { + DestinationDefinition: { Config: { cdkV2Enabled: true } }, + ID: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', + Name: 'PINTEREST_TAG', + Config: { + sendAsTestEvent: false, + tagId: '123456789', + advertiserId: '429047995', + appId: '429047995', + sendingUnHashedData: true, + enableDeduplication: true, + deduplicationKey: 'messageId', + enhancedMatch: true, + customProperties: [ + { + properties: 'presentclass', + }, + { + properties: 'presentgrade', + }, + ], + eventsMapping: [ + { + from: 'ABC Searched', + to: 'WatchVideo', + }, + { + from: 'ABC Searched', + to: 'Signup', + }, + { + from: 'User Signup', + to: 'Signup', + }, + { + from: 'User Created', + to: 'Signup', + }, + ], + }, + Enabled: true, + Transformations: [], + }, + }, + ], + destType: 'pinterest_tag', + }, + method: 'POST', + }, + }, + output: { + response: { + status: 200, + body: { + output: [ + { + batchedRequest: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://ct.pinterest.com/events/v3', + headers: { + 'Content-Type': 'application/json', + }, + params: {}, + body: { + JSON: { + data: [ + { + event_name: 'watch_video', + event_time: 1597383030, + action_source: 'web', + event_id: '7208bbb6-2c4e-45bb-bf5b-ad426f3593e9', + app_id: '429047995', + advertiser_id: '429047995', + user_data: { + em: ['48ddb93f0b30c475423fe177832912c5bcdce3cc72872f8051627967ef278e08'], + ph: ['d164bbe036663cb5c96835e9ccc6501e9a521127ea62f6359744928ba932413b'], + ln: ['dcf000c2386fb76d22cefc0d118a8511bb75999019cd373df52044bccd1bd251'], + fn: ['9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08'], + ct: ['6689106ca7922c30b2fd2c175c85bc7fc2d52cc4941bdd7bb622c6cdc6284a85'], + st: ['3b45022ab36728cdae12e709e945bba267c50ee8a91e6e4388539a8e03a3fdcd'], + zp: ['1a4292e00780e18d00e76fde9850aee5344e939ba593333cd5e4b4aa2cd33b0c'], + country: [ + '582967534d0f909d196b97f9e6921342777aea87b46fa52df165389db1fb8ccf', + ], + hashed_maids: [ + '6ca13d52ca70c883e0f0bb101e425a89e8624de51db2d2392593af6a84118090', + ], + client_user_agent: 'chrome', + }, + custom_data: { + currency: 'USD', + value: '27.5', + order_id: '50314b8e9bcf000000000000', + num_items: 3, + opt_out_type: 'LDP', + content_ids: ['507f1f77bcf86cd799439011', '505bd76785ebb509fc183733'], + contents: [ + { + quantity: 1, + item_price: '19', + }, + { + quantity: 2, + item_price: '3', + }, + ], + }, + }, + { + event_name: 'signup', + event_time: 1597383030, + action_source: 'web', + event_id: '7208bbb6-2c4e-45bb-bf5b-ad426f3593e9', + app_id: '429047995', + advertiser_id: '429047995', + user_data: { + em: ['48ddb93f0b30c475423fe177832912c5bcdce3cc72872f8051627967ef278e08'], + ph: ['d164bbe036663cb5c96835e9ccc6501e9a521127ea62f6359744928ba932413b'], + ln: ['dcf000c2386fb76d22cefc0d118a8511bb75999019cd373df52044bccd1bd251'], + fn: ['9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08'], + ct: ['6689106ca7922c30b2fd2c175c85bc7fc2d52cc4941bdd7bb622c6cdc6284a85'], + st: ['3b45022ab36728cdae12e709e945bba267c50ee8a91e6e4388539a8e03a3fdcd'], + zp: ['1a4292e00780e18d00e76fde9850aee5344e939ba593333cd5e4b4aa2cd33b0c'], + country: [ + '582967534d0f909d196b97f9e6921342777aea87b46fa52df165389db1fb8ccf', + ], + hashed_maids: [ + '6ca13d52ca70c883e0f0bb101e425a89e8624de51db2d2392593af6a84118090', + ], + client_user_agent: 'chrome', + }, + custom_data: { + currency: 'USD', + value: '27.5', + order_id: '50314b8e9bcf000000000000', + num_items: 3, + opt_out_type: 'LDP', + content_ids: ['507f1f77bcf86cd799439011', '505bd76785ebb509fc183733'], + contents: [ + { + quantity: 1, + item_price: '19', + }, + { + quantity: 2, + item_price: '3', + }, + ], + }, + }, + { + event_name: 'checkout', + event_time: 1597383030, + action_source: 'web', + event_id: '7208bbb6-2c4e-45bb-bf5b-ad426f3593e9', + app_id: '429047995', + advertiser_id: '429047995', + user_data: { + em: ['48ddb93f0b30c475423fe177832912c5bcdce3cc72872f8051627967ef278e08'], + ph: ['d164bbe036663cb5c96835e9ccc6501e9a521127ea62f6359744928ba932413b'], + ln: ['dcf000c2386fb76d22cefc0d118a8511bb75999019cd373df52044bccd1bd251'], + fn: ['9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08'], + ct: ['6689106ca7922c30b2fd2c175c85bc7fc2d52cc4941bdd7bb622c6cdc6284a85'], + st: ['3b45022ab36728cdae12e709e945bba267c50ee8a91e6e4388539a8e03a3fdcd'], + zp: ['1a4292e00780e18d00e76fde9850aee5344e939ba593333cd5e4b4aa2cd33b0c'], + country: [ + '582967534d0f909d196b97f9e6921342777aea87b46fa52df165389db1fb8ccf', + ], + hashed_maids: [ + '6ca13d52ca70c883e0f0bb101e425a89e8624de51db2d2392593af6a84118090', + ], + client_user_agent: 'chrome', + }, + custom_data: { + currency: 'USD', + value: '27.5', + order_id: '50314b8e9bcf000000000000', + num_items: 3, + content_ids: ['507f1f77bcf86cd799439011', '505bd76785ebb509fc183733'], + contents: [ + { + quantity: 1, + item_price: '19', + }, + { + quantity: 2, + item_price: '3', + }, + ], + }, + }, + { + event_name: 'add_to_cart', + event_time: 1597383030, + action_source: 'web', + event_id: '7208bbb6-2c4e-45bb-bf5b-ad426f3593e9', + app_id: '429047995', + advertiser_id: '429047995', + user_data: { + em: ['48ddb93f0b30c475423fe177832912c5bcdce3cc72872f8051627967ef278e08'], + ph: ['d164bbe036663cb5c96835e9ccc6501e9a521127ea62f6359744928ba932413b'], + ln: ['dcf000c2386fb76d22cefc0d118a8511bb75999019cd373df52044bccd1bd251'], + fn: ['9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08'], + ct: ['6689106ca7922c30b2fd2c175c85bc7fc2d52cc4941bdd7bb622c6cdc6284a85'], + st: ['3b45022ab36728cdae12e709e945bba267c50ee8a91e6e4388539a8e03a3fdcd'], + zp: ['1a4292e00780e18d00e76fde9850aee5344e939ba593333cd5e4b4aa2cd33b0c'], + country: [ + '582967534d0f909d196b97f9e6921342777aea87b46fa52df165389db1fb8ccf', + ], + hashed_maids: [ + '6ca13d52ca70c883e0f0bb101e425a89e8624de51db2d2392593af6a84118090', + ], + client_user_agent: 'chrome', + }, + custom_data: { + currency: 'USD', + value: '27.5', + order_id: '50314b8e9bcf000000000000', + num_items: 2, + content_ids: ['123'], + contents: [ + { + quantity: 2, + item_price: '25', + }, + ], + }, + }, + { + event_name: 'search', + event_time: 1597383030, + action_source: 'web', + event_id: '7208bbb6-2c4e-45bb-bf5b-ad426f3593e9', + app_id: '429047995', + advertiser_id: '429047995', + user_data: { + em: ['48ddb93f0b30c475423fe177832912c5bcdce3cc72872f8051627967ef278e08'], + ph: ['d164bbe036663cb5c96835e9ccc6501e9a521127ea62f6359744928ba932413b'], + ln: ['dcf000c2386fb76d22cefc0d118a8511bb75999019cd373df52044bccd1bd251'], + fn: ['9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08'], + ct: ['6689106ca7922c30b2fd2c175c85bc7fc2d52cc4941bdd7bb622c6cdc6284a85'], + st: ['3b45022ab36728cdae12e709e945bba267c50ee8a91e6e4388539a8e03a3fdcd'], + zp: ['1a4292e00780e18d00e76fde9850aee5344e939ba593333cd5e4b4aa2cd33b0c'], + country: [ + '582967534d0f909d196b97f9e6921342777aea87b46fa52df165389db1fb8ccf', + ], + hashed_maids: [ + '6ca13d52ca70c883e0f0bb101e425a89e8624de51db2d2392593af6a84118090', + ], + client_user_agent: 'chrome', + }, + custom_data: { + currency: 'USD', + value: '27.5', + order_id: '50314b8e9bcf000000000000', + num_items: 3, + content_ids: ['507f1f77bcf86cd799439011', '505bd76785ebb509fc183733'], + contents: [ + { + quantity: 1, + item_price: '19', + }, + { + quantity: 2, + item_price: '3', + }, + ], + }, + }, + { + event_name: 'signup', + event_time: 1597383030, + action_source: 'web', + event_id: '7208bbb6-2c4e-45bb-bf5b-ad426f3593e9', + app_id: '429047995', + advertiser_id: '429047995', + user_data: { + em: ['48ddb93f0b30c475423fe177832912c5bcdce3cc72872f8051627967ef278e08'], + ph: ['d164bbe036663cb5c96835e9ccc6501e9a521127ea62f6359744928ba932413b'], + ln: ['dcf000c2386fb76d22cefc0d118a8511bb75999019cd373df52044bccd1bd251'], + fn: ['9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08'], + ct: ['6689106ca7922c30b2fd2c175c85bc7fc2d52cc4941bdd7bb622c6cdc6284a85'], + st: ['3b45022ab36728cdae12e709e945bba267c50ee8a91e6e4388539a8e03a3fdcd'], + zp: ['1a4292e00780e18d00e76fde9850aee5344e939ba593333cd5e4b4aa2cd33b0c'], + country: [ + '582967534d0f909d196b97f9e6921342777aea87b46fa52df165389db1fb8ccf', + ], + hashed_maids: [ + '6ca13d52ca70c883e0f0bb101e425a89e8624de51db2d2392593af6a84118090', + ], + client_user_agent: 'chrome', + }, + custom_data: { + currency: 'USD', + value: '27.5', + order_id: '50314b8e9bcf000000000000', + num_items: 3, + content_ids: ['507f1f77bcf86cd799439011', '505bd76785ebb509fc183733'], + contents: [ + { + quantity: 1, + item_price: '19', + }, + { + quantity: 2, + item_price: '3', + }, + ], + }, + }, + { + action_source: 'web', + event_name: 'WatchVideo', + event_time: 1597383030, + event_id: '7208bbb6-2c4e-45bb-bf5b-ad426f3593e9', + app_id: '429047995', + advertiser_id: '429047995', + user_data: { + em: ['48ddb93f0b30c475423fe177832912c5bcdce3cc72872f8051627967ef278e08'], + ph: ['d164bbe036663cb5c96835e9ccc6501e9a521127ea62f6359744928ba932413b'], + ln: ['bdfdee6414a89d72bfbf5ee90b1f85924467bae1e3980d83c2cd348dc31d5819'], + fn: ['ee5db3fe0253b651aca3676692e0c59b25909304f5c51d223a02a215d104144b'], + ct: ['6689106ca7922c30b2fd2c175c85bc7fc2d52cc4941bdd7bb622c6cdc6284a85'], + st: ['3b45022ab36728cdae12e709e945bba267c50ee8a91e6e4388539a8e03a3fdcd'], + zp: ['1a4292e00780e18d00e76fde9850aee5344e939ba593333cd5e4b4aa2cd33b0c'], + country: [ + '582967534d0f909d196b97f9e6921342777aea87b46fa52df165389db1fb8ccf', + ], + hashed_maids: [ + '6ca13d52ca70c883e0f0bb101e425a89e8624de51db2d2392593af6a84118090', + ], + client_user_agent: 'chrome', + }, + custom_data: { + currency: 'USD', + value: '27.5', + order_id: '50314b8e9bcf000000000000', + num_items: 3, + content_ids: ['507f1f77bcf86cd799439011', '505bd76785ebb509fc183733'], + contents: [ + { + quantity: 1, + item_price: '19', + }, + { + quantity: 2, + item_price: '3', + }, + ], + }, + }, + ], + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + }, + metadata: [ + { + destintionId: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', + jobId: 1, + }, + { + destintionId: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', + jobId: 2, + }, + { + destintionId: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', + jobId: 3, + }, + { + destintionId: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', + jobId: 4, + }, + { + destintionId: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', + jobId: 6, + }, + { + destintionId: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', + jobId: 7, + }, + ], + batched: true, + statusCode: 200, + destination: { + DestinationDefinition: { Config: { cdkV2Enabled: true } }, + ID: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', + Name: 'PINTEREST_TAG', + Config: { + sendAsTestEvent: false, + tagId: '123456789', + advertiserId: '429047995', + appId: '429047995', + sendingUnHashedData: true, + enableDeduplication: true, + deduplicationKey: 'messageId', + enhancedMatch: true, + customProperties: [ + { + properties: 'presentclass', + }, + { + properties: 'presentgrade', + }, + ], + eventsMapping: [ + { + from: 'ABC Searched', + to: 'WatchVideo', + }, + { + from: 'ABC Searched', + to: 'Signup', + }, + { + from: 'User Signup', + to: 'Signup', + }, + { + from: 'User Created', + to: 'Signup', + }, + ], + }, + Enabled: true, + Transformations: [], + }, + }, + { + metadata: [ + { + destintionId: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', + jobId: 5, + }, + ], + statTags: { + destType: 'PINTEREST_TAG', + feature: 'router', + implementation: 'cdkV2', + module: 'destination', + errorCategory: 'dataValidation', + errorType: 'instrumentation', + }, + batched: false, + statusCode: 400, + error: 'message type identify is not supported', + destination: { + DestinationDefinition: { Config: { cdkV2Enabled: true } }, + ID: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', + Name: 'PINTEREST_TAG', + Config: { + sendAsTestEvent: false, + tagId: '123456789', + advertiserId: '429047995', + appId: '429047995', + sendingUnHashedData: true, + enableDeduplication: true, + deduplicationKey: 'messageId', + enhancedMatch: true, + customProperties: [ + { + properties: 'presentclass', + }, + { + properties: 'presentgrade', + }, + ], + eventsMapping: [ + { + from: 'ABC Searched', + to: 'WatchVideo', + }, + { + from: 'ABC Searched', + to: 'Signup', + }, + { + from: 'User Signup', + to: 'Signup', + }, + { + from: 'User Created', + to: 'Signup', + }, + ], + }, + Enabled: true, + Transformations: [], + }, + }, + ], + }, + }, + }, + }, + { + destType: 'pinterest_tag', + description: 'Test 0', + feature: 'router', + module: 'destination', + version: 'v0', + input: { + request: { + body: { + input: [ + { + message: { + type: 'track', + event: 'ABC Searched', + sentAt: '2020-08-14T05:30:30.118Z', + channel: 'web', + context: { + source: 'test', + userAgent: 'chrome', + traits: { + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + email: 'abc@gmail.com', + phone: '+1234589947', + ge: 'male', + db: '19950715', + lastname: 'Rudderlabs', + firstName: 'Test', + address: { + city: 'Kolkata', + state: 'WB', + zip: '700114', + country: 'IN', + }, + }, + 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: { + tax: 2, + total: 27.5, + coupon: 'hasbros', + revenue: 48, + price: 25, + quantity: 2, + currency: 'USD', + discount: 2.5, + order_id: '50314b8e9bcf000000000000', + requestIP: '123.0.0.0', + optOutType: 'LDP', + 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', + }, + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + integrations: { + All: true, + }, + }, + metadata: { + destintionId: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', + jobId: 8, + }, + destination: { + DestinationDefinition: { Config: { cdkV2Enabled: true } }, + ID: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', + Name: 'PINTEREST_TAG', + Config: { + sendAsTestEvent: false, + tagId: '123456789', + apiVersion: 'newApi', + adAccountId: 'accountId123', + conversionToken: 'conversionToken123', + appId: '429047995', + sendingUnHashedData: true, + enableDeduplication: true, + deduplicationKey: 'messageId', + enhancedMatch: true, + customProperties: [ + { + properties: 'presentclass', + }, + { + properties: 'presentgrade', + }, + ], + eventsMapping: [ + { + from: 'ABC Searched', + to: 'WatchVideo', + }, + { + from: 'ABC Searched', + to: 'Signup', + }, + { + from: 'User Signup', + to: 'Signup', + }, + { + from: 'User Created', + to: 'Signup', + }, + ], + }, + Enabled: true, + Transformations: [], + }, + }, + { + message: { + type: 'track', + event: 'Order completed', + sentAt: '2020-08-14T05:30:30.118Z', + channel: 'web', + context: { + source: 'test', + userAgent: 'chrome', + traits: { + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + email: 'abc@gmail.com', + phone: '+1234589947', + ge: 'male', + db: '19950715', + lastname: 'Rudderlabs', + firstName: 'Test', + address: { + city: 'Kolkata', + state: 'WB', + zip: '700114', + country: 'IN', + }, + }, + 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: { + tax: 2, + total: 27.5, + coupon: 'hasbros', + revenue: 48, + price: 25, + quantity: 2, + currency: 'USD', + discount: 2.5, + order_id: '50314b8e9bcf000000000000', + requestIP: '123.0.0.0', + 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', + }, + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + integrations: { + All: true, + }, + }, + metadata: { + destintionId: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', + jobId: 9, + }, + destination: { + DestinationDefinition: { Config: { cdkV2Enabled: true } }, + ID: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', + Name: 'PINTEREST_TAG', + Config: { + sendAsTestEvent: false, + tagId: '123456789', + apiVersion: 'newApi', + adAccountId: 'accountId123', + conversionToken: 'conversionToken123', + appId: '429047995', + sendingUnHashedData: true, + enableDeduplication: true, + deduplicationKey: 'messageId', + enhancedMatch: true, + customProperties: [ + { + properties: 'presentclass', + }, + { + properties: 'presentgrade', + }, + ], + eventsMapping: [ + { + from: 'ABC Searched', + to: 'WatchVideo', + }, + { + from: 'ABC Searched', + to: 'Signup', + }, + { + from: 'User Signup', + to: 'Signup', + }, + { + from: 'User Created', + to: 'Signup', + }, + ], + }, + Enabled: true, + Transformations: [], + }, + }, + { + message: { + type: 'track', + event: 'Test', + sentAt: '2020-08-14T05:30:30.118Z', + channel: 'web', + context: { + source: 'test', + userAgent: 'chrome', + traits: { + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + email: 'abc@gmail.com', + phone: '+1234589947', + ge: 'male', + db: '19950715', + lastname: 'Rudderlabs', + firstName: 'Test', + address: { + city: 'Kolkata', + state: 'WB', + zip: '700114', + country: 'IN', + }, + }, + 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: { + tax: 2, + total: 27.5, + coupon: 'hasbros', + revenue: 48, + price: 25, + quantity: 2, + currency: 'USD', + discount: 2.5, + order_id: '50314b8e9bcf000000000000', + requestIP: '123.0.0.0', + 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', + }, + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + integrations: { + All: true, + }, + }, + metadata: { + destintionId: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', + jobId: 10, + }, + destination: { + DestinationDefinition: { Config: { cdkV2Enabled: true } }, + ID: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', + Name: 'PINTEREST_TAG', + Config: { + sendAsTestEvent: false, + tagId: '123456789', + apiVersion: 'newApi', + adAccountId: 'accountId123', + conversionToken: 'conversionToken123', + appId: '429047995', + sendingUnHashedData: true, + enableDeduplication: true, + deduplicationKey: 'messageId', + enhancedMatch: true, + sendAsCustomEvent: true, + customProperties: [ + { + properties: 'presentclass', + }, + { + properties: 'presentgrade', + }, + ], + eventsMapping: [ + { + from: 'ABC Searched', + to: 'WatchVideo', + }, + { + from: 'ABC Searched', + to: 'Signup', + }, + { + from: 'User Signup', + to: 'Signup', + }, + { + from: 'User Created', + to: 'Signup', + }, + ], + }, + Enabled: true, + Transformations: [], + }, + }, + ], + destType: 'pinterest_tag', + }, + method: 'POST', + }, + }, + output: { + response: { + status: 200, + body: { + output: [ + { + batchedRequest: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://api.pinterest.com/v5/ad_accounts/accountId123/events', + headers: { + 'Content-Type': 'application/json', + Authorization: 'Bearer conversionToken123', + }, + params: {}, + body: { + JSON: { + data: [ + { + event_name: 'watch_video', + event_time: 1597383030, + action_source: 'web', + event_id: '7208bbb6-2c4e-45bb-bf5b-ad426f3593e9', + app_id: '429047995', + user_data: { + em: ['48ddb93f0b30c475423fe177832912c5bcdce3cc72872f8051627967ef278e08'], + ph: ['d164bbe036663cb5c96835e9ccc6501e9a521127ea62f6359744928ba932413b'], + ln: ['dcf000c2386fb76d22cefc0d118a8511bb75999019cd373df52044bccd1bd251'], + fn: ['9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08'], + ct: ['6689106ca7922c30b2fd2c175c85bc7fc2d52cc4941bdd7bb622c6cdc6284a85'], + st: ['3b45022ab36728cdae12e709e945bba267c50ee8a91e6e4388539a8e03a3fdcd'], + zp: ['1a4292e00780e18d00e76fde9850aee5344e939ba593333cd5e4b4aa2cd33b0c'], + country: [ + '582967534d0f909d196b97f9e6921342777aea87b46fa52df165389db1fb8ccf', + ], + hashed_maids: [ + '6ca13d52ca70c883e0f0bb101e425a89e8624de51db2d2392593af6a84118090', + ], + client_user_agent: 'chrome', + }, + custom_data: { + currency: 'USD', + value: '27.5', + order_id: '50314b8e9bcf000000000000', + num_items: 3, + opt_out_type: 'LDP', + content_ids: ['507f1f77bcf86cd799439011', '505bd76785ebb509fc183733'], + contents: [ + { + quantity: 1, + item_price: '19', + }, + { + quantity: 2, + item_price: '3', + }, + ], + }, + }, + { + event_name: 'signup', + event_time: 1597383030, + action_source: 'web', + event_id: '7208bbb6-2c4e-45bb-bf5b-ad426f3593e9', + app_id: '429047995', + user_data: { + em: ['48ddb93f0b30c475423fe177832912c5bcdce3cc72872f8051627967ef278e08'], + ph: ['d164bbe036663cb5c96835e9ccc6501e9a521127ea62f6359744928ba932413b'], + ln: ['dcf000c2386fb76d22cefc0d118a8511bb75999019cd373df52044bccd1bd251'], + fn: ['9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08'], + ct: ['6689106ca7922c30b2fd2c175c85bc7fc2d52cc4941bdd7bb622c6cdc6284a85'], + st: ['3b45022ab36728cdae12e709e945bba267c50ee8a91e6e4388539a8e03a3fdcd'], + zp: ['1a4292e00780e18d00e76fde9850aee5344e939ba593333cd5e4b4aa2cd33b0c'], + country: [ + '582967534d0f909d196b97f9e6921342777aea87b46fa52df165389db1fb8ccf', + ], + hashed_maids: [ + '6ca13d52ca70c883e0f0bb101e425a89e8624de51db2d2392593af6a84118090', + ], + client_user_agent: 'chrome', + }, + custom_data: { + currency: 'USD', + value: '27.5', + order_id: '50314b8e9bcf000000000000', + num_items: 3, + opt_out_type: 'LDP', + content_ids: ['507f1f77bcf86cd799439011', '505bd76785ebb509fc183733'], + contents: [ + { + quantity: 1, + item_price: '19', + }, + { + quantity: 2, + item_price: '3', + }, + ], + }, + }, + { + event_name: 'checkout', + event_time: 1597383030, + action_source: 'web', + event_id: '7208bbb6-2c4e-45bb-bf5b-ad426f3593e9', + app_id: '429047995', + user_data: { + em: ['48ddb93f0b30c475423fe177832912c5bcdce3cc72872f8051627967ef278e08'], + ph: ['d164bbe036663cb5c96835e9ccc6501e9a521127ea62f6359744928ba932413b'], + ln: ['dcf000c2386fb76d22cefc0d118a8511bb75999019cd373df52044bccd1bd251'], + fn: ['9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08'], + ct: ['6689106ca7922c30b2fd2c175c85bc7fc2d52cc4941bdd7bb622c6cdc6284a85'], + st: ['3b45022ab36728cdae12e709e945bba267c50ee8a91e6e4388539a8e03a3fdcd'], + zp: ['1a4292e00780e18d00e76fde9850aee5344e939ba593333cd5e4b4aa2cd33b0c'], + country: [ + '582967534d0f909d196b97f9e6921342777aea87b46fa52df165389db1fb8ccf', + ], + hashed_maids: [ + '6ca13d52ca70c883e0f0bb101e425a89e8624de51db2d2392593af6a84118090', + ], + client_user_agent: 'chrome', + }, + custom_data: { + currency: 'USD', + value: '27.5', + order_id: '50314b8e9bcf000000000000', + num_items: 3, + content_ids: ['507f1f77bcf86cd799439011', '505bd76785ebb509fc183733'], + contents: [ + { + quantity: 1, + item_price: '19', + }, + { + quantity: 2, + item_price: '3', + }, + ], + }, + }, + { + event_name: 'custom', + event_time: 1597383030, + action_source: 'web', + event_id: '7208bbb6-2c4e-45bb-bf5b-ad426f3593e9', + app_id: '429047995', + user_data: { + em: ['48ddb93f0b30c475423fe177832912c5bcdce3cc72872f8051627967ef278e08'], + ph: ['d164bbe036663cb5c96835e9ccc6501e9a521127ea62f6359744928ba932413b'], + ln: ['dcf000c2386fb76d22cefc0d118a8511bb75999019cd373df52044bccd1bd251'], + fn: ['9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08'], + ct: ['6689106ca7922c30b2fd2c175c85bc7fc2d52cc4941bdd7bb622c6cdc6284a85'], + st: ['3b45022ab36728cdae12e709e945bba267c50ee8a91e6e4388539a8e03a3fdcd'], + zp: ['1a4292e00780e18d00e76fde9850aee5344e939ba593333cd5e4b4aa2cd33b0c'], + country: [ + '582967534d0f909d196b97f9e6921342777aea87b46fa52df165389db1fb8ccf', + ], + hashed_maids: [ + '6ca13d52ca70c883e0f0bb101e425a89e8624de51db2d2392593af6a84118090', + ], + client_user_agent: 'chrome', + }, + custom_data: { + currency: 'USD', + value: '27.5', + order_id: '50314b8e9bcf000000000000', + num_items: 3, + content_ids: ['507f1f77bcf86cd799439011', '505bd76785ebb509fc183733'], + contents: [ + { + quantity: 1, + item_price: '19', + }, + { + quantity: 2, + item_price: '3', + }, + ], + }, + }, + ], + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + }, + metadata: [ + { + destintionId: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', + jobId: 8, + }, + { + destintionId: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', + jobId: 9, + }, + { + destintionId: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', + jobId: 10, + }, + ], + batched: true, + statusCode: 200, + destination: { + DestinationDefinition: { Config: { cdkV2Enabled: true } }, + ID: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', + Name: 'PINTEREST_TAG', + Config: { + sendAsTestEvent: false, + tagId: '123456789', + apiVersion: 'newApi', + adAccountId: 'accountId123', + conversionToken: 'conversionToken123', + appId: '429047995', + sendingUnHashedData: true, + enableDeduplication: true, + deduplicationKey: 'messageId', + enhancedMatch: true, + customProperties: [ + { + properties: 'presentclass', + }, + { + properties: 'presentgrade', + }, + ], + eventsMapping: [ + { + from: 'ABC Searched', + to: 'WatchVideo', + }, + { + from: 'ABC Searched', + to: 'Signup', + }, + { + from: 'User Signup', + to: 'Signup', + }, + { + from: 'User Created', + to: 'Signup', + }, + ], + }, + Enabled: true, + Transformations: [], + }, + }, + ], + }, + }, + }, + }, + { + destType: 'pinterest_tag', + description: 'Test 0', + feature: 'router', + module: 'destination', + version: 'v0', + input: { + request: { + body: { + input: [ + { + message: { + type: 'Identify', + event: 'User Signup', + sentAt: '2020-08-14T05:30:30.118Z', + channel: 'web', + context: { + source: 'test', + userAgent: 'chrome', + traits: { + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + email: 'abc@gmail.com', + phone: '+1234589947', + ge: 'male', + db: '19950715', + lastname: 'Rudderlabs', + firstName: 'Test', + address: { + city: 'Kolkata', + state: 'WB', + zip: '700114', + country: 'IN', + }, + }, + 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: { + tax: 2, + total: 27.5, + coupon: 'hasbros', + revenue: 48, + price: 25, + quantity: 2, + currency: 'USD', + discount: 2.5, + order_id: '50314b8e9bcf000000000000', + requestIP: '123.0.0.0', + 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', + }, + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + integrations: { + All: true, + }, + }, + metadata: { + destintionId: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', + jobId: 5, + }, + destination: { + DestinationDefinition: { Config: { cdkV2Enabled: true } }, + ID: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', + Name: 'PINTEREST_TAG', + Config: { + sendAsTestEvent: false, + tagId: '123456789', + advertiserId: '429047995', + appId: '429047995', + sendingUnHashedData: true, + enableDeduplication: true, + deduplicationKey: 'messageId', + enhancedMatch: true, + customProperties: [ + { + properties: 'presentclass', + }, + { + properties: 'presentgrade', + }, + ], + eventsMapping: [ + { + from: 'ABC Searched', + to: 'Watch Video', + }, + { + from: 'ABC Searched', + to: 'Signup', + }, + { + from: 'User Signup', + to: 'Signup', + }, + { + from: 'User Created', + to: 'Signup', + }, + ], + }, + Enabled: true, + Transformations: [], + }, + }, + ], + destType: 'pinterest_tag', + }, + method: 'POST', + }, + }, + output: { + response: { + status: 200, + body: { + output: [ + { + metadata: [ + { + destintionId: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', + jobId: 5, + }, + ], + batched: false, + statusCode: 400, + error: 'message type identify is not supported', + statTags: { + destType: 'PINTEREST_TAG', + implementation: 'cdkV2', + feature: 'router', + module: 'destination', + errorCategory: 'dataValidation', + errorType: 'instrumentation', + }, + destination: { + DestinationDefinition: { Config: { cdkV2Enabled: true } }, + ID: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', + Name: 'PINTEREST_TAG', + Config: { + sendAsTestEvent: false, + tagId: '123456789', + advertiserId: '429047995', + appId: '429047995', + sendingUnHashedData: true, + enableDeduplication: true, + deduplicationKey: 'messageId', + enhancedMatch: true, + customProperties: [ + { + properties: 'presentclass', + }, + { + properties: 'presentgrade', + }, + ], + eventsMapping: [ + { + from: 'ABC Searched', + to: 'Watch Video', + }, + { + from: 'ABC Searched', + to: 'Signup', + }, + { + from: 'User Signup', + to: 'Signup', + }, + { + from: 'User Created', + to: 'Signup', + }, + ], + }, + Enabled: true, + Transformations: [], + }, + }, + ], + }, + }, + }, + }, +]; diff --git a/test/integrations/destinations/pinterest_tag/step/data.ts b/test/integrations/destinations/pinterest_tag/step/data.ts new file mode 100644 index 0000000000..b5d6f5186f --- /dev/null +++ b/test/integrations/destinations/pinterest_tag/step/data.ts @@ -0,0 +1,3358 @@ +export const data = [ + { + name: 'pinterest_tag', + description: 'Test 0', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + type: 'track', + event: 'ABC Searched', + sentAt: '2020-08-14T05:30:30.118Z', + channel: 'web', + context: { + source: 'test', + userAgent: 'chrome', + traits: { + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + email: 'abc@gmail.com', + phone: '+1234589947', + gender: 'non-binary', + db: '19950715', + lastname: 'Rudderlabs', + firstName: 'Test', + address: { city: 'Kolkata', state: 'WB', zip: '700114', country: 'IN' }, + }, + 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: { + tax: 2, + total: 27.5, + coupon: 'hasbros', + revenue: 48, + price: 25, + quantity: 2, + currency: 'USD', + discount: 2.5, + order_id: '50314b8e9bcf000000000000', + requestIP: '123.0.0.0', + optOutType: 'LDP', + 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', + }, + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + integrations: { All: true }, + }, + destination: { + ID: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', + Name: 'PINTEREST_TAG', + Config: { + sendAsTestEvent: false, + tagId: '123456789', + advertiserId: '429047995', + appId: '429047995', + enhancedMatch: true, + enableDeduplication: true, + deduplicationKey: 'messageId', + sendingUnHashedData: true, + customProperties: [{ properties: 'presentclass' }, { properties: 'presentgrade' }], + eventsMapping: [{ from: 'ABC Searched', to: 'WatchVideo' }], + }, + Enabled: true, + Transformations: [], + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://ct.pinterest.com/events/v3', + headers: { 'Content-Type': 'application/json' }, + params: {}, + body: { + JSON: { + action_source: 'web', + event_name: 'watch_video', + event_time: 1597383030, + event_id: '7208bbb6-2c4e-45bb-bf5b-ad426f3593e9', + app_id: '429047995', + advertiser_id: '429047995', + user_data: { + em: ['48ddb93f0b30c475423fe177832912c5bcdce3cc72872f8051627967ef278e08'], + ph: ['d164bbe036663cb5c96835e9ccc6501e9a521127ea62f6359744928ba932413b'], + ln: ['dcf000c2386fb76d22cefc0d118a8511bb75999019cd373df52044bccd1bd251'], + fn: ['9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08'], + ct: ['6689106ca7922c30b2fd2c175c85bc7fc2d52cc4941bdd7bb622c6cdc6284a85'], + st: ['3b45022ab36728cdae12e709e945bba267c50ee8a91e6e4388539a8e03a3fdcd'], + zp: ['1a4292e00780e18d00e76fde9850aee5344e939ba593333cd5e4b4aa2cd33b0c'], + country: ['582967534d0f909d196b97f9e6921342777aea87b46fa52df165389db1fb8ccf'], + hashed_maids: [ + '6ca13d52ca70c883e0f0bb101e425a89e8624de51db2d2392593af6a84118090', + ], + client_user_agent: 'chrome', + ge: ['1b16b1df538ba12dc3f97edbb85caa7050d46c148134290feba80f8236c83db9'], + }, + custom_data: { + currency: 'USD', + value: '27.5', + order_id: '50314b8e9bcf000000000000', + opt_out_type: 'LDP', + num_items: 3, + content_ids: ['507f1f77bcf86cd799439011', '505bd76785ebb509fc183733'], + contents: [ + { quantity: 1, item_price: '19' }, + { quantity: 2, item_price: '3' }, + ], + }, + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'pinterest_tag', + description: 'Test 1', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + type: 'track', + event: 'Order completed', + sentAt: '2020-08-14T05:30:30.118Z', + channel: 'web', + context: { + source: 'test', + userAgent: 'chrome', + traits: { + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + email: 'abc@gmail.com', + phone: '+1234589947', + ge: 'male', + db: '19950715', + lastname: 'Rudderlabs', + firstName: 'Test', + address: { city: 'Kolkata', state: 'WB', zip: '700114', country: 'IN' }, + }, + 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: { + tax: 2, + total: 27.5, + coupon: 'hasbros', + revenue: 48, + price: 25, + quantity: 2, + currency: 'USD', + discount: 2.5, + order_id: '50314b8e9bcf000000000000', + requestIP: '123.0.0.0', + 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', + }, + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + integrations: { All: true }, + }, + destination: { + ID: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', + Name: 'PINTEREST_TAG', + Config: { + sendAsTestEvent: false, + tagId: '123456789', + advertiserId: '429047995', + appId: '429047995', + sendingUnHashedData: true, + enableDeduplication: true, + deduplicationKey: 'messageId', + enhancedMatch: true, + customProperties: [{ properties: 'presentclass' }, { properties: 'presentgrade' }], + eventsMapping: [{ from: 'ABC Searched', to: 'WatchVideo' }], + }, + Enabled: true, + Transformations: [], + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://ct.pinterest.com/events/v3', + headers: { 'Content-Type': 'application/json' }, + params: {}, + body: { + JSON: { + action_source: 'web', + event_name: 'checkout', + event_time: 1597383030, + event_id: '7208bbb6-2c4e-45bb-bf5b-ad426f3593e9', + app_id: '429047995', + advertiser_id: '429047995', + user_data: { + em: ['48ddb93f0b30c475423fe177832912c5bcdce3cc72872f8051627967ef278e08'], + ph: ['d164bbe036663cb5c96835e9ccc6501e9a521127ea62f6359744928ba932413b'], + ln: ['dcf000c2386fb76d22cefc0d118a8511bb75999019cd373df52044bccd1bd251'], + fn: ['9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08'], + ct: ['6689106ca7922c30b2fd2c175c85bc7fc2d52cc4941bdd7bb622c6cdc6284a85'], + st: ['3b45022ab36728cdae12e709e945bba267c50ee8a91e6e4388539a8e03a3fdcd'], + zp: ['1a4292e00780e18d00e76fde9850aee5344e939ba593333cd5e4b4aa2cd33b0c'], + country: ['582967534d0f909d196b97f9e6921342777aea87b46fa52df165389db1fb8ccf'], + hashed_maids: [ + '6ca13d52ca70c883e0f0bb101e425a89e8624de51db2d2392593af6a84118090', + ], + client_user_agent: 'chrome', + }, + custom_data: { + currency: 'USD', + value: '27.5', + order_id: '50314b8e9bcf000000000000', + num_items: 3, + content_ids: ['507f1f77bcf86cd799439011', '505bd76785ebb509fc183733'], + contents: [ + { quantity: 1, item_price: '19' }, + { quantity: 2, item_price: '3' }, + ], + }, + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'pinterest_tag', + description: 'Test 2', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + type: 'track', + event: 'product added', + sentAt: '2020-08-14T05:30:30.118Z', + channel: 'web', + context: { + source: 'test', + userAgent: 'chrome', + traits: { + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + email: 'abc@gmail.com', + phone: '+1234589947', + ge: 'male', + db: '19950715', + lastname: 'Rudderlabs', + firstName: 'Test', + address: { city: 'Kolkata', state: 'WB', zip: '700114', country: 'IN' }, + }, + 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: { + product_id: '123', + tax: 2, + total: 27.5, + coupon: 'hasbros', + revenue: 48, + price: 25, + quantity: 2, + currency: 'USD', + discount: 2.5, + order_id: '50314b8e9bcf000000000000', + requestIP: '123.0.0.0', + shipping: 3, + subtotal: 22.5, + affiliation: 'Google Store', + checkout_id: 'fksdjfsdjfisjf9sdfjsd9f', + }, + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + integrations: { All: true }, + }, + destination: { + ID: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', + Name: 'PINTEREST_TAG', + Config: { + sendAsTestEvent: false, + tagId: '123456789', + advertiserId: '429047995', + appId: '429047995', + sendingUnHashedData: true, + enableDeduplication: true, + deduplicationKey: 'messageId', + enhancedMatch: true, + customProperties: [{ properties: 'presentclass' }, { properties: 'presentgrade' }], + eventsMapping: [{ from: 'ABC Searched', to: 'WatchVideo' }], + }, + Enabled: true, + Transformations: [], + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://ct.pinterest.com/events/v3', + headers: { 'Content-Type': 'application/json' }, + params: {}, + body: { + JSON: { + event_name: 'add_to_cart', + action_source: 'web', + event_time: 1597383030, + event_id: '7208bbb6-2c4e-45bb-bf5b-ad426f3593e9', + app_id: '429047995', + advertiser_id: '429047995', + user_data: { + em: ['48ddb93f0b30c475423fe177832912c5bcdce3cc72872f8051627967ef278e08'], + ph: ['d164bbe036663cb5c96835e9ccc6501e9a521127ea62f6359744928ba932413b'], + ln: ['dcf000c2386fb76d22cefc0d118a8511bb75999019cd373df52044bccd1bd251'], + fn: ['9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08'], + ct: ['6689106ca7922c30b2fd2c175c85bc7fc2d52cc4941bdd7bb622c6cdc6284a85'], + st: ['3b45022ab36728cdae12e709e945bba267c50ee8a91e6e4388539a8e03a3fdcd'], + zp: ['1a4292e00780e18d00e76fde9850aee5344e939ba593333cd5e4b4aa2cd33b0c'], + country: ['582967534d0f909d196b97f9e6921342777aea87b46fa52df165389db1fb8ccf'], + hashed_maids: [ + '6ca13d52ca70c883e0f0bb101e425a89e8624de51db2d2392593af6a84118090', + ], + client_user_agent: 'chrome', + }, + custom_data: { + currency: 'USD', + value: '27.5', + order_id: '50314b8e9bcf000000000000', + num_items: 2, + content_ids: ['123'], + contents: [{ quantity: 2, item_price: '25' }], + }, + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'pinterest_tag', + description: 'Test 3', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + type: 'track', + event: 'Product List Filtered', + sentAt: '2020-08-14T05:30:30.118Z', + context: { + source: 'test', + userAgent: 'chrome', + traits: { + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + email: 'abc@gmail.com', + phone: '+1234589947', + ge: 'male', + db: '19950715', + lastname: 'Rudderlabs', + firstName: 'Test', + address: { city: 'Kolkata', state: 'WB', zip: '700114', country: 'IN' }, + }, + 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: { + tax: 2, + total: 27.5, + coupon: 'hasbros', + revenue: 48, + price: 25, + quantity: 2, + currency: 'USD', + discount: 2.5, + order_id: '50314b8e9bcf000000000000', + requestIP: '123.0.0.0', + 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', + }, + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + integrations: { All: true }, + }, + destination: { + ID: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', + Name: 'PINTEREST_TAG', + Config: { + sendAsTestEvent: false, + tagId: '123456789', + advertiserId: '', + appId: '429047995', + sendingUnHashedData: true, + enableDeduplication: true, + deduplicationKey: 'messageId', + enhancedMatch: true, + customProperties: [{ properties: 'presentclass' }, { properties: 'presentgrade' }], + eventsMapping: [{ from: 'ABC Searched', to: 'WatchVideo' }], + }, + Enabled: true, + Transformations: [], + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + error: 'Advertiser Id not found. Aborting', + statTags: { + destType: 'PINTEREST_TAG', + errorCategory: 'dataValidation', + errorType: 'configuration', + feature: 'processor', + implementation: 'native', + module: 'destination', + }, + statusCode: 400, + }, + ], + }, + }, + }, + { + name: 'pinterest_tag', + description: 'Test 4', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + type: 'track', + event: 'Product List Filtered', + sentAt: '2020-08-14T05:30:30.118Z', + channel: 'web', + context: { + source: 'test', + userAgent: 'chrome', + traits: { + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + phone: '+1234589947', + ge: 'male', + db: '19950715', + lastname: 'Rudderlabs', + firstName: 'Test', + address: { city: 'Kolkata', state: 'WB', zip: '700114', country: 'IN' }, + }, + library: { name: 'rudder-sdk-ruby-sync', version: '1.0.6' }, + }, + messageId: '7208bbb6-2c4e-45bb-bf5b-ad426f3593e9', + timestamp: '2020-08-14T05:30:30.118Z', + properties: { + tax: 2, + total: 27.5, + coupon: 'hasbros', + revenue: 48, + price: 25, + quantity: 2, + currency: 'USD', + discount: 2.5, + order_id: '50314b8e9bcf000000000000', + requestIP: '123.0.0.0', + 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', + }, + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + integrations: { All: true }, + }, + destination: { + ID: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', + Name: 'PINTEREST_TAG', + Config: { + sendAsTestEvent: false, + tagId: '123456789', + advertiserId: '429047995', + appId: '429047995', + sendingUnHashedData: true, + enableDeduplication: true, + deduplicationKey: 'messageId', + enhancedMatch: true, + customProperties: [{ properties: 'presentclass' }, { properties: 'presentgrade' }], + eventsMapping: [{ from: 'ABC Searched', to: 'WatchVideo' }], + }, + Enabled: true, + Transformations: [], + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + error: + 'It is required at least one of em, hashed_maids or pair of client_ip_address and client_user_agent', + statTags: { + destType: 'PINTEREST_TAG', + errorCategory: 'dataValidation', + errorType: 'instrumentation', + feature: 'processor', + implementation: 'native', + module: 'destination', + }, + statusCode: 400, + }, + ], + }, + }, + }, + { + name: 'pinterest_tag', + description: 'Test 5', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + type: 'track', + event: 'ABC Searched', + sentAt: '2020-08-14T05:30:30.118Z', + channel: 'web', + context: { + source: 'test', + userAgent: 'chrome', + traits: { + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + email: 'abc@gmail.com', + phone: '+1234589947', + ge: 'male', + db: '19950715', + lastname: 'Rudderlabs', + firstName: 'Test', + address: { city: 'Kolkata', state: 'WB', zip: '700114', country: 'IN' }, + }, + 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: { + tax: 2, + total: 27.5, + coupon: 'hasbros', + revenue: 48, + price: 25, + quantity: 2, + currency: 'USD', + discount: 2.5, + order_id: '50314b8e9bcf000000000000', + requestIP: '123.0.0.0', + numOfItems: 2, + 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', + }, + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + integrations: { All: true }, + }, + destination: { + ID: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', + Name: 'PINTEREST_TAG', + Config: { + sendAsTestEvent: false, + tagId: '123456789', + advertiserId: '429047995', + appId: '429047995', + sendingUnHashedData: true, + enableDeduplication: true, + deduplicationKey: 'messageId', + enhancedMatch: true, + customProperties: [{ properties: 'presentclass' }, { properties: 'presentgrade' }], + eventsMapping: [{ from: 'ABC Searched', to: 'WatchVideo' }], + }, + Enabled: true, + Transformations: [], + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://ct.pinterest.com/events/v3', + headers: { 'Content-Type': 'application/json' }, + params: {}, + body: { + JSON: { + event_name: 'watch_video', + event_time: 1597383030, + action_source: 'web', + event_id: '7208bbb6-2c4e-45bb-bf5b-ad426f3593e9', + app_id: '429047995', + advertiser_id: '429047995', + user_data: { + em: ['48ddb93f0b30c475423fe177832912c5bcdce3cc72872f8051627967ef278e08'], + ph: ['d164bbe036663cb5c96835e9ccc6501e9a521127ea62f6359744928ba932413b'], + ln: ['dcf000c2386fb76d22cefc0d118a8511bb75999019cd373df52044bccd1bd251'], + fn: ['9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08'], + ct: ['6689106ca7922c30b2fd2c175c85bc7fc2d52cc4941bdd7bb622c6cdc6284a85'], + st: ['3b45022ab36728cdae12e709e945bba267c50ee8a91e6e4388539a8e03a3fdcd'], + zp: ['1a4292e00780e18d00e76fde9850aee5344e939ba593333cd5e4b4aa2cd33b0c'], + country: ['582967534d0f909d196b97f9e6921342777aea87b46fa52df165389db1fb8ccf'], + hashed_maids: [ + '6ca13d52ca70c883e0f0bb101e425a89e8624de51db2d2392593af6a84118090', + ], + client_user_agent: 'chrome', + }, + custom_data: { + currency: 'USD', + value: '27.5', + num_items: 2, + order_id: '50314b8e9bcf000000000000', + content_ids: ['507f1f77bcf86cd799439011', '505bd76785ebb509fc183733'], + contents: [ + { quantity: 1, item_price: '19' }, + { quantity: 2, item_price: '3' }, + ], + }, + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'pinterest_tag', + description: 'Test 6', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + type: 'track', + event: 'ABC Searched', + sentAt: '2020-08-14T05:30:30.118Z', + channel: 'web', + context: { + source: 'test', + userAgent: 'chrome', + traits: { + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + email: 'abc@gmail.com', + phone: '+1234589947', + ge: 'male', + db: '19950715', + lastname: 'Rudderlabs', + firstName: 'Test', + address: { city: 'Kolkata', state: 'WB', zip: '700114', country: 'IN' }, + }, + 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: { + tax: 2, + total: 27.5, + coupon: 'hasbros', + revenue: 48, + price: 25, + quantity: 2, + currency: 'USD', + discount: 2.5, + order_id: '50314b8e9bcf000000000000', + requestIP: '123.0.0.0', + numOfItems: 2, + 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', + }, + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + integrations: { All: true }, + }, + destination: { + ID: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', + Name: 'PINTEREST_TAG', + Config: { + sendAsTestEvent: false, + tagId: '123456789', + advertiserId: '', + appId: '429047995', + sendingUnHashedData: true, + enableDeduplication: true, + deduplicationKey: 'messageId', + enhancedMatch: true, + customProperties: [{ properties: 'presentclass' }, { properties: 'presentgrade' }], + eventsMapping: [{ from: 'ABC Searched', to: 'WatchVideo' }], + }, + Enabled: true, + Transformations: [], + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + error: 'Advertiser Id not found. Aborting', + statTags: { + destType: 'PINTEREST_TAG', + errorCategory: 'dataValidation', + errorType: 'configuration', + feature: 'processor', + implementation: 'native', + module: 'destination', + }, + statusCode: 400, + }, + ], + }, + }, + }, + { + name: 'pinterest_tag', + description: 'Test 7', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + type: 'group', + event: 'ABC Searched', + sentAt: '2020-08-14T05:30:30.118Z', + context: { + source: 'test', + userAgent: 'chrome', + traits: { + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + email: 'abc@gmail.com', + phone: '+1234589947', + ge: 'male', + db: '19950715', + lastname: 'Rudderlabs', + firstName: 'Test', + address: { city: 'Kolkata', state: 'WB', zip: '700114', country: 'IN' }, + }, + 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: { + tax: 2, + total: 27.5, + coupon: 'hasbros', + revenue: 48, + price: 25, + quantity: 2, + currency: 'USD', + discount: 2.5, + order_id: '50314b8e9bcf000000000000', + requestIP: '123.0.0.0', + numOfItems: 2, + 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', + }, + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + integrations: { All: true }, + }, + destination: { + ID: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', + Name: 'PINTEREST_TAG', + Config: { + sendAsTestEvent: false, + tagId: '123456789', + advertiserId: '123456', + appId: '429047995', + enhancedMatch: true, + sendingUnHashedData: true, + enableDeduplication: true, + deduplicationKey: 'messageId', + customProperties: [{ properties: 'presentclass' }, { properties: 'presentgrade' }], + eventsMapping: [{ from: 'ABC Searched', to: 'WatchVideo' }], + }, + Enabled: true, + Transformations: [], + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + error: 'message type group is not supported', + statTags: { + destType: 'PINTEREST_TAG', + errorCategory: 'dataValidation', + errorType: 'instrumentation', + feature: 'processor', + implementation: 'native', + module: 'destination', + }, + statusCode: 400, + }, + ], + }, + }, + }, + { + name: 'pinterest_tag', + description: 'Test 8', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + type: 'track', + event: 'ABC Searched', + channel: 'abc', + sentAt: '2020-08-14T05:30:30.118Z', + context: { + source: 'test', + userAgent: 'chrome', + traits: { + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + email: 'abc@gmail.com', + phone: '+1234589947', + ge: 'male', + db: '19950715', + lastname: 'Rudderlabs', + firstName: 'Test', + address: { city: 'Kolkata', state: 'WB', zip: '700114', country: 'IN' }, + }, + 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: { + tax: 2, + total: 27.5, + coupon: 'hasbros', + revenue: 48, + price: 25, + quantity: 2, + currency: 'USD', + discount: 2.5, + order_id: '50314b8e9bcf000000000000', + requestIP: '123.0.0.0', + numOfItems: 2, + 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', + }, + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + integrations: { All: true }, + }, + destination: { + ID: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', + Name: 'PINTEREST_TAG', + Config: { + sendAsTestEvent: false, + tagId: '123456789', + advertiserId: '123456', + appId: '429047995', + sendingUnHashedData: true, + enableDeduplication: true, + deduplicationKey: 'messageId', + enhancedMatch: true, + customProperties: [{ properties: 'presentclass' }, { properties: 'presentgrade' }], + eventsMapping: [{ from: 'ABC Searched', to: 'WatchVideo' }], + }, + Enabled: true, + Transformations: [], + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + error: 'Action source must be one of app_android, app_ios, web, offline', + statTags: { + destType: 'PINTEREST_TAG', + errorCategory: 'dataValidation', + errorType: 'instrumentation', + feature: 'processor', + implementation: 'native', + module: 'destination', + }, + statusCode: 400, + }, + ], + }, + }, + }, + { + name: 'pinterest_tag', + description: 'Test 9', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + type: 'track', + event: 'custom event', + channel: 'web', + sentAt: '2020-08-14T05:30:30.118Z', + context: { + source: 'test', + userAgent: 'chrome', + traits: { + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + email: 'abc@gmail.com', + phone: '+1234589947', + ge: 'male', + db: '19950715', + lastname: 'Rudderlabs', + firstName: 'Test', + address: { city: 'Kolkata', state: 'WB', zip: '700114', country: 'IN' }, + }, + 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: { + tax: 2, + total: 27.5, + coupon: 'hasbros', + revenue: 48, + price: 25, + quantity: 2, + currency: 'USD', + discount: 2.5, + order_id: '50314b8e9bcf000000000000', + requestIP: '123.0.0.0', + numOfItems: 2, + 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', + }, + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + integrations: { All: true }, + }, + destination: { + ID: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', + Name: 'PINTEREST_TAG', + Config: { + sendAsTestEvent: false, + tagId: '123456789', + advertiserId: '123456', + appId: '429047995', + sendingUnHashedData: true, + enableDeduplication: true, + deduplicationKey: 'messageId', + enhancedMatch: true, + sendAsCustomEvent: true, + customProperties: [{ properties: 'presentclass' }, { properties: 'presentgrade' }], + eventsMapping: [{ from: 'ABC Searched', to: 'WatchVideo' }], + }, + Enabled: true, + Transformations: [], + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://ct.pinterest.com/events/v3', + headers: { 'Content-Type': 'application/json' }, + params: {}, + body: { + JSON: { + event_name: 'custom', + event_time: 1597383030, + event_id: '7208bbb6-2c4e-45bb-bf5b-ad426f3593e9', + app_id: '429047995', + action_source: 'web', + advertiser_id: '123456', + user_data: { + em: ['48ddb93f0b30c475423fe177832912c5bcdce3cc72872f8051627967ef278e08'], + ph: ['d164bbe036663cb5c96835e9ccc6501e9a521127ea62f6359744928ba932413b'], + ln: ['dcf000c2386fb76d22cefc0d118a8511bb75999019cd373df52044bccd1bd251'], + fn: ['9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08'], + ct: ['6689106ca7922c30b2fd2c175c85bc7fc2d52cc4941bdd7bb622c6cdc6284a85'], + st: ['3b45022ab36728cdae12e709e945bba267c50ee8a91e6e4388539a8e03a3fdcd'], + zp: ['1a4292e00780e18d00e76fde9850aee5344e939ba593333cd5e4b4aa2cd33b0c'], + country: ['582967534d0f909d196b97f9e6921342777aea87b46fa52df165389db1fb8ccf'], + hashed_maids: [ + '6ca13d52ca70c883e0f0bb101e425a89e8624de51db2d2392593af6a84118090', + ], + client_user_agent: 'chrome', + }, + custom_data: { + currency: 'USD', + value: '27.5', + num_items: 2, + order_id: '50314b8e9bcf000000000000', + content_ids: ['507f1f77bcf86cd799439011', '505bd76785ebb509fc183733'], + contents: [ + { quantity: 1, item_price: '19' }, + { quantity: 2, item_price: '3' }, + ], + }, + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'pinterest_tag', + description: 'Test 10', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + type: 'page', + name: 'ApplicationLoaded', + channel: 'web', + sentAt: '2020-08-14T05:30:30.118Z', + context: { + source: 'test', + userAgent: 'chrome', + traits: { + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + email: 'abc@gmail.com', + phone: '+1234589947', + ge: 'male', + db: '19950715', + lastname: 'Rudderlabs', + firstName: 'Test', + address: { city: 'Kolkata', state: 'WB', zip: '700114', country: 'IN' }, + }, + 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: { path: '', referrer: '', search: '', title: '', url: '' }, + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + integrations: { All: true }, + }, + destination: { + ID: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', + Name: 'PINTEREST_TAG', + Config: { + sendAsTestEvent: false, + tagId: '123456789', + advertiserId: '123456', + appId: '429047995', + sendingUnHashedData: true, + enableDeduplication: true, + deduplicationKey: 'messageId', + enhancedMatch: true, + customProperties: [{ properties: 'presentclass' }, { properties: 'presentgrade' }], + eventsMapping: [{ from: 'ABC Searched', to: 'WatchVideo' }], + }, + Enabled: true, + Transformations: [], + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://ct.pinterest.com/events/v3', + headers: { 'Content-Type': 'application/json' }, + params: {}, + body: { + JSON: { + event_time: 1597383030, + event_id: '7208bbb6-2c4e-45bb-bf5b-ad426f3593e9', + action_source: 'web', + event_name: 'page_visit', + app_id: '429047995', + advertiser_id: '123456', + user_data: { + em: ['48ddb93f0b30c475423fe177832912c5bcdce3cc72872f8051627967ef278e08'], + ph: ['d164bbe036663cb5c96835e9ccc6501e9a521127ea62f6359744928ba932413b'], + ln: ['dcf000c2386fb76d22cefc0d118a8511bb75999019cd373df52044bccd1bd251'], + fn: ['9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08'], + ct: ['6689106ca7922c30b2fd2c175c85bc7fc2d52cc4941bdd7bb622c6cdc6284a85'], + st: ['3b45022ab36728cdae12e709e945bba267c50ee8a91e6e4388539a8e03a3fdcd'], + zp: ['1a4292e00780e18d00e76fde9850aee5344e939ba593333cd5e4b4aa2cd33b0c'], + country: ['582967534d0f909d196b97f9e6921342777aea87b46fa52df165389db1fb8ccf'], + hashed_maids: [ + '6ca13d52ca70c883e0f0bb101e425a89e8624de51db2d2392593af6a84118090', + ], + client_user_agent: 'chrome', + }, + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'pinterest_tag', + description: 'Test 11', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + type: 'page', + name: 'ApplicationLoaded', + category: 'test category', + channel: 'web', + sentAt: '2020-08-14T05:30:30.118Z', + context: { + source: 'test', + userAgent: 'chrome', + traits: { + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + email: 'abc@gmail.com', + phone: '+1234589947', + ge: 'male', + db: '19950715', + lastname: 'Rudderlabs', + firstName: 'Test', + address: { city: 'Kolkata', state: 'WB', zip: '700114', country: 'IN' }, + }, + 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: { path: '', referrer: '', search: '', title: '', url: '' }, + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + integrations: { All: true }, + }, + destination: { + ID: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', + Name: 'PINTEREST_TAG', + Config: { + sendAsTestEvent: false, + tagId: '123456789', + advertiserId: '123456', + appId: '429047995', + sendingUnHashedData: true, + enableDeduplication: true, + deduplicationKey: 'messageId', + enhancedMatch: true, + customProperties: [{ properties: 'presentclass' }, { properties: 'presentgrade' }], + eventsMapping: [{ from: 'ABC Searched', to: 'WatchVideo' }], + }, + Enabled: true, + Transformations: [], + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://ct.pinterest.com/events/v3', + headers: { 'Content-Type': 'application/json' }, + params: {}, + body: { + JSON: { + event_time: 1597383030, + event_id: '7208bbb6-2c4e-45bb-bf5b-ad426f3593e9', + action_source: 'web', + event_name: 'view_category', + app_id: '429047995', + advertiser_id: '123456', + user_data: { + em: ['48ddb93f0b30c475423fe177832912c5bcdce3cc72872f8051627967ef278e08'], + ph: ['d164bbe036663cb5c96835e9ccc6501e9a521127ea62f6359744928ba932413b'], + ln: ['dcf000c2386fb76d22cefc0d118a8511bb75999019cd373df52044bccd1bd251'], + fn: ['9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08'], + ct: ['6689106ca7922c30b2fd2c175c85bc7fc2d52cc4941bdd7bb622c6cdc6284a85'], + st: ['3b45022ab36728cdae12e709e945bba267c50ee8a91e6e4388539a8e03a3fdcd'], + zp: ['1a4292e00780e18d00e76fde9850aee5344e939ba593333cd5e4b4aa2cd33b0c'], + country: ['582967534d0f909d196b97f9e6921342777aea87b46fa52df165389db1fb8ccf'], + hashed_maids: [ + '6ca13d52ca70c883e0f0bb101e425a89e8624de51db2d2392593af6a84118090', + ], + client_user_agent: 'chrome', + }, + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'pinterest_tag', + description: 'Test 12', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + type: 'page', + name: 'ApplicationLoaded', + category: 'test category', + channel: 'web', + sentAt: '2020-08-14T05:30:30.118Z', + context: { + source: 'test', + userAgent: 'chrome', + traits: { + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + email: 'abc@gmail.com', + phone: '+1234589947', + ge: 'male', + db: '19950715', + lastname: 'Rudderlabs', + firstName: 'Test', + address: { city: 'Kolkata', state: 'WB', zip: '700114', country: 'IN' }, + }, + device: { advertisingId: 'abc123', adTrackingEnabled: true }, + library: { name: 'rudder-sdk-ruby-sync', version: '1.0.6' }, + }, + messageId: '7208bbb6-2c4e-45bb-bf5b-ad426f3593e9', + timestamp: '2020-08-14T05:30:30.118Z', + properties: { path: '', referrer: '', search: '', title: '', url: '' }, + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + integrations: { All: true }, + }, + destination: { + ID: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', + Name: 'PINTEREST_TAG', + Config: { + sendAsTestEvent: false, + tagId: '123456789', + advertiserId: '123456', + appId: '429047995', + sendingUnHashedData: true, + enableDeduplication: true, + deduplicationKey: 'messageId', + enhancedMatch: true, + customProperties: [{ properties: 'presentclass' }, { properties: 'presentgrade' }], + eventsMapping: [{ from: 'ABC Searched', to: 'WatchVideo' }], + }, + Enabled: true, + Transformations: [], + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://ct.pinterest.com/events/v3', + headers: { 'Content-Type': 'application/json' }, + params: {}, + body: { + JSON: { + event_time: 1597383030, + opt_out: false, + event_id: '7208bbb6-2c4e-45bb-bf5b-ad426f3593e9', + action_source: 'web', + event_name: 'view_category', + app_id: '429047995', + advertiser_id: '123456', + user_data: { + em: ['48ddb93f0b30c475423fe177832912c5bcdce3cc72872f8051627967ef278e08'], + ph: ['d164bbe036663cb5c96835e9ccc6501e9a521127ea62f6359744928ba932413b'], + ln: ['dcf000c2386fb76d22cefc0d118a8511bb75999019cd373df52044bccd1bd251'], + fn: ['9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08'], + ct: ['6689106ca7922c30b2fd2c175c85bc7fc2d52cc4941bdd7bb622c6cdc6284a85'], + st: ['3b45022ab36728cdae12e709e945bba267c50ee8a91e6e4388539a8e03a3fdcd'], + zp: ['1a4292e00780e18d00e76fde9850aee5344e939ba593333cd5e4b4aa2cd33b0c'], + country: ['582967534d0f909d196b97f9e6921342777aea87b46fa52df165389db1fb8ccf'], + hashed_maids: [ + '6ca13d52ca70c883e0f0bb101e425a89e8624de51db2d2392593af6a84118090', + ], + client_user_agent: 'chrome', + }, + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'pinterest_tag', + description: 'Test 13', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + type: 'page', + name: 'ApplicationLoaded', + category: 'test category', + channel: 'web', + sentAt: '2020-08-14T05:30:30.118Z', + context: { + source: 'test', + userAgent: 'chrome', + ip: '127.0.0.0', + traits: { + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + phone: '+1234589947', + ge: 'male', + db: '19950715', + lastname: 'Rudderlabs', + firstName: 'Test', + address: { city: 'Kolkata', state: 'WB', zip: '700114', country: 'IN' }, + }, + device: { adTrackingEnabled: false }, + library: { name: 'rudder-sdk-ruby-sync', version: '1.0.6' }, + }, + messageId: '7208bbb6-2c4e-45bb-bf5b-ad426f3593e9', + timestamp: '2020-08-14T05:30:30.118Z', + properties: { path: '', referrer: '', search: '', title: '', url: '' }, + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + integrations: { All: true }, + }, + destination: { + ID: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', + Name: 'PINTEREST_TAG', + Config: { + sendAsTestEvent: false, + tagId: '123456789', + advertiserId: '123456', + appId: '429047995', + sendingUnHashedData: true, + enableDeduplication: true, + deduplicationKey: 'messageId', + enhancedMatch: true, + customProperties: [{ properties: 'presentclass' }, { properties: 'presentgrade' }], + eventsMapping: [{ from: 'ABC Searched', to: 'WatchVideo' }], + }, + Enabled: true, + Transformations: [], + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://ct.pinterest.com/events/v3', + headers: { 'Content-Type': 'application/json' }, + params: {}, + body: { + JSON: { + event_time: 1597383030, + opt_out: true, + event_id: '7208bbb6-2c4e-45bb-bf5b-ad426f3593e9', + action_source: 'web', + event_name: 'view_category', + app_id: '429047995', + advertiser_id: '123456', + user_data: { + ph: ['d164bbe036663cb5c96835e9ccc6501e9a521127ea62f6359744928ba932413b'], + ln: ['dcf000c2386fb76d22cefc0d118a8511bb75999019cd373df52044bccd1bd251'], + fn: ['9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08'], + ct: ['6689106ca7922c30b2fd2c175c85bc7fc2d52cc4941bdd7bb622c6cdc6284a85'], + st: ['3b45022ab36728cdae12e709e945bba267c50ee8a91e6e4388539a8e03a3fdcd'], + zp: ['1a4292e00780e18d00e76fde9850aee5344e939ba593333cd5e4b4aa2cd33b0c'], + country: ['582967534d0f909d196b97f9e6921342777aea87b46fa52df165389db1fb8ccf'], + client_ip_address: '127.0.0.0', + client_user_agent: 'chrome', + }, + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'pinterest_tag', + description: 'Test 14', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + type: 'page', + name: 'ApplicationLoaded', + category: 'test category', + channel: 'web', + sentAt: '2020-08-14T05:30:30.118Z', + context: { + source: 'test', + userAgent: 'chrome', + requestIP: '127.0.0.0', + traits: { + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + phone: 'Hashed phone', + gender: 'Hashed Gender', + dob: 'Hashed DB', + lastname: 'Hashed Lastname', + firstName: 'Hashed FirstName', + address: { + city: 'Hashed City', + state: 'Hashed State', + zip: 'Hashed Zip', + country: 'Hashed country', + }, + }, + device: { adTrackingEnabled: false, advertisingId: 'Hashed maids' }, + library: { name: 'rudder-sdk-ruby-sync', version: '1.0.6' }, + }, + messageId: '7208bbb6-2c4e-45bb-bf5b-ad426f3593e9', + timestamp: '2020-08-14T05:30:30.118Z', + properties: { path: '', referrer: '', search: '', title: '', url: '' }, + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + }, + destination: { + ID: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', + Name: 'PINTEREST_TAG', + Config: { + sendAsTestEvent: false, + tagId: '123456789', + advertiserId: '123456', + appId: '429047995', + sendingUnHashedData: false, + enhancedMatch: true, + customProperties: [{ properties: 'presentclass' }, { properties: 'presentgrade' }], + eventsMapping: [{ from: 'ABC Searched', to: 'WatchVideo' }], + }, + Enabled: true, + Transformations: [], + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://ct.pinterest.com/events/v3', + headers: { 'Content-Type': 'application/json' }, + params: {}, + body: { + JSON: { + event_time: 1597383030, + action_source: 'web', + opt_out: true, + event_name: 'view_category', + app_id: '429047995', + advertiser_id: '123456', + event_id: '7208bbb6-2c4e-45bb-bf5b-ad426f3593e9', + user_data: { + ph: ['Hashed phone'], + db: ['Hashed DB'], + ln: ['Hashed Lastname'], + fn: ['Hashed FirstName'], + ct: ['Hashed City'], + st: ['Hashed State'], + zp: ['Hashed Zip'], + country: ['Hashed country'], + hashed_maids: ['Hashed maids'], + ge: ['Hashed Gender'], + client_user_agent: 'chrome', + }, + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'pinterest_tag', + description: 'Test 15', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + type: 'page', + name: 'ApplicationLoaded', + category: 'test category', + channel: 'web', + sentAt: '2020-08-14T05:30:30.118Z', + context: { + source: 'test', + userAgent: 'chrome', + requestIP: '127.0.0.0', + traits: { + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + phone: ['Hashed phone', 'Hashed phone1'], + gender: ['Hashed Gender', 'Hashed Gender1'], + dob: ['Hashed DB', 'Hashed DB1'], + lastname: ['Hashed Lastname', 'Hashed Lastname1'], + firstName: ['Hashed FirstName', 'Hashed FirstName1'], + address: { + city: ['Hashed City', 'Hashed City1'], + state: ['Hashed State', 'Hashed State1'], + zip: ['Hashed Zip', 'Hashed Zip1'], + country: ['Hashed country', 'Hashed country1'], + }, + }, + device: { adTrackingEnabled: false, advertisingId: 'Hashed maids' }, + library: { name: 'rudder-sdk-ruby-sync', version: '1.0.6' }, + }, + messageId: '7208bbb6-2c4e-45bb-bf5b-ad426f3593e9', + timestamp: '2020-08-14T05:30:30.118Z', + properties: { path: '', referrer: '', search: '', title: '', url: '' }, + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + }, + destination: { + ID: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', + Name: 'PINTEREST_TAG', + Config: { + sendAsTestEvent: false, + tagId: '123456789', + advertiserId: '123456', + appId: '429047995', + sendingUnHashedData: false, + enhancedMatch: true, + customProperties: [{ properties: 'presentclass' }, { properties: 'presentgrade' }], + eventsMapping: [{ from: 'ABC Searched', to: 'WatchVideo' }], + }, + Enabled: true, + Transformations: [], + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://ct.pinterest.com/events/v3', + headers: { 'Content-Type': 'application/json' }, + params: {}, + body: { + JSON: { + event_time: 1597383030, + action_source: 'web', + opt_out: true, + event_name: 'view_category', + app_id: '429047995', + advertiser_id: '123456', + event_id: '7208bbb6-2c4e-45bb-bf5b-ad426f3593e9', + user_data: { + ph: ['Hashed phone', 'Hashed phone1'], + db: ['Hashed DB', 'Hashed DB1'], + ln: ['Hashed Lastname', 'Hashed Lastname1'], + fn: ['Hashed FirstName', 'Hashed FirstName1'], + ct: ['Hashed City', 'Hashed City1'], + st: ['Hashed State', 'Hashed State1'], + zp: ['Hashed Zip', 'Hashed Zip1'], + country: ['Hashed country', 'Hashed country1'], + hashed_maids: ['Hashed maids'], + ge: ['Hashed Gender', 'Hashed Gender1'], + client_user_agent: 'chrome', + }, + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'pinterest_tag', + description: 'Test 16', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + name: 'Test Tool', + type: 'page', + sentAt: '2023-02-01T00:00:00.379Z', + userId: '', + channel: 'web', + context: { + os: { name: '', version: '' }, + app: { + name: 'RudderLabs JavaScript SDK', + version: '2.22.3', + namespace: 'com.rudderlabs.javascript', + }, + page: { + url: 'https://www.abc.com/s598907', + path: '/test-path/s598907', + title: 'Test Tool + Reviews | Rudderstack', + search: '', + tab_url: 'https://www.abc.com/s598907', + referrer: '$direct', + initial_referrer: '$direct', + referring_domain: '', + initial_referring_domain: '', + }, + locale: 'en-US', + screen: { + width: 1024, + height: 1024, + density: 1, + innerWidth: 1024, + innerHeight: 1024, + }, + traits: {}, + library: { name: 'RudderLabs JavaScript SDK', version: '2.22.3' }, + campaign: {}, + doNotSell: false, + sessionId: 1675209600203, + userAgent: + 'Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; Googlebot/2.1; +http://www.google.com/bot.html) Chrome/109.0.5414.101 Safari/537.36', + gaClientId: { + integrations: { + 'Google Ads': { gclid: '' }, + 'Google Analytics': { clientId: '1518934611.1234569600' }, + }, + }, + sessionStart: true, + }, + rudderId: '7291a10f-e7dd-49f9-94ce-0154f53897y6', + messageId: '1c77a616-13a7-4a2e-a8e7-e1a0971897y6', + timestamp: '2023-02-01T12:47:30.030Z', + properties: { + sku: '45790-32', + url: 'https://www.abc.com/23rty', + name: 'Test Tool', + path: '/test-path/tool', + email: '', + title: 'Test Tool + Reviews | Rudderstack', + review: { reviewCount: 2, averageReview: 5, reviewContentID: ['238300132'] }, + search: '', + tab_url: 'https://www.abc/com', + pageInfo: { + pageId: 's592897', + category: { + pageType: 'product', + subCategory: 'Dining & Kitchen Furniture', + pageTemplate: 'product detail grouper', + primaryCategory: 'Furniture', + }, + brandType: 'new brand', + }, + referrer: '', + subCategory: 'Dining & Kitchen Furniture', + primaryCategory: 'Furniture', + initial_referrer: '$direct', + referring_domain: '', + initial_referring_domain: '', + }, + receivedAt: '2023-02-01T12:47:30.038Z', + request_ip: '66.249.72.218', + anonymousId: 'a61c77a6-1613-474a-aee8-e7e1a0971047', + integrations: { All: true }, + originalTimestamp: '2023-02-01T00:00:00.371Z', + }, + destination: { + ID: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', + Name: 'PINTEREST_TAG', + Config: { + sendAsTestEvent: false, + tagId: '123456789', + advertiserId: '123478671210', + sendingUnHashedData: false, + enableDeduplication: false, + eventsMapping: [ + { from: 'Product Added', to: 'AddToCart' }, + { from: 'Order Completed', to: 'Checkout' }, + { from: 'Product Viewed', to: 'PageVisit' }, + { from: 'Lead', to: 'Lead' }, + { from: 'Signup', to: 'Signup' }, + ], + enhancedMatch: true, + }, + Enabled: true, + Transformations: [], + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + body: { + JSON: { + event_time: 1675255650, + event_source_url: 'https://www.abc.com/s598907', + action_source: 'web', + app_name: 'RudderLabs JavaScript SDK', + app_version: '2.22.3', + language: 'en-US', + event_id: '1c77a616-13a7-4a2e-a8e7-e1a0971897y6', + advertiser_id: '123478671210', + user_data: { + client_ip_address: '66.249.72.218', + client_user_agent: + 'Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; Googlebot/2.1; +http://www.google.com/bot.html) Chrome/109.0.5414.101 Safari/537.36', + }, + event_name: 'page_visit', + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://ct.pinterest.com/events/v3', + headers: { 'Content-Type': 'application/json' }, + params: {}, + files: {}, + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'pinterest_tag', + description: 'Test 17', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + type: 'track', + event: 'test', + channel: 'web', + sentAt: '2020-08-14T05:30:30.118Z', + context: { + source: 'test', + userAgent: 'chrome', + traits: { + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + email: 'abc@gmail.com', + phone: '+1234589947', + ge: 'male', + db: '19950715', + lastname: 'Rudderlabs', + firstName: 'Test', + address: { city: 'Kolkata', state: 'WB', zip: '700114', country: 'IN' }, + }, + 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: { + sku: '1234', + tax: 2, + total: 27.5, + coupon: 'hasbros', + revenue: 48, + currency: 'USD', + discount: 2.5, + order_id: '50314b8e9bcf000000000000', + requestIP: '123.0.0.0', + shipping: 3, + subtotal: 22.5, + affiliation: 'Google Store', + checkout_id: 'fksdjfsdjfisjf9sdfjsd9f', + }, + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + integrations: { All: true }, + }, + destination: { + ID: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', + Name: 'PINTEREST_TAG', + Config: { + sendAsTestEvent: false, + tagId: '123456789', + advertiserId: '123456', + appId: '429047995', + sendingUnHashedData: true, + enableDeduplication: true, + deduplicationKey: 'messageId', + enhancedMatch: true, + sendAsCustomEvent: true, + customProperties: [{ properties: 'presentclass' }, { properties: 'presentgrade' }], + eventsMapping: [{ from: 'ABC Searched', to: 'WatchVideo' }], + }, + Enabled: true, + Transformations: [], + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://ct.pinterest.com/events/v3', + headers: { 'Content-Type': 'application/json' }, + params: {}, + body: { + JSON: { + event_name: 'custom', + event_time: 1597383030, + action_source: 'web', + event_id: '7208bbb6-2c4e-45bb-bf5b-ad426f3593e9', + app_id: '429047995', + advertiser_id: '123456', + user_data: { + em: ['48ddb93f0b30c475423fe177832912c5bcdce3cc72872f8051627967ef278e08'], + ph: ['d164bbe036663cb5c96835e9ccc6501e9a521127ea62f6359744928ba932413b'], + ln: ['dcf000c2386fb76d22cefc0d118a8511bb75999019cd373df52044bccd1bd251'], + fn: ['9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08'], + ct: ['6689106ca7922c30b2fd2c175c85bc7fc2d52cc4941bdd7bb622c6cdc6284a85'], + st: ['3b45022ab36728cdae12e709e945bba267c50ee8a91e6e4388539a8e03a3fdcd'], + zp: ['1a4292e00780e18d00e76fde9850aee5344e939ba593333cd5e4b4aa2cd33b0c'], + country: ['582967534d0f909d196b97f9e6921342777aea87b46fa52df165389db1fb8ccf'], + hashed_maids: [ + '6ca13d52ca70c883e0f0bb101e425a89e8624de51db2d2392593af6a84118090', + ], + client_user_agent: 'chrome', + }, + custom_data: { + currency: 'USD', + value: '27.5', + order_id: '50314b8e9bcf000000000000', + num_items: 0, + content_ids: ['1234'], + contents: [{ quantity: 1, item_price: 'undefined' }], + }, + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'pinterest_tag', + description: 'Test 18', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + type: 'track', + event: 'custom event', + channel: 'web', + sentAt: '2020-08-14T05:30:30.118Z', + context: { + source: 'test', + userAgent: 'chrome', + traits: { + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + email: 'abc@gmail.com', + phone: '+1234589947', + ge: 'male', + db: '19950715', + lastname: 'Rudderlabs', + firstName: 'Test', + address: { city: 'Kolkata', state: 'WB', zip: '700114', country: 'IN' }, + }, + 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: { + sku: '1234', + tax: 2, + total: 27.5, + coupon: 'hasbros', + revenue: 48, + currency: 'USD', + discount: 2.5, + order_id: '50314b8e9bcf000000000000', + requestIP: '123.0.0.0', + shipping: 3, + subtotal: 22.5, + affiliation: 'Google Store', + checkout_id: 'fksdjfsdjfisjf9sdfjsd9f', + 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', + }, + ], + }, + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + integrations: { All: true }, + }, + destination: { + ID: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', + Name: 'PINTEREST_TAG', + Config: { + sendAsTestEvent: false, + tagId: '123456789', + advertiserId: '123456', + appId: '429047995', + sendingUnHashedData: true, + enableDeduplication: true, + deduplicationKey: 'messageId', + enhancedMatch: true, + sendAsCustomEvent: true, + customProperties: [{ properties: 'presentclass' }, { properties: 'presentgrade' }], + eventsMapping: [{ from: 'ABC Searched', to: 'WatchVideo' }], + }, + Enabled: true, + Transformations: [], + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://ct.pinterest.com/events/v3', + headers: { 'Content-Type': 'application/json' }, + params: {}, + body: { + JSON: { + event_name: 'custom', + event_time: 1597383030, + action_source: 'web', + event_id: '7208bbb6-2c4e-45bb-bf5b-ad426f3593e9', + app_id: '429047995', + advertiser_id: '123456', + user_data: { + em: ['48ddb93f0b30c475423fe177832912c5bcdce3cc72872f8051627967ef278e08'], + ph: ['d164bbe036663cb5c96835e9ccc6501e9a521127ea62f6359744928ba932413b'], + ln: ['dcf000c2386fb76d22cefc0d118a8511bb75999019cd373df52044bccd1bd251'], + fn: ['9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08'], + ct: ['6689106ca7922c30b2fd2c175c85bc7fc2d52cc4941bdd7bb622c6cdc6284a85'], + st: ['3b45022ab36728cdae12e709e945bba267c50ee8a91e6e4388539a8e03a3fdcd'], + zp: ['1a4292e00780e18d00e76fde9850aee5344e939ba593333cd5e4b4aa2cd33b0c'], + country: ['582967534d0f909d196b97f9e6921342777aea87b46fa52df165389db1fb8ccf'], + hashed_maids: [ + '6ca13d52ca70c883e0f0bb101e425a89e8624de51db2d2392593af6a84118090', + ], + client_user_agent: 'chrome', + }, + custom_data: { + currency: 'USD', + value: '27.5', + order_id: '50314b8e9bcf000000000000', + num_items: 1, + content_ids: ['507f1f77bcf86cd799439011'], + contents: [{ quantity: 1, item_price: '19' }], + }, + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'pinterest_tag', + description: 'Test 19', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + type: 'track', + event: 'custom event', + channel: 'web', + sentAt: '2020-08-14T05:30:30.118Z', + context: { + source: 'test', + userAgent: 'chrome', + traits: { + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + email: 'abc@gmail.com', + phone: '+1234589947', + ge: 'male', + db: '19950715', + lastname: 'Rudderlabs', + firstName: 'Test', + address: { city: 'Kolkata', state: 'WB', zip: '700114', country: 'IN' }, + }, + 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: { + tax: 2, + total: 27.5, + coupon: 'hasbros', + revenue: 48, + currency: 'USD', + discount: 2.5, + order_id: '50314b8e9bcf000000000000', + requestIP: '123.0.0.0', + shipping: 3, + subtotal: 22.5, + affiliation: 'Google Store', + checkout_id: 'fksdjfsdjfisjf9sdfjsd9f', + }, + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + integrations: { All: true }, + }, + destination: { + ID: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', + Name: 'PINTEREST_TAG', + Config: { + sendAsTestEvent: false, + tagId: '123456789', + advertiserId: '123456', + appId: '429047995', + sendingUnHashedData: true, + enableDeduplication: true, + deduplicationKey: 'messageId', + enhancedMatch: true, + customProperties: [{ properties: 'presentclass' }, { properties: 'presentgrade' }], + eventsMapping: [{ from: 'ABC Searched', to: 'WatchVideo' }], + }, + Enabled: true, + Transformations: [], + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + body: { + FORM: {}, + JSON: { + action_source: 'web', + advertiser_id: '123456', + app_id: '429047995', + custom_data: { + contents: [{ item_price: 'undefined', quantity: 1 }], + currency: 'USD', + num_items: 0, + order_id: '50314b8e9bcf000000000000', + value: '27.5', + }, + event_id: '7208bbb6-2c4e-45bb-bf5b-ad426f3593e9', + event_name: 'custom event', + event_time: 1597383030, + user_data: { + client_user_agent: 'chrome', + country: ['582967534d0f909d196b97f9e6921342777aea87b46fa52df165389db1fb8ccf'], + ct: ['6689106ca7922c30b2fd2c175c85bc7fc2d52cc4941bdd7bb622c6cdc6284a85'], + em: ['48ddb93f0b30c475423fe177832912c5bcdce3cc72872f8051627967ef278e08'], + fn: ['9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08'], + hashed_maids: [ + '6ca13d52ca70c883e0f0bb101e425a89e8624de51db2d2392593af6a84118090', + ], + ln: ['dcf000c2386fb76d22cefc0d118a8511bb75999019cd373df52044bccd1bd251'], + ph: ['d164bbe036663cb5c96835e9ccc6501e9a521127ea62f6359744928ba932413b'], + st: ['3b45022ab36728cdae12e709e945bba267c50ee8a91e6e4388539a8e03a3fdcd'], + zp: ['1a4292e00780e18d00e76fde9850aee5344e939ba593333cd5e4b4aa2cd33b0c'], + }, + }, + JSON_ARRAY: {}, + XML: {}, + }, + endpoint: 'https://ct.pinterest.com/events/v3', + files: {}, + headers: { 'Content-Type': 'application/json' }, + method: 'POST', + params: {}, + type: 'REST', + version: '1', + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'pinterest_tag', + description: 'Test 20', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + description: 'Track call with v5 Api version and send external_id toggle enabled', + message: { + type: 'track', + event: 'ABC Searched', + sentAt: '2020-08-14T05:30:30.118Z', + channel: 'web', + context: { + source: 'test', + userAgent: 'chrome', + traits: { + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + email: 'abc@gmail.com', + phone: '+1234589947', + ge: 'male', + db: '19950715', + lastname: 'Rudderlabs', + firstName: 'Test', + address: { city: 'Kolkata', state: 'WB', zip: '700114', country: 'IN' }, + }, + 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: { + tax: 2, + total: 27.5, + coupon: 'hasbros', + revenue: 48, + price: 25, + quantity: 2, + currency: 'USD', + discount: 2.5, + order_id: '50314b8e9bcf000000000000', + requestIP: '123.0.0.0', + optOutType: 'LDP', + 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', + }, + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + integrations: { All: true }, + }, + destination: { + ID: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', + Name: 'PINTEREST_TAG', + Config: { + sendAsTestEvent: false, + tagId: '123456789', + apiVersion: 'newApi', + adAccountId: 'accountId123', + conversionToken: 'conversionToken123', + appId: '429047995', + enhancedMatch: true, + enableDeduplication: true, + deduplicationKey: 'messageId', + sendingUnHashedData: true, + sendExternalId: true, + customProperties: [{ properties: 'presentclass' }, { properties: 'presentgrade' }], + eventsMapping: [{ from: 'ABC Searched', to: 'WatchVideo' }], + }, + Enabled: true, + Transformations: [], + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://api.pinterest.com/v5/ad_accounts/accountId123/events', + headers: { + 'Content-Type': 'application/json', + Authorization: 'Bearer conversionToken123', + }, + params: {}, + body: { + JSON: { + action_source: 'web', + event_name: 'watch_video', + event_time: 1597383030, + event_id: '7208bbb6-2c4e-45bb-bf5b-ad426f3593e9', + app_id: '429047995', + user_data: { + em: ['48ddb93f0b30c475423fe177832912c5bcdce3cc72872f8051627967ef278e08'], + ph: ['d164bbe036663cb5c96835e9ccc6501e9a521127ea62f6359744928ba932413b'], + ln: ['dcf000c2386fb76d22cefc0d118a8511bb75999019cd373df52044bccd1bd251'], + fn: ['9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08'], + ct: ['6689106ca7922c30b2fd2c175c85bc7fc2d52cc4941bdd7bb622c6cdc6284a85'], + st: ['3b45022ab36728cdae12e709e945bba267c50ee8a91e6e4388539a8e03a3fdcd'], + zp: ['1a4292e00780e18d00e76fde9850aee5344e939ba593333cd5e4b4aa2cd33b0c'], + country: ['582967534d0f909d196b97f9e6921342777aea87b46fa52df165389db1fb8ccf'], + hashed_maids: [ + '6ca13d52ca70c883e0f0bb101e425a89e8624de51db2d2392593af6a84118090', + ], + client_user_agent: 'chrome', + external_id: [ + '3217d71a74c219d6e31e28267b313a7ceb6a2c032db1a091c9416b25b2ae2bc8', + ], + }, + custom_data: { + currency: 'USD', + value: '27.5', + order_id: '50314b8e9bcf000000000000', + opt_out_type: 'LDP', + num_items: 3, + content_ids: ['507f1f77bcf86cd799439011', '505bd76785ebb509fc183733'], + contents: [ + { quantity: 1, item_price: '19' }, + { quantity: 2, item_price: '3' }, + ], + }, + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'pinterest_tag', + description: 'Test 21', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + description: 'Custom event with v5 Api version', + message: { + type: 'track', + event: 'random', + sentAt: '2020-08-14T05:30:30.118Z', + channel: 'web', + context: { + source: 'test', + userAgent: 'chrome', + traits: { + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + email: 'abc@gmail.com', + phone: '+1234589947', + ge: 'male', + db: '19950715', + lastname: 'Rudderlabs', + firstName: 'Test', + address: { city: 'Kolkata', state: 'WB', zip: '700114', country: 'IN' }, + }, + 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: { + tax: 2, + total: 27.5, + coupon: 'hasbros', + revenue: 48, + price: 25, + quantity: 2, + currency: 'USD', + discount: 2.5, + order_id: '50314b8e9bcf000000000000', + requestIP: '123.0.0.0', + optOutType: 'LDP', + 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', + }, + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + integrations: { All: true }, + }, + destination: { + ID: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', + Name: 'PINTEREST_TAG', + Config: { + sendAsTestEvent: false, + tagId: '123456789', + apiVersion: 'newApi', + adAccountId: 'accountId123', + conversionToken: 'conversionToken123', + appId: '429047995', + enhancedMatch: true, + enableDeduplication: true, + deduplicationKey: 'messageId', + sendingUnHashedData: true, + sendAsCustomEvent: true, + customProperties: [{ properties: 'presentclass' }, { properties: 'presentgrade' }], + eventsMapping: [{ from: 'ABC Searched', to: 'WatchVideo' }], + }, + Enabled: true, + Transformations: [], + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://api.pinterest.com/v5/ad_accounts/accountId123/events', + headers: { + 'Content-Type': 'application/json', + Authorization: 'Bearer conversionToken123', + }, + params: {}, + body: { + JSON: { + action_source: 'web', + event_name: 'custom', + event_time: 1597383030, + event_id: '7208bbb6-2c4e-45bb-bf5b-ad426f3593e9', + app_id: '429047995', + user_data: { + em: ['48ddb93f0b30c475423fe177832912c5bcdce3cc72872f8051627967ef278e08'], + ph: ['d164bbe036663cb5c96835e9ccc6501e9a521127ea62f6359744928ba932413b'], + ln: ['dcf000c2386fb76d22cefc0d118a8511bb75999019cd373df52044bccd1bd251'], + fn: ['9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08'], + ct: ['6689106ca7922c30b2fd2c175c85bc7fc2d52cc4941bdd7bb622c6cdc6284a85'], + st: ['3b45022ab36728cdae12e709e945bba267c50ee8a91e6e4388539a8e03a3fdcd'], + zp: ['1a4292e00780e18d00e76fde9850aee5344e939ba593333cd5e4b4aa2cd33b0c'], + country: ['582967534d0f909d196b97f9e6921342777aea87b46fa52df165389db1fb8ccf'], + hashed_maids: [ + '6ca13d52ca70c883e0f0bb101e425a89e8624de51db2d2392593af6a84118090', + ], + client_user_agent: 'chrome', + }, + custom_data: { + currency: 'USD', + value: '27.5', + order_id: '50314b8e9bcf000000000000', + opt_out_type: 'LDP', + num_items: 3, + content_ids: ['507f1f77bcf86cd799439011', '505bd76785ebb509fc183733'], + contents: [ + { quantity: 1, item_price: '19' }, + { quantity: 2, item_price: '3' }, + ], + }, + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'pinterest_tag', + description: 'Test 22', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + description: + 'Custom event with v5 Api version, with unhashed User Data and the values are an array of strings', + message: { + type: 'track', + event: 'random', + sentAt: '2020-08-14T05:30:30.118Z', + channel: 'web', + context: { + source: 'test', + userAgent: 'chrome', + traits: { + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + email: ['abc@gmail.com', 'def@gmail.com'], + phone: ['+1234589947', '+1234589948'], + ge: ['male', 'male'], + db: ['19950715', '19970615'], + lastname: ['Rudderlabs', 'Xu'], + firstName: ['Test', 'Alex'], + address: { + city: ['Kolkata', 'Mumbai'], + state: ['WB', 'MH'], + zip: ['700114', '700115'], + country: ['IN', 'IN'], + }, + }, + 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: { + tax: 2, + total: 27.5, + coupon: 'hasbros', + revenue: 48, + price: 25, + quantity: 2, + currency: 'USD', + discount: 2.5, + order_id: '50314b8e9bcf000000000000', + requestIP: '123.0.0.0', + optOutType: 'LDP', + 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', + }, + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + integrations: { All: true }, + }, + destination: { + ID: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', + Name: 'PINTEREST_TAG', + Config: { + sendAsTestEvent: false, + tagId: '123456789', + apiVersion: 'newApi', + adAccountId: 'accountId123', + conversionToken: 'conversionToken123', + appId: '429047995', + enhancedMatch: true, + enableDeduplication: true, + deduplicationKey: 'messageId', + sendingUnHashedData: true, + sendAsCustomEvent: true, + customProperties: [{ properties: 'presentclass' }, { properties: 'presentgrade' }], + eventsMapping: [{ from: 'ABC Searched', to: 'WatchVideo' }], + }, + Enabled: true, + Transformations: [], + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://api.pinterest.com/v5/ad_accounts/accountId123/events', + headers: { + 'Content-Type': 'application/json', + Authorization: 'Bearer conversionToken123', + }, + params: {}, + body: { + JSON: { + action_source: 'web', + event_name: 'custom', + event_time: 1597383030, + event_id: '7208bbb6-2c4e-45bb-bf5b-ad426f3593e9', + app_id: '429047995', + user_data: { + em: [ + '48ddb93f0b30c475423fe177832912c5bcdce3cc72872f8051627967ef278e08', + 'c392e50ebeca7bea4405e9c545023451ac56620031f81263f681269bde14218b', + ], + ph: [ + 'd164bbe036663cb5c96835e9ccc6501e9a521127ea62f6359744928ba932413b', + '22bdde2594851294f2a6f4c34af704e68b398b03129ea9ceb58f0ffe33f6db52', + ], + ln: [ + 'dcf000c2386fb76d22cefc0d118a8511bb75999019cd373df52044bccd1bd251', + '9c2f138690fca4890c3c4a6691610fbbbdf32091cc001f7355cfdf574baa52b9', + ], + fn: [ + '9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08', + '4135aa9dc1b842a653dea846903ddb95bfb8c5a10c504a7fa16e10bc31d1fdf0', + ], + ct: [ + '6689106ca7922c30b2fd2c175c85bc7fc2d52cc4941bdd7bb622c6cdc6284a85', + 'd209bcc17778fd19fd2bc0c99a3868bf011da5162d3a75037a605768ebc276e2', + ], + st: [ + '3b45022ab36728cdae12e709e945bba267c50ee8a91e6e4388539a8e03a3fdcd', + '1b0316ed1cfed044035c55363e02ccafab26d66b1c2746b94d17285f043324aa', + ], + zp: [ + '1a4292e00780e18d00e76fde9850aee5344e939ba593333cd5e4b4aa2cd33b0c', + '4d6755aa1e85517191f06cc91448696c173e1195ae51f94a1670116ac7b5c47b', + ], + country: [ + '582967534d0f909d196b97f9e6921342777aea87b46fa52df165389db1fb8ccf', + '582967534d0f909d196b97f9e6921342777aea87b46fa52df165389db1fb8ccf', + ], + hashed_maids: [ + '6ca13d52ca70c883e0f0bb101e425a89e8624de51db2d2392593af6a84118090', + ], + client_user_agent: 'chrome', + }, + custom_data: { + currency: 'USD', + value: '27.5', + order_id: '50314b8e9bcf000000000000', + opt_out_type: 'LDP', + num_items: 3, + content_ids: ['507f1f77bcf86cd799439011', '505bd76785ebb509fc183733'], + contents: [ + { quantity: 1, item_price: '19' }, + { quantity: 2, item_price: '3' }, + ], + }, + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'pinterest_tag', + description: 'Test 23', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + description: 'Ad Account Id check in V5', + message: { + type: 'track', + event: 'random', + sentAt: '2020-08-14T05:30:30.118Z', + channel: 'web', + context: { + source: 'test', + userAgent: 'chrome', + traits: { + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + email: 'abc@gmail.com', + phone: '+1234589947', + ge: 'male', + db: '19950715', + lastname: 'Rudderlabs', + firstName: 'Test', + address: { city: 'Kolkata', state: 'WB', zip: '700114', country: 'IN' }, + }, + 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', + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + integrations: { All: true }, + }, + destination: { + ID: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', + Name: 'PINTEREST_TAG', + Config: { + sendAsTestEvent: false, + tagId: '123456789', + apiVersion: 'newApi', + adAccountId: '', + conversionToken: 'conversionToken123', + appId: '429047995', + enhancedMatch: true, + enableDeduplication: true, + deduplicationKey: 'messageId', + sendingUnHashedData: true, + sendAsCustomEvent: true, + customProperties: [{ properties: 'presentclass' }, { properties: 'presentgrade' }], + eventsMapping: [{ from: 'ABC Searched', to: 'WatchVideo' }], + }, + Enabled: true, + Transformations: [], + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + error: 'Ad Account ID not found. Aborting', + statTags: { + destType: 'PINTEREST_TAG', + errorCategory: 'dataValidation', + errorType: 'configuration', + feature: 'processor', + implementation: 'native', + module: 'destination', + }, + statusCode: 400, + }, + ], + }, + }, + }, + { + name: 'pinterest_tag', + description: 'Test 24', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + description: 'Conversion Token check in V5', + message: { + type: 'track', + event: 'random', + sentAt: '2020-08-14T05:30:30.118Z', + channel: 'web', + context: { + source: 'test', + userAgent: 'chrome', + traits: { + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + email: 'abc@gmail.com', + phone: '+1234589947', + ge: 'male', + db: '19950715', + lastname: 'Rudderlabs', + firstName: 'Test', + address: { city: 'Kolkata', state: 'WB', zip: '700114', country: 'IN' }, + }, + 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', + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + integrations: { All: true }, + }, + destination: { + ID: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', + Name: 'PINTEREST_TAG', + Config: { + sendAsTestEvent: false, + tagId: '123456789', + apiVersion: 'newApi', + adAccountId: 'accountId123', + conversionToken: '', + appId: '429047995', + enhancedMatch: true, + enableDeduplication: true, + deduplicationKey: 'messageId', + sendingUnHashedData: true, + sendAsCustomEvent: true, + customProperties: [{ properties: 'presentclass' }, { properties: 'presentgrade' }], + eventsMapping: [{ from: 'ABC Searched', to: 'WatchVideo' }], + }, + Enabled: true, + Transformations: [], + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + error: 'Conversion Token not found. Aborting', + statTags: { + destType: 'PINTEREST_TAG', + errorCategory: 'dataValidation', + errorType: 'configuration', + feature: 'processor', + implementation: 'native', + module: 'destination', + }, + statusCode: 400, + }, + ], + }, + }, + }, + { + name: 'pinterest_tag', + description: 'Test 25', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + type: 'track', + event: 'custom event', + channel: 'web', + sentAt: '2020-08-14T05:30:30.118Z', + context: { + source: 'test', + userAgent: 'chrome', + traits: { + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + email: 'abc@gmail.com', + phone: '+1234589947', + ge: 'male', + db: '19950715', + lastname: 'Rudderlabs', + firstName: 'Test', + address: { city: 'Kolkata', state: 'WB', zip: '700114', country: 'IN' }, + }, + 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: { + tax: 2, + total: 27.5, + coupon: 'hasbros', + revenue: 48, + currency: 'USD', + discount: 2.5, + order_id: '50314b8e9bcf000000000000', + requestIP: '123.0.0.0', + shipping: 3, + subtotal: 22.5, + affiliation: 'Google Store', + checkout_id: 'fksdjfsdjfisjf9sdfjsd9f', + }, + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + integrations: { All: true }, + }, + destination: { + ID: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', + Name: 'PINTEREST_TAG', + Config: { + sendAsTestEvent: false, + tagId: '123456789', + apiVersion: 'newApi', + adAccountId: 'accountId123', + conversionToken: 'conversionToken123', + appId: '429047995', + enhancedMatch: true, + enableDeduplication: true, + deduplicationKey: 'messageId', + sendingUnHashedData: true, + sendAsCustomEvent: false, + customProperties: [{ properties: 'presentclass' }, { properties: 'presentgrade' }], + eventsMapping: [{ from: 'ABC Searched', to: 'WatchVideo' }], + }, + Enabled: true, + Transformations: [], + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + error: + "custom event is not mapped in UI. Make sure to map the event in UI or enable the 'send as custom event' setting", + statTags: { + destType: 'PINTEREST_TAG', + errorCategory: 'dataValidation', + errorType: 'configuration', + feature: 'processor', + implementation: 'native', + module: 'destination', + }, + statusCode: 400, + }, + ], + }, + }, + }, +];