Skip to content

[FEATURE] Upgrade Pipedream Stripe App to Latest Stable API Version #16463

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: master
Choose a base branch
from

Conversation

jcortes
Copy link
Collaborator

@jcortes jcortes commented Apr 28, 2025

WHY

Resolves #16415 and #16554

Summary by CodeRabbit

  • New Features
    • Added a new action to create billing meters for Stripe billing aggregation.
    • Introduced advanced options with JSON parsing for several Stripe actions to allow more flexible parameters.
    • Enhanced filtering and pagination options across multiple list actions with new date range and cursor-based parameters.
  • Bug Fixes
    • Removed the "Create Usage Record" action.
  • Chores
    • Updated the Stripe dependency to the latest major version.
    • Updated the default Stripe API version to the newest release.
    • Incremented version numbers across multiple Stripe actions and source components for consistency.

@jcortes jcortes self-assigned this Apr 28, 2025
Copy link

vercel bot commented Apr 28, 2025

The latest updates on your projects. Learn more about Vercel for Git ↗︎

3 Skipped Deployments
Name Status Preview Comments Updated (UTC)
docs-v2 ⬜️ Ignored (Inspect) Visit Preview May 6, 2025 0:23am
pipedream-docs ⬜️ Ignored (Inspect) May 6, 2025 0:23am
pipedream-docs-redirect-do-not-edit ⬜️ Ignored (Inspect) May 6, 2025 0:23am

Copy link
Contributor

coderabbitai bot commented Apr 28, 2025

## Walkthrough

This update modifies the Stripe integration by upgrading the Stripe SDK dependency from version 8.x to 18.x, updates the default Stripe API version from "2020-03-02" to "2025-03-31.basil", and adjusts the Stripe client instantiation to use the new SDK import style. Additionally, the version numbers for all Stripe actions and sources are incremented (mostly from "0.1.1" to "0.1.2" or "0.1.3"/"0.1.4" for sources). The "Create Usage Record" action was removed, and a new "Create Billing Meter" action and a utility module with JSON parsing and date conversion functions were added. Several actions were enhanced to parse advanced options as JSON before use, and many list actions were extended with new filtering and pagination props.

## Changes

