From 939cafbed5469e8f03427e314fe1cfe457bab718 Mon Sep 17 00:00:00 2001 From: Michelle Bergeron Date: Tue, 9 Dec 2025 16:11:44 -0500 Subject: [PATCH 1/4] new components --- .../create-customer/create-customer.mjs | 83 +++++++++++++++++++ components/braintree/braintree.app.mjs | 21 ++++- components/braintree/common/mutations.mjs | 21 +++++ components/braintree/common/queries.mjs | 69 +++++++++++++++ components/braintree/package.json | 5 +- .../braintree/sources/common/base-polling.mjs | 63 ++++++++++++++ .../new-customer-created.mjs | 34 ++++++++ .../new-transaction-created.mjs | 34 ++++++++ 8 files changed, 326 insertions(+), 4 deletions(-) create mode 100644 components/braintree/actions/create-customer/create-customer.mjs create mode 100644 components/braintree/common/mutations.mjs create mode 100644 components/braintree/common/queries.mjs create mode 100644 components/braintree/sources/common/base-polling.mjs create mode 100644 components/braintree/sources/new-customer-created/new-customer-created.mjs create mode 100644 components/braintree/sources/new-transaction-created/new-transaction-created.mjs diff --git a/components/braintree/actions/create-customer/create-customer.mjs b/components/braintree/actions/create-customer/create-customer.mjs new file mode 100644 index 0000000000000..62b14f24e6e27 --- /dev/null +++ b/components/braintree/actions/create-customer/create-customer.mjs @@ -0,0 +1,83 @@ +import braintree from "../../braintree.app.mjs"; +import mutations from "../../common/mutations.mjs"; + +export default { + key: "braintree-create-customer", + name: "Create Customer", + description: "Create a new customer in Braintree. [See the documentation](https://developer.paypal.com/braintree/graphql/guides/customers/#create)", + version: "0.0.1", + annotations: { + destructiveHint: false, + openWorldHint: true, + readOnlyHint: false, + }, + type: "action", + props: { + braintree, + firstName: { + type: "string", + label: "First Name", + description: "First name of the customer", + optional: true, + }, + lastName: { + type: "string", + label: "Last Name", + description: "Last name of the customer", + optional: true, + }, + company: { + type: "string", + label: "Company", + description: "Company name of the customer", + optional: true, + }, + email: { + type: "string", + label: "Email", + description: "Email of the customer", + optional: true, + }, + phoneNumber: { + type: "string", + label: "Phone Number", + description: "Phone number of the customer", + optional: true, + }, + fax: { + type: "string", + label: "Fax", + description: "Fax number of the customer", + optional: true, + }, + website: { + type: "string", + label: "Website", + description: "Website of the customer", + optional: true, + }, + }, + async run({ $ }) { + const response = await this.braintree.makeGraphQLRequest({ + $, + data: { + query: mutations.createCustomer, + variables: { + input: { + customer: { + firstName: this.firstName, + lastName: this.lastName, + company: this.company, + email: this.email, + phoneNumber: this.phoneNumber, + fax: this.fax, + website: this.website, + }, + }, + }, + }, + }); + $.export("$summary", `Customer successfully created with id ${response.data.createCustomer.customer.id}`); + return response; + }, +}; diff --git a/components/braintree/braintree.app.mjs b/components/braintree/braintree.app.mjs index cbf7bb2ef0d60..a72f62a60e6e4 100644 --- a/components/braintree/braintree.app.mjs +++ b/components/braintree/braintree.app.mjs @@ -1,11 +1,26 @@ +import { axios } from "@pipedream/platform"; + export default { type: "app", app: "braintree", propDefinitions: {}, methods: { - // this.$auth contains connected account data - authKeys() { - console.log(Object.keys(this.$auth)); + makeGraphQLRequest({ + $ = this, ...opts + }) { + return axios($, { + method: "post", + url: `https://${this.$auth.environment}.braintree-api.com/graphql`, + headers: { + "Braintree-Version": "2019-01-01", + "Content-Type": "application/json", + }, + auth: { + username: `${this.$auth.public_key}`, + password: `${this.$auth.private_key}`, + }, + ...opts, + }); }, }, }; diff --git a/components/braintree/common/mutations.mjs b/components/braintree/common/mutations.mjs new file mode 100644 index 0000000000000..c0056e8868a59 --- /dev/null +++ b/components/braintree/common/mutations.mjs @@ -0,0 +1,21 @@ +const createCustomer = ` + mutation createCustomer($input: CreateCustomerInput!) { + createCustomer(input: $input) { + customer { + id + firstName + lastName + company + email + phoneNumber + fax + website + createdAt + } + } + } +`; + +export default { + createCustomer, +}; diff --git a/components/braintree/common/queries.mjs b/components/braintree/common/queries.mjs new file mode 100644 index 0000000000000..5d958d9678dec --- /dev/null +++ b/components/braintree/common/queries.mjs @@ -0,0 +1,69 @@ +const searchCustomers = ` + query Search($input: CustomerSearchInput!,) { + search { + customers(input: $input) { + edges { + node { + id + firstName + lastName + company + email + phoneNumber + fax + website + createdAt + customFields { + name + value + } + } + } + } + } + } +`; + +const searchTransactions = ` + query ($input: TransactionSearchInput!) { + search { + transactions(input: $input) { + edges { + node { + id + status + amount { + value + currencyCode + } + paymentMethod { + id + } + orderId + merchantId + merchantName + customFields { + name + value + } + channel + customer { + id + } + lineItems { + name + quantity + totalAmount + } + createdAt + } + } + } + } + } +`; + +export default { + searchCustomers, + searchTransactions, +}; diff --git a/components/braintree/package.json b/components/braintree/package.json index dffbfe28a9c34..8fd082fa474cb 100644 --- a/components/braintree/package.json +++ b/components/braintree/package.json @@ -1,6 +1,6 @@ { "name": "@pipedream/braintree", - "version": "0.0.3", + "version": "0.1.0", "description": "Pipedream Braintree Components", "main": "braintree.app.mjs", "keywords": [ @@ -11,5 +11,8 @@ "author": "Pipedream (https://pipedream.com/)", "publishConfig": { "access": "public" + }, + "dependencies": { + "@pipedream/platform": "^3.1.1" } } diff --git a/components/braintree/sources/common/base-polling.mjs b/components/braintree/sources/common/base-polling.mjs new file mode 100644 index 0000000000000..228af1dcbf22d --- /dev/null +++ b/components/braintree/sources/common/base-polling.mjs @@ -0,0 +1,63 @@ +import braintree from "../../braintree.app.mjs"; +import { + DEFAULT_POLLING_SOURCE_TIMER_INTERVAL, ConfigurationError, +} from "@pipedream/platform"; + +export default { + props: { + braintree, + db: "$.service.db", + timer: { + type: "$.interface.timer", + default: { + intervalSeconds: DEFAULT_POLLING_SOURCE_TIMER_INTERVAL, + }, + }, + }, + methods: { + _yesterday() { + const now = new Date(); + const yesterday = new Date(now); + yesterday.setDate(now.getDate() - 1); + return yesterday.toISOString(); + }, + _getLastCreatedAt() { + return this.db.get("createdAt") || this._yesterday(); + }, + _setLastCreatedAt(lastCreatedAt) { + this.db.set("createdAt", lastCreatedAt); + }, + emitEvent(result) { + const meta = this.generateMeta(result); + this.$emit(result, meta); + }, + generateMeta(result) { + return { + id: result.id, + summary: this.getSummary(result), + ts: Date.parse(result.createdAt), + }; + }, + getResults() { + throw new ConfigurationError("getResults is not implemented"); + }, + getSummary() { + throw new ConfigurationError("getSummary is not implemented"); + }, + }, + async run() { + const lastCreatedAt = this._getLastCreatedAt(); + let maxCreatedAt = lastCreatedAt; + + const results = await this.getResults(lastCreatedAt); + for (const result of results) { + const createdAt = result.createdAt; + this.emitEvent(result); + if (Date.parse(createdAt) > Date.parse(maxCreatedAt)) { + maxCreatedAt = createdAt; + } + } + + this._setLastCreatedAt(maxCreatedAt); + }, +}; diff --git a/components/braintree/sources/new-customer-created/new-customer-created.mjs b/components/braintree/sources/new-customer-created/new-customer-created.mjs new file mode 100644 index 0000000000000..9adfc3b1f310a --- /dev/null +++ b/components/braintree/sources/new-customer-created/new-customer-created.mjs @@ -0,0 +1,34 @@ +import base from "../common/base-polling.mjs"; +import queries from "../../common/queries.mjs"; + +export default { + ...base, + key: "braintree-new-customer-created", + name: "New Customer Created", + description: "Emit new event when a new customer is created.", + version: "0.0.1", + type: "source", + dedupe: "unique", + methods: { + ...base.methods, + async getResults(lastCreatedAt) { + const { braintree } = this; + const { data: { search: { customers: { edges } } } } = await braintree.makeGraphQLRequest({ + data: { + query: queries.searchCustomers, + variables: { + input: { + createdAt: { + greaterThanOrEqualTo: lastCreatedAt, + }, + }, + }, + }, + }); + return edges.map((edge) => edge.node); + }, + getSummary(result) { + return `New Customer Created: ${result.id}`; + }, + }, +}; diff --git a/components/braintree/sources/new-transaction-created/new-transaction-created.mjs b/components/braintree/sources/new-transaction-created/new-transaction-created.mjs new file mode 100644 index 0000000000000..c578bfb6425b9 --- /dev/null +++ b/components/braintree/sources/new-transaction-created/new-transaction-created.mjs @@ -0,0 +1,34 @@ +import common from "../common/base-polling.mjs"; +import queries from "../../common/queries.mjs"; + +export default { + ...common, + key: "braintree-new-transaction-created", + name: "New Transaction Created", + description: "Emit new event when a new transaction is created.", + version: "0.0.1", + type: "source", + dedupe: "unique", + methods: { + ...common.methods, + async getResults(lastCreatedAt) { + const { braintree } = this; + const { data: { search: { transactions: { edges } } } } = await braintree.makeGraphQLRequest({ + data: { + query: queries.searchTransactions, + variables: { + input: { + createdAt: { + greaterThanOrEqualTo: lastCreatedAt, + }, + }, + }, + }, + }); + return edges.map((edge) => edge.node); + }, + getSummary(result) { + return `New Transaction Created: ${result.id}`; + }, + }, +}; From bbb45a63d2ae9b3b271fab4b31eedaac32e735c1 Mon Sep 17 00:00:00 2001 From: Michelle Bergeron Date: Tue, 9 Dec 2025 16:12:31 -0500 Subject: [PATCH 2/4] pnpm-lock.yaml --- pnpm-lock.yaml | 129 ++++++++++++++++++++++++++++++++++--------------- 1 file changed, 91 insertions(+), 38 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 65dd16770279b..b238d83297263 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -2052,7 +2052,11 @@ importers: components/brainshop: {} - components/braintree: {} + components/braintree: + dependencies: + '@pipedream/platform': + specifier: ^3.1.1 + version: 3.1.1 components/brand_dev: {} @@ -5107,8 +5111,7 @@ importers: specifier: ^3.1.1 version: 3.1.1 - components/fashn: - specifiers: {} + components/fashn: {} components/fastfield_mobile_forms: {} @@ -7706,8 +7709,7 @@ importers: specifier: ^3.1.1 version: 3.1.1 - components/jobsoid_careers_portal: - specifiers: {} + components/jobsoid_careers_portal: {} components/joggai: dependencies: @@ -17578,7 +17580,7 @@ importers: version: 3.1.11 ts-jest: specifier: ^29.2.5 - version: 29.4.5(@babel/core@8.0.0-beta.3)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@8.0.0-beta.3))(jest-util@29.7.0)(jest@29.7.0(@types/node@20.19.25)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.19.25)(typescript@5.6.3)))(typescript@5.6.3) + version: 29.4.5(@babel/core@7.28.5)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.5))(jest-util@29.7.0)(jest@29.7.0(@types/node@20.19.25)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.19.25)(typescript@5.6.3)))(typescript@5.6.3) tsup: specifier: ^8.3.6 version: 8.5.1(@microsoft/api-extractor@7.55.0(@types/node@20.19.25))(jiti@2.6.1)(postcss@8.5.6)(tsx@4.20.6)(typescript@5.6.3)(yaml@2.8.1) @@ -17621,7 +17623,7 @@ importers: version: 3.1.0 jest: specifier: ^29.1.2 - version: 29.7.0(@types/node@20.19.25)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.19.25)(typescript@3.9.10)) + version: 29.7.0(@types/node@24.10.1)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@24.10.1)(typescript@3.9.10)) type-fest: specifier: ^4.15.0 version: 4.41.0 @@ -37313,7 +37315,7 @@ snapshots: jest-util: 29.7.0 slash: 3.0.0 - '@jest/core@29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.19.25)(typescript@3.9.10))': + '@jest/core@29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.19.25)(typescript@5.6.3))': dependencies: '@jest/console': 29.7.0 '@jest/reporters': 29.7.0 @@ -37327,7 +37329,7 @@ snapshots: exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@20.19.25)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.19.25)(typescript@3.9.10)) + jest-config: 29.7.0(@types/node@20.19.25)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.19.25)(typescript@5.6.3)) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -37348,7 +37350,7 @@ snapshots: - supports-color - ts-node - '@jest/core@29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.19.25)(typescript@5.6.3))': + '@jest/core@29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@24.10.1)(typescript@3.9.10))': dependencies: '@jest/console': 29.7.0 '@jest/reporters': 29.7.0 @@ -37362,7 +37364,7 @@ snapshots: exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@20.19.25)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.19.25)(typescript@5.6.3)) + jest-config: 29.7.0(@types/node@20.19.25)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@24.10.1)(typescript@3.9.10)) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -43765,13 +43767,13 @@ snapshots: safe-buffer: 5.2.1 sha.js: 2.4.12 - create-jest@29.7.0(@types/node@20.19.25)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.19.25)(typescript@3.9.10)): + create-jest@29.7.0(@types/node@20.19.25)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.19.25)(typescript@5.6.3)): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@20.19.25)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.19.25)(typescript@3.9.10)) + jest-config: 29.7.0(@types/node@20.19.25)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.19.25)(typescript@5.6.3)) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -43780,13 +43782,13 @@ snapshots: - supports-color - ts-node - create-jest@29.7.0(@types/node@20.19.25)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.19.25)(typescript@5.6.3)): + create-jest@29.7.0(@types/node@24.10.1)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@24.10.1)(typescript@3.9.10)): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@20.19.25)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.19.25)(typescript@5.6.3)) + jest-config: 29.7.0(@types/node@24.10.1)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@24.10.1)(typescript@3.9.10)) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -47677,16 +47679,16 @@ snapshots: - babel-plugin-macros - supports-color - jest-cli@29.7.0(@types/node@20.19.25)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.19.25)(typescript@3.9.10)): + jest-cli@29.7.0(@types/node@20.19.25)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.19.25)(typescript@5.6.3)): dependencies: - '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.19.25)(typescript@3.9.10)) + '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.19.25)(typescript@5.6.3)) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@20.19.25)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.19.25)(typescript@3.9.10)) + create-jest: 29.7.0(@types/node@20.19.25)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.19.25)(typescript@5.6.3)) exit: 0.1.2 import-local: 3.2.0 - jest-config: 29.7.0(@types/node@20.19.25)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.19.25)(typescript@3.9.10)) + jest-config: 29.7.0(@types/node@20.19.25)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.19.25)(typescript@5.6.3)) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -47696,16 +47698,16 @@ snapshots: - supports-color - ts-node - jest-cli@29.7.0(@types/node@20.19.25)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.19.25)(typescript@5.6.3)): + jest-cli@29.7.0(@types/node@24.10.1)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@24.10.1)(typescript@3.9.10)): dependencies: - '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.19.25)(typescript@5.6.3)) + '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@24.10.1)(typescript@3.9.10)) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@20.19.25)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.19.25)(typescript@5.6.3)) + create-jest: 29.7.0(@types/node@24.10.1)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@24.10.1)(typescript@3.9.10)) exit: 0.1.2 import-local: 3.2.0 - jest-config: 29.7.0(@types/node@20.19.25)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.19.25)(typescript@5.6.3)) + jest-config: 29.7.0(@types/node@24.10.1)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@24.10.1)(typescript@3.9.10)) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -47715,7 +47717,7 @@ snapshots: - supports-color - ts-node - jest-config@29.7.0(@types/node@20.19.25)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.19.25)(typescript@3.9.10)): + jest-config@29.7.0(@types/node@20.19.25)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.19.25)(typescript@5.6.3)): dependencies: '@babel/core': 7.28.5 '@jest/test-sequencer': 29.7.0 @@ -47741,12 +47743,12 @@ snapshots: strip-json-comments: 3.1.1 optionalDependencies: '@types/node': 20.19.25 - ts-node: 10.9.2(@types/node@20.19.25)(typescript@3.9.10) + ts-node: 10.9.2(@types/node@20.19.25)(typescript@5.6.3) transitivePeerDependencies: - babel-plugin-macros - supports-color - jest-config@29.7.0(@types/node@20.19.25)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.19.25)(typescript@5.6.3)): + jest-config@29.7.0(@types/node@20.19.25)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@24.10.1)(typescript@3.9.10)): dependencies: '@babel/core': 7.28.5 '@jest/test-sequencer': 29.7.0 @@ -47772,7 +47774,38 @@ snapshots: strip-json-comments: 3.1.1 optionalDependencies: '@types/node': 20.19.25 - ts-node: 10.9.2(@types/node@20.19.25)(typescript@5.6.3) + ts-node: 10.9.2(@types/node@24.10.1)(typescript@3.9.10) + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + + jest-config@29.7.0(@types/node@24.10.1)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@24.10.1)(typescript@3.9.10)): + dependencies: + '@babel/core': 7.28.5 + '@jest/test-sequencer': 29.7.0 + '@jest/types': 29.6.3 + babel-jest: 29.7.0(@babel/core@7.28.5) + chalk: 4.1.2 + ci-info: 3.9.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 29.7.0(babel-plugin-macros@3.1.0) + jest-environment-node: 29.7.0 + jest-get-type: 29.6.3 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-runner: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + micromatch: 4.0.8 + parse-json: 5.2.0 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + optionalDependencies: + '@types/node': 24.10.1 + ts-node: 10.9.2(@types/node@24.10.1)(typescript@3.9.10) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -48008,24 +48041,24 @@ snapshots: merge-stream: 2.0.0 supports-color: 8.1.1 - jest@29.7.0(@types/node@20.19.25)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.19.25)(typescript@3.9.10)): + jest@29.7.0(@types/node@20.19.25)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.19.25)(typescript@5.6.3)): dependencies: - '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.19.25)(typescript@3.9.10)) + '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.19.25)(typescript@5.6.3)) '@jest/types': 29.6.3 import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@20.19.25)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.19.25)(typescript@3.9.10)) + jest-cli: 29.7.0(@types/node@20.19.25)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.19.25)(typescript@5.6.3)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros - supports-color - ts-node - jest@29.7.0(@types/node@20.19.25)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.19.25)(typescript@5.6.3)): + jest@29.7.0(@types/node@24.10.1)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@24.10.1)(typescript@3.9.10)): dependencies: - '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.19.25)(typescript@5.6.3)) + '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@24.10.1)(typescript@3.9.10)) '@jest/types': 29.6.3 import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@20.19.25)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.19.25)(typescript@5.6.3)) + jest-cli: 29.7.0(@types/node@24.10.1)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@24.10.1)(typescript@3.9.10)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -53559,6 +53592,26 @@ snapshots: ts-interface-checker@0.1.13: {} + ts-jest@29.4.5(@babel/core@7.28.5)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.5))(jest-util@29.7.0)(jest@29.7.0(@types/node@20.19.25)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.19.25)(typescript@5.6.3)))(typescript@5.6.3): + dependencies: + bs-logger: 0.2.6 + fast-json-stable-stringify: 2.1.0 + handlebars: 4.7.8 + jest: 29.7.0(@types/node@20.19.25)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.19.25)(typescript@5.6.3)) + json5: 2.2.3 + lodash.memoize: 4.1.2 + make-error: 1.3.6 + semver: 7.7.3 + type-fest: 4.41.0 + typescript: 5.6.3 + yargs-parser: 21.1.1 + optionalDependencies: + '@babel/core': 7.28.5 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + babel-jest: 29.7.0(@babel/core@7.28.5) + jest-util: 29.7.0 + ts-jest@29.4.5(@babel/core@8.0.0-beta.3)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@8.0.0-beta.3))(jest-util@29.7.0)(jest@29.7.0(@types/node@20.19.25)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.19.25)(typescript@5.6.3)))(typescript@5.6.3): dependencies: bs-logger: 0.2.6 @@ -53579,7 +53632,7 @@ snapshots: babel-jest: 29.7.0(@babel/core@8.0.0-beta.3) jest-util: 29.7.0 - ts-node@10.9.2(@types/node@20.19.25)(typescript@3.9.10): + ts-node@10.9.2(@types/node@20.19.25)(typescript@5.6.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.12 @@ -53593,26 +53646,26 @@ snapshots: create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 3.9.10 + typescript: 5.6.3 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 optional: true - ts-node@10.9.2(@types/node@20.19.25)(typescript@5.6.3): + ts-node@10.9.2(@types/node@24.10.1)(typescript@3.9.10): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.12 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 20.19.25 + '@types/node': 24.10.1 acorn: 8.15.0 acorn-walk: 8.3.4 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.6.3 + typescript: 3.9.10 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 optional: true From 0f887bee50b824ebc4dcb1a1b13447747095e20e Mon Sep 17 00:00:00 2001 From: Michelle Bergeron Date: Tue, 9 Dec 2025 16:23:29 -0500 Subject: [PATCH 3/4] updates --- components/braintree/braintree.app.mjs | 4 ++-- components/braintree/common/queries.mjs | 2 +- .../sources/new-customer-created/new-customer-created.mjs | 3 ++- .../new-transaction-created/new-transaction-created.mjs | 3 ++- 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/components/braintree/braintree.app.mjs b/components/braintree/braintree.app.mjs index a72f62a60e6e4..2393f43e15fab 100644 --- a/components/braintree/braintree.app.mjs +++ b/components/braintree/braintree.app.mjs @@ -16,8 +16,8 @@ export default { "Content-Type": "application/json", }, auth: { - username: `${this.$auth.public_key}`, - password: `${this.$auth.private_key}`, + username: this.$auth.public_key, + password: this.$auth.private_key, }, ...opts, }); diff --git a/components/braintree/common/queries.mjs b/components/braintree/common/queries.mjs index 5d958d9678dec..145a23004f931 100644 --- a/components/braintree/common/queries.mjs +++ b/components/braintree/common/queries.mjs @@ -1,5 +1,5 @@ const searchCustomers = ` - query Search($input: CustomerSearchInput!,) { + query Search($input: CustomerSearchInput!) { search { customers(input: $input) { edges { diff --git a/components/braintree/sources/new-customer-created/new-customer-created.mjs b/components/braintree/sources/new-customer-created/new-customer-created.mjs index 9adfc3b1f310a..5cd9e04bc3b41 100644 --- a/components/braintree/sources/new-customer-created/new-customer-created.mjs +++ b/components/braintree/sources/new-customer-created/new-customer-created.mjs @@ -13,7 +13,7 @@ export default { ...base.methods, async getResults(lastCreatedAt) { const { braintree } = this; - const { data: { search: { customers: { edges } } } } = await braintree.makeGraphQLRequest({ + const response = await braintree.makeGraphQLRequest({ data: { query: queries.searchCustomers, variables: { @@ -25,6 +25,7 @@ export default { }, }, }); + const edges = response?.data?.search?.customers?.edges ?? []; return edges.map((edge) => edge.node); }, getSummary(result) { diff --git a/components/braintree/sources/new-transaction-created/new-transaction-created.mjs b/components/braintree/sources/new-transaction-created/new-transaction-created.mjs index c578bfb6425b9..f53497e4f9738 100644 --- a/components/braintree/sources/new-transaction-created/new-transaction-created.mjs +++ b/components/braintree/sources/new-transaction-created/new-transaction-created.mjs @@ -13,7 +13,7 @@ export default { ...common.methods, async getResults(lastCreatedAt) { const { braintree } = this; - const { data: { search: { transactions: { edges } } } } = await braintree.makeGraphQLRequest({ + const response = await braintree.makeGraphQLRequest({ data: { query: queries.searchTransactions, variables: { @@ -25,6 +25,7 @@ export default { }, }, }); + const edges = response?.data?.search?.transactions?.edges ?? []; return edges.map((edge) => edge.node); }, getSummary(result) { From 31ba835c314d38b4e4eee87f0537a7f563e86775 Mon Sep 17 00:00:00 2001 From: Michelle Bergeron Date: Wed, 10 Dec 2025 11:23:08 -0500 Subject: [PATCH 4/4] error handling --- .../actions/create-customer/create-customer.mjs | 2 +- components/braintree/braintree.app.mjs | 12 +++++++++--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/components/braintree/actions/create-customer/create-customer.mjs b/components/braintree/actions/create-customer/create-customer.mjs index 62b14f24e6e27..3c5d6ab130783 100644 --- a/components/braintree/actions/create-customer/create-customer.mjs +++ b/components/braintree/actions/create-customer/create-customer.mjs @@ -77,7 +77,7 @@ export default { }, }, }); - $.export("$summary", `Customer successfully created with id ${response.data.createCustomer.customer.id}`); + $.export("$summary", `Customer successfully created with ID ${response.data.createCustomer.customer.id}`); return response; }, }; diff --git a/components/braintree/braintree.app.mjs b/components/braintree/braintree.app.mjs index 2393f43e15fab..3d289886c09fa 100644 --- a/components/braintree/braintree.app.mjs +++ b/components/braintree/braintree.app.mjs @@ -1,14 +1,16 @@ -import { axios } from "@pipedream/platform"; +import { + axios, ConfigurationError, +} from "@pipedream/platform"; export default { type: "app", app: "braintree", propDefinitions: {}, methods: { - makeGraphQLRequest({ + async makeGraphQLRequest({ $ = this, ...opts }) { - return axios($, { + const response = await axios($, { method: "post", url: `https://${this.$auth.environment}.braintree-api.com/graphql`, headers: { @@ -21,6 +23,10 @@ export default { }, ...opts, }); + if (response.errors) { + throw new ConfigurationError(response.errors[0].message); + } + return response; }, }, };