| File(s)                                                                                              | Change Summary                                                                                                   |
|----------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------|
| components/stripe/stripe.app.mjs                                                                    | Updated Stripe SDK import to named import, changed client instantiation, set API version to "2025-03-31.basil". Added new filtering and pagination props; removed `usage_record_action` prop. |
| components/stripe/package.json                                                                      | Upgraded Stripe SDK dependency from ^8.168.0 to ^18.0.0.                                                        |
| components/stripe/common/utils.mjs                                                                  | Added utility module with `parseJson` (recursive JSON parsing) and `fromDateToInteger` (date string to timestamp).|
| components/stripe/actions/create-billing-meter/create-billing-meter.mjs                             | Added new action to create billing meters with configurable aggregation, event name, and optional keys.          |
| components/stripe/actions/create-customer/*, capture-payment-intent, confirm-payment-intent, create-invoice, create-invoice-item, update-customer, update-invoice-item, update-invoice | Changed handling of `advanced` prop to parse JSON before spreading into Stripe SDK calls; imported utils module; bumped versions. |
| components/stripe/actions/create-subscription/create-subscription.mjs                              | Added optional `advanced` prop parsed as JSON and spread into subscription creation parameters; bumped version.  |
| components/stripe/actions/list-balance-history/list-balance-history.mjs                            | Added filtering and pagination props; refactored to explicit param construction; bumped version to 0.1.6.        |
| components/stripe/actions/list-customers/list-customers.mjs                                       | Added filtering and pagination props; refactored param handling; bumped version.                                 |
| components/stripe/actions/list-invoices/list-invoices.mjs                                         | Added filtering and pagination props; refactored param handling; bumped version.                                 |
| components/stripe/actions/list-payment-intents/list-payment-intents.mjs                            | Added JSON parsing of `advanced` prop before spreading; bumped version.                                         |
| components/stripe/actions/list-payouts/list-payouts.mjs                                           | Added filtering and pagination props; refactored param handling; bumped version.                                 |
| components/stripe/actions/create-payment-intent, create-payout, create-price, create-product, create-refund, cancel-or-reverse-payout, cancel-payment-intent, delete-customer, delete-invoice-item, delete-or-void-invoice, finalize-invoice, list-refunds, retrieve-balance, retrieve-checkout-session, retrieve-checkout-session-line-items, retrieve-customer, retrieve-invoice, retrieve-invoice-item, retrieve-payment-intent, retrieve-payout, retrieve-price, retrieve-product, retrieve-refund, send-invoice, update-payment-intent, update-payout, update-refund, void-invoice, write-off-invoice, abandoned-cart source, canceled-subscription source, custom-webhook-events source, new-customer source, new-dispute source, new-failed-invoice-payment source, new-failed-payment source, new-invoice source, new-payment source, new-subscription source, subscription-updated source | Version bumps only (mostly from 0.1.1 to 0.1.2, sources from 0.1.2 to 0.1.3/0.1.4); minor event addition in subscription-updated source. |
| components/stripe/actions/create-usage-record/create-usage-record.mjs                              | Removed entire action module.                                                                                   |

## Sequence Diagram(s)

```mermaid
sequenceDiagram
    participant Action as Stripe Action
    participant Utils as Utils Module
    participant SDK as Stripe SDK
    participant API as Stripe API

    Action->>Utils: parseJson(advanced options)
    Utils-->>Action: parsed options object
    Action->>SDK: Call Stripe API with merged params (including parsed advanced options)
    SDK->>API: API request with updated params
    API-->>SDK: API response
    SDK-->>Action: Return response
sequenceDiagram
    participant StripeApp as Stripe App
    participant StripeSDK as Stripe SDK
    StripeApp->>StripeSDK: Import Stripe (v18.x)
    StripeApp->>StripeSDK: Instantiate Stripe client (API version "2025-03-31.basil")
    StripeApp->>StripeSDK: Make API requests using new client
    StripeSDK-->>StripeApp: Return responses
Loading

Assessment against linked issues

Objective Addressed Explanation
Upgrade Stripe SDK to latest version and set default API version to "2025-03-31.basil" (#16415)
Update all Stripe actions for compatibility with new API version (#16415) Version numbers updated and some props added, but no explicit code changes for compatibility or breaking changes handling.
Update Stripe SDK import and instantiation to new style (#16415)

Possibly related PRs

Suggested labels

User submitted

Suggested reviewers

  • michelle0927

Poem

A hop and a skip, the Stripe app’s anew,
With SDKs fresh and versions true!
From "2020" to "2025" we leap,
Bunny engineers, promises to keep.
Stripe’s API shines, the future’s bright—
Let’s process payments day and night!
🐇💳✨


<!-- walkthrough_end -->
<!-- This is an auto-generated comment: all tool run failures by coderabbit.ai -->

> [!WARNING]
> There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure.
> 
> <details>
> <summary>🔧 ESLint</summary>
> 
> > If the error stems from missing dependencies, add them to the package.json file. For unrecoverable errors (e.g., due to private dependencies), disable the tool in the CodeRabbit configuration.
> 
> <details>
> <summary>components/stripe/actions/cancel-or-reverse-payout/cancel-or-reverse-payout.mjs</summary>
> 
> 
> Oops! Something went wrong! :(
> 
> ESLint: 8.57.1
> 
> Error [ERR_MODULE_NOT_FOUND]: Cannot find package 'jsonc-eslint-parser' imported from /eslint.config.mjs
>     at packageResolve (node:internal/modules/esm/resolve:839:9)
>     at moduleResolve (node:internal/modules/esm/resolve:908:18)
>     at defaultResolve (node:internal/modules/esm/resolve:1038:11)
>     at ModuleLoader.defaultResolve (node:internal/modules/esm/loader:557:12)
>     at ModuleLoader.resolve (node:internal/modules/esm/loader:525:25)
>     at ModuleLoader.getModuleJob (node:internal/modules/esm/loader:246:38)
>     at ModuleJob._link (node:internal/modules/esm/module_job:126:49)
> 
> </details>
> 
> <details>
> <summary>components/stripe/actions/cancel-payment-intent/cancel-payment-intent.mjs</summary>
> 
> 
> Oops! Something went wrong! :(
> 
> ESLint: 8.57.1
> 
> Error [ERR_MODULE_NOT_FOUND]: Cannot find package 'jsonc-eslint-parser' imported from /eslint.config.mjs
>     at packageResolve (node:internal/modules/esm/resolve:839:9)
>     at moduleResolve (node:internal/modules/esm/resolve:908:18)
>     at defaultResolve (node:internal/modules/esm/resolve:1038:11)
>     at ModuleLoader.defaultResolve (node:internal/modules/esm/loader:557:12)
>     at ModuleLoader.resolve (node:internal/modules/esm/loader:525:25)
>     at ModuleLoader.getModuleJob (node:internal/modules/esm/loader:246:38)
>     at ModuleJob._link (node:internal/modules/esm/module_job:126:49)
> 
> </details>
> 
> <details>
> <summary>components/stripe/actions/confirm-payment-intent/confirm-payment-intent.mjs</summary>
> 
> 
> Oops! Something went wrong! :(
> 
> ESLint: 8.57.1
> 
> Error [ERR_MODULE_NOT_FOUND]: Cannot find package 'jsonc-eslint-parser' imported from /eslint.config.mjs
>     at packageResolve (node:internal/modules/esm/resolve:839:9)
>     at moduleResolve (node:internal/modules/esm/resolve:908:18)
>     at defaultResolve (node:internal/modules/esm/resolve:1038:11)
>     at ModuleLoader.defaultResolve (node:internal/modules/esm/loader:557:12)
>     at ModuleLoader.resolve (node:internal/modules/esm/loader:525:25)
>     at ModuleLoader.getModuleJob (node:internal/modules/esm/loader:246:38)
>     at ModuleJob._link (node:internal/modules/esm/module_job:126:49)
> 
> </details>
> 
> + 54 others
> 
> </details>

<!-- end of auto-generated comment: all tool run failures by coderabbit.ai -->
<!-- internal state start -->


<!-- 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 -->

<!-- internal state end -->
<!-- finishing_touch_checkbox_start -->

<details open="true">
<summary>✨ Finishing Touches</summary>

- [ ] <!-- {"checkboxId": "7962f53c-55bc-4827-bfbf-6a18da830691"} --> 📝 Generate Docstrings

</details>

<!-- finishing_touch_checkbox_end -->
<!-- tips_start -->

---

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

<details>
<summary>❤️ Share</summary>

- [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai)
- [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai)
- [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai)
- [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)

</details>

<details>
<summary>🪧 Tips</summary>

### Chat

There are 3 ways to chat with [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=PipedreamHQ/pipedream&utm_content=16463):

- Review comments: Directly reply to a review comment made by CodeRabbit. Example:
  - `I pushed a fix in commit <commit_id>, please review it.`
  - `Generate unit testing code for this file.`
  - `Open a follow-up GitHub issue for this discussion.`
- Files and specific lines of code (under the "Files changed" tab): Tag `@coderabbitai` in a new review comment at the desired location with your query. Examples:
  - `@coderabbitai generate unit testing code for this file.`
  -	`@coderabbitai modularize this function.`
- PR comments: Tag `@coderabbitai` in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
  - `@coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.`
  - `@coderabbitai read src/utils.ts and generate unit testing code.`
  - `@coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.`
  - `@coderabbitai help me debug CodeRabbit configuration file.`

### Support

Need help? Create a ticket on our [support page](https://www.coderabbit.ai/contact-us/support) for assistance with any issues or questions.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

### CodeRabbit Commands (Invoked using PR comments)

- `@coderabbitai pause` to pause the reviews on a PR.
- `@coderabbitai resume` to resume the paused reviews.
- `@coderabbitai review` to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
- `@coderabbitai full review` to do a full review from scratch and review all the files again.
- `@coderabbitai summary` to regenerate the summary of the PR.
- `@coderabbitai generate docstrings` to [generate docstrings](https://docs.coderabbit.ai/finishing-touches/docstrings) for this PR.
- `@coderabbitai generate sequence diagram` to generate a sequence diagram of the changes in this PR.
- `@coderabbitai resolve` resolve all the CodeRabbit review comments.
- `@coderabbitai configuration` to show the current CodeRabbit configuration for the repository.
- `@coderabbitai help` to get help.

### Other keywords and placeholders

- Add `@coderabbitai ignore` anywhere in the PR description to prevent this PR from being reviewed.
- Add `@coderabbitai summary` to generate the high-level summary at a specific location in the PR description.
- Add `@coderabbitai` anywhere in the PR title to generate the title automatically.

### CodeRabbit Configuration File (`.coderabbit.yaml`)

- You can programmatically configure CodeRabbit by adding a `.coderabbit.yaml` file to the root of your repository.
- Please see the [configuration documentation](https://docs.coderabbit.ai/guides/configure-coderabbit) for more information.
- If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: `# yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json`

### Documentation and Community

- Visit our [Documentation](https://docs.coderabbit.ai) for detailed information on how to use CodeRabbit.
- Join our [Discord Community](http://discord.gg/coderabbit) to get help, request features, and share feedback.
- Follow us on [X/Twitter](https://twitter.com/coderabbitai) for updates and announcements.

</details>

<!-- tips_end -->

@jcortes jcortes force-pushed the stripe-upgrade-to-latest-api-version branch 4 times, most recently from b90e329 to c0ffd52 Compare April 28, 2025 19:32
Copy link
Collaborator

@GTFalcao GTFalcao left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Moving it to QA, but I think the package version number needs to be fixed

@jcortes jcortes force-pushed the stripe-upgrade-to-latest-api-version branch from c0ffd52 to b463b99 Compare April 30, 2025 13:52
@jcortes jcortes force-pushed the stripe-upgrade-to-latest-api-version branch from b463b99 to 8c41a71 Compare May 6, 2025 00:22
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (2)
components/stripe/common/utils.mjs (1)

24-31: Consider adding explicit return value for invalid dates

The function currently returns undefined implicitly when validation fails. For better clarity, consider adding an explicit return statement.

const fromDateToInteger = (date) => {
  if (typeof date === "string") {
    const parsedDate = new Date(date);
    if (!isNaN(parsedDate.getTime())) {
      return Math.floor(parsedDate.getTime() / 1000);
    }
  }
+ return undefined;
};
components/stripe/actions/create-billing-meter/create-billing-meter.mjs (1)

69-101: Robust implementation with conditional parameters

The implementation correctly:

  1. Destructures props from this
  2. Builds request parameters with conditional inclusion of optional settings
  3. Returns a clear summary message with the created meter ID

Consider using the utils.parseJson for any advanced options if they're added in the future, to maintain consistency with other Stripe actions.

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between b463b99 and 8c41a71.

📒 Files selected for processing (59)
  • components/stripe/actions/cancel-or-reverse-payout/cancel-or-reverse-payout.mjs (1 hunks)
  • components/stripe/actions/cancel-payment-intent/cancel-payment-intent.mjs (1 hunks)
  • components/stripe/actions/capture-payment-intent/capture-payment-intent.mjs (2 hunks)
  • components/stripe/actions/confirm-payment-intent/confirm-payment-intent.mjs (2 hunks)
  • components/stripe/actions/create-billing-meter/create-billing-meter.mjs (1 hunks)
  • components/stripe/actions/create-customer/create-customer.mjs (2 hunks)
  • components/stripe/actions/create-invoice-item/create-invoice-item.mjs (3 hunks)
  • components/stripe/actions/create-invoice/create-invoice.mjs (2 hunks)
  • components/stripe/actions/create-payment-intent/create-payment-intent.mjs (1 hunks)
  • components/stripe/actions/create-payout/create-payout.mjs (1 hunks)
  • components/stripe/actions/create-price/create-price.mjs (1 hunks)
  • components/stripe/actions/create-product/create-product.mjs (1 hunks)
  • components/stripe/actions/create-refund/create-refund.mjs (1 hunks)
  • components/stripe/actions/create-subscription/create-subscription.mjs (3 hunks)
  • components/stripe/actions/create-usage-record/create-usage-record.mjs (0 hunks)
  • components/stripe/actions/delete-customer/delete-customer.mjs (1 hunks)
  • components/stripe/actions/delete-invoice-item/delete-invoice-item.mjs (1 hunks)
  • components/stripe/actions/delete-or-void-invoice/delete-or-void-invoice.mjs (1 hunks)
  • components/stripe/actions/finalize-invoice/finalize-invoice.mjs (1 hunks)
  • components/stripe/actions/list-balance-history/list-balance-history.mjs (3 hunks)
  • components/stripe/actions/list-customers/list-customers.mjs (2 hunks)
  • components/stripe/actions/list-invoices/list-invoices.mjs (2 hunks)
  • components/stripe/actions/list-payment-intents/list-payment-intents.mjs (2 hunks)
  • components/stripe/actions/list-payouts/list-payouts.mjs (2 hunks)
  • components/stripe/actions/list-refunds/list-refunds.mjs (1 hunks)
  • components/stripe/actions/retrieve-balance/retrieve-balance.mjs (1 hunks)
  • components/stripe/actions/retrieve-checkout-session-line-items/retrieve-checkout-session-line-items.mjs (1 hunks)
  • components/stripe/actions/retrieve-checkout-session/retrieve-checkout-session.mjs (1 hunks)
  • components/stripe/actions/retrieve-customer/retrieve-customer.mjs (1 hunks)
  • components/stripe/actions/retrieve-invoice-item/retrieve-invoice-item.mjs (1 hunks)
  • components/stripe/actions/retrieve-invoice/retrieve-invoice.mjs (1 hunks)
  • components/stripe/actions/retrieve-payment-intent/retrieve-payment-intent.mjs (1 hunks)
  • components/stripe/actions/retrieve-payout/retrieve-payout.mjs (1 hunks)
  • components/stripe/actions/retrieve-price/retrieve-price.mjs (1 hunks)
  • components/stripe/actions/retrieve-product/retrieve-product.mjs (1 hunks)
  • components/stripe/actions/retrieve-refund/retrieve-refund.mjs (1 hunks)
  • components/stripe/actions/send-invoice/send-invoice.mjs (1 hunks)
  • components/stripe/actions/update-customer/update-customer.mjs (2 hunks)
  • components/stripe/actions/update-invoice-item/update-invoice-item.mjs (2 hunks)
  • components/stripe/actions/update-invoice/update-invoice.mjs (2 hunks)
  • components/stripe/actions/update-payment-intent/update-payment-intent.mjs (1 hunks)
  • components/stripe/actions/update-payout/update-payout.mjs (1 hunks)
  • components/stripe/actions/update-refund/update-refund.mjs (1 hunks)
  • components/stripe/actions/void-invoice/void-invoice.mjs (1 hunks)
  • components/stripe/actions/write-off-invoice/write-off-invoice.mjs (1 hunks)
  • components/stripe/common/utils.mjs (1 hunks)
  • components/stripe/package.json (1 hunks)
  • components/stripe/sources/abandoned-cart/abandoned-cart.mjs (1 hunks)
  • components/stripe/sources/canceled-subscription/canceled-subscription.mjs (1 hunks)
  • components/stripe/sources/custom-webhook-events/custom-webhook-events.mjs (1 hunks)
  • components/stripe/sources/new-customer/new-customer.mjs (1 hunks)
  • components/stripe/sources/new-dispute/new-dispute.mjs (1 hunks)
  • components/stripe/sources/new-failed-invoice-payment/new-failed-invoice-payment.mjs (1 hunks)
  • components/stripe/sources/new-failed-payment/new-failed-payment.mjs (1 hunks)
  • components/stripe/sources/new-invoice/new-invoice.mjs (1 hunks)
  • components/stripe/sources/new-payment/new-payment.mjs (1 hunks)
  • components/stripe/sources/new-subscription/new-subscription.mjs (1 hunks)
  • components/stripe/sources/subscription-updated/subscription-updated.mjs (1 hunks)
  • components/stripe/stripe.app.mjs (2 hunks)
💤 Files with no reviewable changes (1)
  • components/stripe/actions/create-usage-record/create-usage-record.mjs
✅ Files skipped from review due to trivial changes (4)
  • components/stripe/actions/create-product/create-product.mjs
  • components/stripe/actions/create-payout/create-payout.mjs
  • components/stripe/actions/update-payment-intent/update-payment-intent.mjs
  • components/stripe/actions/create-price/create-price.mjs
🚧 Files skipped from review as they are similar to previous changes (46)
  • components/stripe/actions/retrieve-invoice/retrieve-invoice.mjs
  • components/stripe/actions/write-off-invoice/write-off-invoice.mjs
  • components/stripe/actions/delete-customer/delete-customer.mjs
  • components/stripe/actions/update-refund/update-refund.mjs
  • components/stripe/sources/abandoned-cart/abandoned-cart.mjs
  • components/stripe/actions/retrieve-invoice-item/retrieve-invoice-item.mjs
  • components/stripe/actions/finalize-invoice/finalize-invoice.mjs
  • components/stripe/actions/retrieve-balance/retrieve-balance.mjs
  • components/stripe/actions/retrieve-payout/retrieve-payout.mjs
  • components/stripe/package.json
  • components/stripe/sources/canceled-subscription/canceled-subscription.mjs
  • components/stripe/sources/new-failed-invoice-payment/new-failed-invoice-payment.mjs
  • components/stripe/actions/delete-invoice-item/delete-invoice-item.mjs
  • components/stripe/actions/send-invoice/send-invoice.mjs
  • components/stripe/sources/new-customer/new-customer.mjs
  • components/stripe/actions/create-refund/create-refund.mjs
  • components/stripe/actions/retrieve-checkout-session/retrieve-checkout-session.mjs
  • components/stripe/actions/void-invoice/void-invoice.mjs
  • components/stripe/actions/retrieve-payment-intent/retrieve-payment-intent.mjs
  • components/stripe/actions/retrieve-product/retrieve-product.mjs
  • components/stripe/sources/new-invoice/new-invoice.mjs
  • components/stripe/actions/delete-or-void-invoice/delete-or-void-invoice.mjs
  • components/stripe/actions/retrieve-refund/retrieve-refund.mjs
  • components/stripe/actions/create-customer/create-customer.mjs
  • components/stripe/actions/cancel-or-reverse-payout/cancel-or-reverse-payout.mjs
  • components/stripe/sources/new-dispute/new-dispute.mjs
  • components/stripe/actions/retrieve-price/retrieve-price.mjs
  • components/stripe/actions/update-payout/update-payout.mjs
  • components/stripe/actions/cancel-payment-intent/cancel-payment-intent.mjs
  • components/stripe/actions/retrieve-checkout-session-line-items/retrieve-checkout-session-line-items.mjs
  • components/stripe/actions/update-customer/update-customer.mjs
  • components/stripe/sources/subscription-updated/subscription-updated.mjs
  • components/stripe/sources/new-subscription/new-subscription.mjs
  • components/stripe/actions/list-refunds/list-refunds.mjs
  • components/stripe/actions/update-invoice-item/update-invoice-item.mjs
  • components/stripe/sources/new-failed-payment/new-failed-payment.mjs
  • components/stripe/actions/retrieve-customer/retrieve-customer.mjs
  • components/stripe/actions/create-payment-intent/create-payment-intent.mjs
  • components/stripe/sources/new-payment/new-payment.mjs
  • components/stripe/sources/custom-webhook-events/custom-webhook-events.mjs
  • components/stripe/actions/create-invoice/create-invoice.mjs
  • components/stripe/actions/confirm-payment-intent/confirm-payment-intent.mjs
  • components/stripe/actions/create-subscription/create-subscription.mjs
  • components/stripe/actions/capture-payment-intent/capture-payment-intent.mjs
  • components/stripe/actions/update-invoice/update-invoice.mjs
  • components/stripe/actions/list-payment-intents/list-payment-intents.mjs
🔇 Additional comments (31)
components/stripe/common/utils.mjs (2)

1-22: Well-structured recursive JSON parsing implementation

This is a solid implementation of a recursive JSON parser that handles nested objects and strings. The recursion is implemented correctly with proper error handling.


33-41: Clean utility export with additional validation

Good approach wrapping the parseJson function with extra validation to ensure it always returns an object. This provides a consistent interface for consumers of this utility.

components/stripe/actions/create-invoice-item/create-invoice-item.mjs (3)

3-3: Good addition of utility import

Adding the utils import enables consistent parsing of JSON options across Stripe actions.


9-9: Version increment reflects API changes

Appropriate version increment from 0.1.1 to 0.1.2 to reflect the changes in implementation.


87-113:

❓ Verification inconclusive

Updated to use new Stripe SDK structure

The changes correctly adapt to the new Stripe SDK structure by:

  1. Destructuring props more cleanly
  2. Using the nested pricing object structure for price
  3. Properly parsing the advanced options with utils.parseJson

These changes align with Stripe's latest API version requirements.

One thing to verify:


🏁 Script executed:

#!/bin/bash
# Check Stripe API docs to understand the proper structure for invoice item creation
curl -s https://api.stripe.com/v1/invoiceitems | grep -A 5 pricing

Length of output: 68


Please verify the pricing parameter structure

The changes correctly adapt to the new Stripe SDK structure by:

  1. Destructuring props more cleanly
  2. Using the nested pricing object for price
  3. Properly parsing the advanced options with utils.parseJson

Before approving, confirm that InvoiceItems.create() in the latest Stripe Node.js SDK supports:

...(price
  ? {
      pricing: {
        price,
      },
    }
  : {}
),

File: components/stripe/actions/create-invoice-item/create-invoice-item.mjs
Lines: 87–113

components/stripe/actions/create-billing-meter/create-billing-meter.mjs (2)

3-9: Well-structured new Billing Meter component

Good implementation of the new Billing Meter component with proper metadata. The description clearly explains the purpose and links to relevant documentation.


9-68: Comprehensive props configuration

The props are well-defined with clear descriptions, appropriate types, and useful options for dropdowns. The optional flags are correctly applied where needed.

components/stripe/actions/list-balance-history/list-balance-history.mjs (5)

2-2: Added utils import for date conversion

Good addition of the utils import to leverage the date conversion functionality.


8-8: Significant version increment

The version has been updated from 0.1.1 to 0.1.6, which is a larger jump than other files. This is appropriate given the number of new filtering and pagination features added.


22-28: Default country addition for currency

Added a default country of "US" for the currency prop, which improves usability by providing a sensible default.


42-77: Enhanced filtering and pagination capabilities

The added props for date-based filtering (createdGt, createdGte, createdLt, createdLte) and pagination (endingBefore, startingAfter) significantly improve the action's flexibility.


79-114: Well-implemented filtering logic

The refactored run method correctly:

  1. Destructures properties for better readability
  2. Conditionally includes date filters only when needed
  3. Properly converts date strings to integer timestamps
  4. Includes pagination parameters directly

This implementation aligns with Stripe API expectations while providing a clean interface.

components/stripe/actions/list-customers/list-customers.mjs (5)

2-2: Good addition of utility module import.

The utils module import is a welcome addition that allows for reusable functionality across different actions.


8-9: Appropriate version bump and description update.

The version increment from 0.1.1 to 0.1.2 appropriately reflects the enhancement of the component with additional filtering capabilities. The updated description also provides clearer documentation reference.


25-60: Great enhancement with additional filtering and pagination options.

The addition of date range filters and pagination parameters significantly improves the component's flexibility and aligns with Stripe's API capabilities. These props will allow users to create more targeted queries and handle large result sets more efficiently.


63-74: Good refactoring to use direct destructuring.

Replacing lodash.pick with direct destructuring makes the code more modern and removes an external dependency, which is a good practice.


75-93: Clean implementation of conditional date filtering.

The implementation of date filtering and cursor-based pagination is clean and well-structured. The conditional construction of the created filter object only when needed is an efficient approach. The use of utils.fromDateToInteger ensures proper conversion of ISO date strings to the UNIX timestamps required by Stripe's API.

components/stripe/actions/list-invoices/list-invoices.mjs (5)

2-2: Good addition of utility module import.

Consistent with other actions, adding the utils module import enables reuse of common functions.


8-8: Appropriate version bump.

The version increment from 0.1.1 to 0.1.2 correctly reflects the enhancement nature of these changes.


49-84: Great enhancement with filtering and pagination options.

Adding date range filters and pagination parameters provides users with more control over their queries, especially useful for accounts with many invoices.


87-100: Good refactoring to use direct property destructuring.

The refactoring from lodash.pick to direct destructuring improves code readability and removes an external dependency.


102-123: Well-implemented date filtering logic.

The conditional construction of the date filtering parameters is clean and efficient, only adding the filter when at least one date parameter is provided. The conversion from ISO dates to UNIX timestamps using the utility function maintains consistency across the codebase.

components/stripe/stripe.app.mjs (3)

1-1: Updated Stripe SDK import style.

Changed from default import to named import, which aligns with the newer versions of the Stripe SDK.


642-701: Excellent addition of filtering and pagination prop definitions.

The comprehensive set of new prop definitions for date filtering (created and arrival dates) and cursor-based pagination significantly enhances the capabilities of all Stripe actions. The detailed descriptions will help users understand how to use these parameters correctly.


707-709:

❌ Incorrect review comment

Updated Stripe SDK instantiation and API version.

The change to use constructor-style instantiation (new Stripe) and updating the API version are key parts of this upgrade.

However, the API version "2025-03-31.basil" seems unusual with its future date and .basil suffix.


🌐 Web query:

What is the latest stable Stripe API version? Is "2025-03-31.basil" a valid Stripe API version?

💡 Result:

The latest stable Stripe API version is 2025-04-30.basil[1][2]. This is the current version as documented in Stripe's API reference.

Yes, "2025-03-31.basil" is a valid Stripe API version. It was the previous stable version before the latest update[8][10]. Stripe follows a versioning system where they release new API versions monthly with no breaking changes, and "basil" refers to the major release name[5]. Each version is named with the date it was released (in this case, March 31, 2025, for the previous version and April 30, 2025, for the current version).

How Stripe Versioning Works

Stripe's API versioning follows a specific pattern:

  • Monthly releases that include only backward-compatible changes
  • Major releases (like "basil") twice a year that may include breaking changes[5]
  • Each version is named with its release date followed by the major release name

When integrating with Stripe, you can specify which API version to use by:

  1. Setting it globally in your SDK initialization
  2. Setting it per request using the Stripe-Version header
  3. Using your account's default version set in Workbench[3]

For example, you can specify the version in a curl request:

curl https://api.stripe.com/v1/charges \
-u : \
-H "Stripe-Version: 2025-04-30.basil"

Or when initializing the Node.js library:

const stripe = require('stripe')('', {
  apiVersion: '2025-04-30.basil',
});

It's generally recommended to explicitly set your API version in code rather than relying on your account's default version to ensure consistent behavior as you develop and maintain your application[3].

Citations:


Stripe API version validity

The API version "2025-03-31.basil" is valid—it corresponds to Stripe’s March 31, 2025 release (Stripe uses YYYY-MM-DD plus a release name). If you’d rather target the very latest stable release, you can bump this to "2025-04-30.basil", but using "2025-03-31.basil" is perfectly acceptable.

Likely an incorrect or invalid review comment.

components/stripe/actions/list-payouts/list-payouts.mjs (6)

2-2: Good addition of utility module import.

The utils module import enables reuse of date conversion functionality across different actions.


8-8: Appropriate version increment.

The version bump from 0.1.1 to 0.1.2 properly reflects the enhancement nature of these changes.


25-90: Comprehensive enhancement with filtering and pagination options.

The addition of creation date filters, arrival date filters, destination filtering, and pagination parameters significantly improves the component's flexibility. This is especially useful for accounts with many payouts that need to be filtered by different criteria.


93-108: Good refactoring to use direct property destructuring.

The refactoring from lodash.pick to direct destructuring makes the code more readable and maintainable.


110-138: Well-implemented filtering logic with conditional parameters.

The implementation of date filtering (for both created and arrival_date) is clean and efficient. The conditional construction of filter objects only when needed reduces unnecessary parameters in the API call. The use of the utility function for date conversion ensures consistency across the codebase.


144-144: Improved summary message with conditional formatting.

The updated summary message that conditionally includes the status when available provides more relevant feedback to the user.

@jcortes jcortes linked an issue May 8, 2025 that may be closed by this pull request
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[Usability Audit] Stripe [FEATURE] Upgrade Pipedream Stripe App to Latest Stable API Version
2 participants