Skip to content

Conversation

@jcortes
Copy link
Collaborator

@jcortes jcortes commented Apr 28, 2025

WHY

Resolves #16415 and #16554

Summary by CodeRabbit

Summary by CodeRabbit

  • New Features
    • Added a new action to create billing meters for Stripe billing aggregation.
    • Introduced a utility module for JSON parsing and date conversion to enhance parameter handling.
    • 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.
    • Renamed many properties to camelCase for consistency and clarity.
    • Incremented version numbers across multiple Stripe actions and source components for consistency.
    • Removed deprecated or unused properties and simplified parameter handling by removing advanced options across actions.
    • Refactored actions to explicitly map parameters and parse JSON metadata for improved clarity and reliability.

@jcortes jcortes self-assigned this Apr 28, 2025
@vercel
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 27, 2025 7:08pm
pipedream-docs ⬜️ Ignored (Inspect) May 27, 2025 7:08pm
pipedream-docs-redirect-do-not-edit ⬜️ Ignored (Inspect) May 27, 2025 7:08pm

@coderabbitai
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), `fromDateToInteger` (date string to timestamp), and `parseArray` (JSON array parsing).|
| 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/create-customer.mjs                                      | Expanded props extensively; replaced lodash.pick with explicit destructuring and conditional nested objects; imported utils for parsing; bumped version. |
| components/stripe/actions/cancel-payment-intent/cancel-payment-intent.mjs                          | Renamed props to camelCase; removed lodash.pick; refactored run method to explicit param usage; bumped version.   |
| components/stripe/actions/capture-payment-intent/capture-payment-intent.mjs                        | Renamed props to camelCase; replaced advanced with explicit props; removed lodash.pick; refactored run method; bumped version. |
| components/stripe/actions/confirm-payment-intent/confirm-payment-intent.mjs                        | Renamed props to camelCase; added many new props; replaced advanced with explicit props parsed via utils; refactored run method; bumped version. |
| components/stripe/actions/create-invoice/create-invoice.mjs                                        | Renamed and restructured props; added automatic tax props; replaced lodash.pick with explicit param construction; bumped version. |
| components/stripe/actions/create-invoice-item/create-invoice-item.mjs                              | Renamed props; removed advanced; replaced lodash.pick with explicit param passing; bumped version.               |
| components/stripe/actions/create-payment-intent/create-payment-intent.mjs                          | Renamed props to camelCase; removed lodash.pick; replaced advanced with explicit props; refactored run method; bumped version. |
| components/stripe/actions/create-payout/create-payout.mjs                                          | Renamed props to camelCase; removed lodash.pick; explicitly marked required props; refactored run method; bumped version. |
| components/stripe/actions/create-price/create-price.mjs                                            | Version bump only.                                                                                                |
| components/stripe/actions/create-product/create-product.mjs                                        | Renamed and added descriptions to props; conditionally included nested default_price_data; bumped version.       |
| components/stripe/actions/create-refund/create-refund.mjs                                          | Renamed props to camelCase; removed lodash.pick; replaced advanced with explicit props; refactored run method; bumped version. |
| components/stripe/actions/create-subscription/create-subscription.mjs                              | Renamed props to camelCase; added automatic tax and payment behavior props; replaced lodash.pick with explicit param construction; imported utils; bumped version. |
| components/stripe/actions/list-balance-history/list-balance-history.mjs                            | Added filtering and pagination props; replaced lodash.pick with explicit param construction; enhanced prop definitions; bumped version to 0.1.6. |
| components/stripe/actions/list-customers/list-customers.mjs                                       | Added filtering and pagination props; replaced lodash.pick with explicit param construction; imported utils; bumped version. |
| components/stripe/actions/list-invoices/list-invoices.mjs                                         | Added filtering and pagination props; renamed props; replaced lodash.pick with explicit param construction; imported utils; bumped version. |
| components/stripe/actions/list-payment-intents/list-payment-intents.mjs                            | Removed advanced prop; simplified run method; removed lodash.pick; bumped version.                               |
| components/stripe/actions/list-payouts/list-payouts.mjs                                           | Added filtering and pagination props; redefined status prop explicitly; replaced lodash.pick; imported utils; bumped version. |
| components/stripe/actions/list-refunds/list-refunds.mjs                                           | Renamed props to camelCase; removed lodash.pick; replaced advanced with explicit param construction; bumped version. |
| components/stripe/actions/retrieve-balance/retrieve-balance.mjs                                  | Version bump only.                                                                                                |
| components/stripe/actions/retrieve-checkout-session-line-items/retrieve-checkout-session-line-items.mjs | Renamed props to camelCase; updated run method accordingly; bumped version.                                      |
| components/stripe/actions/retrieve-checkout-session/retrieve-checkout-session.mjs                  | Renamed prop to camelCase; destructured props in run method; bumped version.                                     |
| components/stripe/actions/retrieve-customer/retrieve-customer.mjs                                | Version bump only.                                                                                                |
| components/stripe/actions/retrieve-invoice-item/retrieve-invoice-item.mjs                          | Corrected propDefinition key; version bump.                                                                     |
| components/stripe/actions/retrieve-invoice/retrieve-invoice.mjs                                  | Version bump only.                                                                                                |
| components/stripe/actions/retrieve-payment-intent/retrieve-payment-intent.mjs                      | Renamed props to camelCase; destructured props in run method; bumped version.                                    |
| components/stripe/actions/retrieve-payout/retrieve-payout.mjs                                    | Version bump only.                                                                                                |
| components/stripe/actions/retrieve-price/retrieve-price.mjs                                      | Version bump only.                                                                                                |
| components/stripe/actions/retrieve-product/retrieve-product.mjs                                  | Renamed prop to camelCase; version bump.                                                                        |
| components/stripe/actions/retrieve-refund/retrieve-refund.mjs                                    | Version bump only.                                                                                                |
| components/stripe/actions/send-invoice/send-invoice.mjs                                          | Version bump only.                                                                                                |
| components/stripe/actions/update-customer/update-customer.mjs                                    | Added utils import; replaced advanced spread with JSON parsing; renamed address props; bumped version.           |
| components/stripe/actions/update-invoice-item/update-invoice-item.mjs                            | Added utils import; replaced advanced spread with JSON parsing; corrected propDefinition key; bumped version.    |
| components/stripe/actions/update-invoice/update-invoice.mjs                                      | Added utils import; replaced advanced spread with JSON parsing; renamed props to camelCase; added new payment method props; bumped version. |
| components/stripe/actions/update-payment-intent/update-payment-intent.mjs                        | Version bump only; renamed props to camelCase; replaced advanced with explicit props; enhanced shipping and statement descriptor handling. |
| components/stripe/actions/update-payout/update-payout.mjs                                        | Version bump only; reformatted prop definitions; destructured props in run method.                              |
| components/stripe/actions/update-refund/update-refund.mjs                                        | Version bump only; reformatted prop definitions; destructured props in run method.                              |
| components/stripe/actions/void-invoice/void-invoice.mjs                                          | Version bump only; destructured props in run method.                                                           |
| components/stripe/actions/write-off-invoice/write-off-invoice.mjs                                | Version bump only; destructured props in run method.                                                           |
| components/stripe/sources/abandoned-cart/abandoned-cart.mjs                                     | Version bump only.                                                                                                |
| components/stripe/sources/canceled-subscription/canceled-subscription.mjs                        | Version bump only.                                                                                                |
| components/stripe/sources/custom-webhook-events/custom-webhook-events.mjs                        | Version bump only.                                                                                                |
| components/stripe/sources/new-customer/new-customer.mjs                                         | Version bump only.                                                                                                |
| components/stripe/sources/new-dispute/new-dispute.mjs                                           | Version bump only.                                                                                                |
| components/stripe/sources/new-failed-invoice-payment/new-failed-invoice-payment.mjs              | Version bump only.                                                                                                |
| components/stripe/sources/new-failed-payment/new-failed-payment.mjs                             | Version bump only.                                                                                                |
| components/stripe/sources/new-invoice/new-invoice.mjs                                           | Version bump only.                                                                                                |
| components/stripe/sources/new-payment/new-payment.mjs                                           | Version bump only.                                                                                                |
| components/stripe/sources/new-subscription/new-subscription.mjs                                 | Version bump only.                                                                                                |
| components/stripe/sources/subscription-updated/subscription-updated.mjs                         | Version bump; added new event "customer.subscription.updated" to getEvents method.                               |
| components/stripe/actions/create-usage-record/create-usage-record.mjs                           | Removed entire action module.                                                                                     |
| components/stripe/actions/search-customers/search-customers.mjs                                | Changed email prop to use propDefinition; refactored run method to destructure props; removed explicit API version in SDK call; bumped version. |
| components/stripe/common/constants.mjs                                                          | Added new constant `API_VERSION` set to "2025-03-31.basil".                                                      |
| components/stripe/sources/common/webhook-base.mjs                                              | Renamed import and prop from `stripe` to `app`; replaced all `this.stripe` references with `this.app`.           |

## 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)

Suggested labels

enhancement, pd-api

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 Object.getPackageJSONURL (node:internal/modules/package_json_reader:255:9)
>     at packageResolve (node:internal/modules/esm/resolve:767:81)
>     at moduleResolve (node:internal/modules/esm/resolve:853:18)
>     at defaultResolve (node:internal/modules/esm/resolve:983:11)
>     at ModuleLoader.defaultResolve (node:internal/modules/esm/loader:799:12)
>     at #cachedDefaultResolve (node:internal/modules/esm/loader:723:25)
>     at ModuleLoader.resolve (node:internal/modules/esm/loader:706:38)
>     at ModuleLoader.getModuleJobForImport (node:internal/modules/esm/loader:307:38)
>     at #link (node:internal/modules/esm/module_job:170: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 Object.getPackageJSONURL (node:internal/modules/package_json_reader:255:9)
>     at packageResolve (node:internal/modules/esm/resolve:767:81)
>     at moduleResolve (node:internal/modules/esm/resolve:853:18)
>     at defaultResolve (node:internal/modules/esm/resolve:983:11)
>     at ModuleLoader.defaultResolve (node:internal/modules/esm/loader:799:12)
>     at #cachedDefaultResolve (node:internal/modules/esm/loader:723:25)
>     at ModuleLoader.resolve (node:internal/modules/esm/loader:706:38)
>     at ModuleLoader.getModuleJobForImport (node:internal/modules/esm/loader:307:38)
>     at #link (node:internal/modules/esm/module_job:170:49)
> 
> </details>
> 
> <details>
> <summary>components/stripe/actions/capture-payment-intent/capture-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 Object.getPackageJSONURL (node:internal/modules/package_json_reader:255:9)
>     at packageResolve (node:internal/modules/esm/resolve:767:81)
>     at moduleResolve (node:internal/modules/esm/resolve:853:18)
>     at defaultResolve (node:internal/modules/esm/resolve:983:11)
>     at ModuleLoader.defaultResolve (node:internal/modules/esm/loader:799:12)
>     at #cachedDefaultResolve (node:internal/modules/esm/loader:723:25)
>     at ModuleLoader.resolve (node:internal/modules/esm/loader:706:38)
>     at ModuleLoader.getModuleJobForImport (node:internal/modules/esm/loader:307:38)
>     at #link (node:internal/modules/esm/module_job:170:49)
> 
> </details>
> 
> + 57 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.`
  - `Explain this complex logic.`
  - `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 explain this code block.`
  -	`@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 explain its main purpose.`
  - `@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 2 times, most recently 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
@jcortes jcortes force-pushed the stripe-upgrade-to-latest-api-version branch from 8c41a71 to 9ac195a Compare May 12, 2025 23:02
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: 2

🔭 Outside diff range comments (1)
components/stripe/actions/search-customers/search-customers.mjs (1)

4-7: 💡 Verification agent

🧩 Analysis chain

Consider incrementing the component version.

The component is still at version "0.0.1" despite SDK changes. The PR summary mentions version increments for Stripe actions, so this might have been overlooked.

-  version: "0.0.1",
+  version: "0.1.2",

🏁 Script executed:

#!/bin/bash
# Check if other Stripe action components were updated to version 0.1.2
echo "Checking versions of other Stripe actions..."
fd -t f "actions/.*/.*\.mjs$" components/stripe/ | xargs grep -l "version:" | xargs grep "version:" | sort | uniq -c

Length of output: 213


🏁 Script executed:

#!/bin/bash
echo "Listing version strings in all Stripe action .mjs files:"
fd -t f -e mjs components/stripe/actions | xargs grep -H 'version:'

Length of output: 596


🏁 Script executed:

#!/bin/bash
echo "Searching for version declarations in Stripe actions..."
grep -R -H "version:" components/stripe/actions

Length of output: 4064


Please bump the Search Customers action version to match the other Stripe actions

The search-customers action is still at version "0.0.1", while most other Stripe actions in this PR have been updated to "0.1.2". Update its version to keep consistency:

• File: components/stripe/actions/search-customers/search-customers.mjs

-  version: "0.0.1",
+  version: "0.1.2",
🧹 Nitpick comments (1)
components/stripe/actions/confirm-payment-intent/confirm-payment-intent.mjs (1)

261-289: Optional: build the shipping object more defensively

Currently all keys are sent, even when undefined. While Stripe often ignores undefined, omitting empty keys keeps requests lean and avoids unexpected validation issues for strict fields (e.g. empty line1).

Consider filtering undefined entries:

-            shipping: {
-              address: {
-                city: shippingAddressCity,
-                country: shippingAddressCountry,
-                line1: shippingAddressLine1,
-                line2: shippingAddressLine2,
-                postal_code: shippingAddressPostalCode,
-                state: shippingAddressState,
-              },
-              name: shippingName,
-              carrier: shippingCarrier,
-              phone: shippingPhone,
-              tracking_number: shippingTrackingNumber,
-            },
+            shipping: app.cleanObject({
+              address: app.cleanObject({
+                city: shippingAddressCity,
+                country: shippingAddressCountry,
+                line1: shippingAddressLine1,
+                line2: shippingAddressLine2,
+                postal_code: shippingAddressPostalCode,
+                state: shippingAddressState,
+              }),
+              name: shippingName,
+              carrier: shippingCarrier,
+              phone: shippingPhone,
+              tracking_number: shippingTrackingNumber,
+            }),

Where cleanObject is a small helper that strips undefined values.

📜 Review details

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

📥 Commits

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

📒 Files selected for processing (37)
  • components/stripe/actions/cancel-or-reverse-payout/cancel-or-reverse-payout.mjs (1 hunks)
  • components/stripe/actions/cancel-payment-intent/cancel-payment-intent.mjs (2 hunks)
  • components/stripe/actions/capture-payment-intent/capture-payment-intent.mjs (1 hunks)
  • components/stripe/actions/confirm-payment-intent/confirm-payment-intent.mjs (3 hunks)
  • components/stripe/actions/create-billing-meter/create-billing-meter.mjs (1 hunks)
  • components/stripe/actions/create-customer/create-customer.mjs (1 hunks)
  • components/stripe/actions/create-invoice-item/create-invoice-item.mjs (2 hunks)
  • components/stripe/actions/create-invoice/create-invoice.mjs (1 hunks)
  • components/stripe/actions/create-payment-intent/create-payment-intent.mjs (2 hunks)
  • components/stripe/actions/create-payout/create-payout.mjs (2 hunks)
  • components/stripe/actions/create-price/create-price.mjs (1 hunks)
  • components/stripe/actions/create-product/create-product.mjs (4 hunks)
  • components/stripe/actions/create-refund/create-refund.mjs (4 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 (2 hunks)
  • components/stripe/actions/delete-or-void-invoice/delete-or-void-invoice.mjs (2 hunks)
  • components/stripe/actions/finalize-invoice/finalize-invoice.mjs (2 hunks)
  • components/stripe/actions/list-balance-history/list-balance-history.mjs (2 hunks)
  • components/stripe/actions/list-customers/list-customers.mjs (2 hunks)
  • components/stripe/actions/list-invoices/list-invoices.mjs (3 hunks)
  • components/stripe/actions/list-payment-intents/list-payment-intents.mjs (2 hunks)
  • components/stripe/actions/list-payouts/list-payouts.mjs (1 hunks)
  • components/stripe/actions/list-refunds/list-refunds.mjs (3 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 (2 hunks)
  • components/stripe/actions/retrieve-checkout-session/retrieve-checkout-session.mjs (2 hunks)
  • components/stripe/actions/retrieve-customer/retrieve-customer.mjs (1 hunks)
  • components/stripe/actions/retrieve-invoice-item/retrieve-invoice-item.mjs (2 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/search-customers/search-customers.mjs (3 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 (1)
  • components/stripe/actions/retrieve-invoice-item/retrieve-invoice-item.mjs
🚧 Files skipped from review as they are similar to previous changes (29)
  • components/stripe/actions/delete-customer/delete-customer.mjs
  • components/stripe/actions/retrieve-invoice/retrieve-invoice.mjs
  • components/stripe/actions/create-price/create-price.mjs
  • components/stripe/actions/retrieve-refund/retrieve-refund.mjs
  • components/stripe/actions/retrieve-price/retrieve-price.mjs
  • components/stripe/actions/retrieve-payout/retrieve-payout.mjs
  • components/stripe/actions/delete-invoice-item/delete-invoice-item.mjs
  • components/stripe/actions/retrieve-customer/retrieve-customer.mjs
  • components/stripe/actions/retrieve-balance/retrieve-balance.mjs
  • components/stripe/actions/cancel-or-reverse-payout/cancel-or-reverse-payout.mjs
  • components/stripe/actions/delete-or-void-invoice/delete-or-void-invoice.mjs
  • components/stripe/actions/create-billing-meter/create-billing-meter.mjs
  • components/stripe/actions/retrieve-product/retrieve-product.mjs
  • components/stripe/actions/list-payment-intents/list-payment-intents.mjs
  • components/stripe/actions/retrieve-checkout-session/retrieve-checkout-session.mjs
  • components/stripe/actions/retrieve-payment-intent/retrieve-payment-intent.mjs
  • components/stripe/actions/list-customers/list-customers.mjs
  • components/stripe/actions/list-balance-history/list-balance-history.mjs
  • components/stripe/actions/finalize-invoice/finalize-invoice.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/list-refunds/list-refunds.mjs
  • components/stripe/actions/create-payout/create-payout.mjs
  • components/stripe/actions/create-refund/create-refund.mjs
  • components/stripe/actions/create-product/create-product.mjs
  • components/stripe/actions/create-invoice-item/create-invoice-item.mjs
  • components/stripe/actions/list-payouts/list-payouts.mjs
  • components/stripe/actions/create-payment-intent/create-payment-intent.mjs
  • components/stripe/actions/list-invoices/list-invoices.mjs
⏰ Context from checks skipped due to timeout of 90000ms (4)
  • GitHub Check: pnpm publish
  • GitHub Check: Verify TypeScript components
  • GitHub Check: Lint Code Base
  • GitHub Check: Publish TypeScript components
🔇 Additional comments (35)
components/stripe/actions/search-customers/search-customers.mjs (6)

19-22: Good refactoring to use centralized prop definition.

This change improves consistency by leveraging the centralized email propDefinition from the Stripe app, which eliminates redundant field definitions and ensures standardized properties across components.


53-55: Code formatting improvement.

The conditional check for empty date strings is now better formatted with consistent indentation, improving readability without changing the function's logic.


92-96: Good use of destructuring for improved readability.

Destructuring these properties and methods at the beginning of the function makes the code more maintainable and eliminates repetitive this. references throughout the method.


98-98: Cleaner method invocation.

Using the destructured method improves code clarity by making it explicit which function is being called without the this prefix.


105-105: Updated SDK client instantiation style.

This change correctly aligns with the updated Stripe SDK usage pattern, removing the explicit API version parameter as this is now handled by the app's sdk method.


107-107: Consistent parameter passing.

Using the destructured limit variable maintains consistency with the destructuring pattern established earlier in the method.

components/stripe/actions/capture-payment-intent/capture-payment-intent.mjs (6)

7-7: Version bump looks appropriate.

The version increment from 0.1.1 to 0.1.2 is appropriate for these non-breaking enhancements.


15-18: Good conversion from snake_case to camelCase.

Renaming from payment_intent to paymentIntent follows JavaScript conventions while maintaining the same functionality. This improves code consistency.


19-25: Improved property definition with better description.

The renamed property amountToCapture now has a more descriptive explanation that clarifies its default behavior.


26-61: Well-structured explicit properties replacing generic 'advanced' option.

Breaking out specific properties with appropriate types and descriptions improves developer experience and code clarity. Each property is well-documented with its purpose and behavior.


64-87: Improved parameter handling with explicit mapping.

The refactored run method with explicit property destructuring and mapping to the Stripe SDK parameters is much clearer than the previous implementation. The conditional inclusion of the transfer_data object only when needed is particularly well-implemented.


88-90: Updated summary message to match new property naming.

The export summary has been correctly updated to reflect the new camelCase property naming.

components/stripe/actions/create-subscription/create-subscription.mjs (7)

1-2: Good addition of utilities module.

Adding the utils import provides reusable functions for JSON and array parsing, improving code reusability across the Stripe component.


8-8: Version bump is appropriate.

The version increment from 0.1.1 to 0.1.2 correctly reflects the non-breaking enhancements made to this component.


50-62: Improved property naming and descriptions.

The conversion from snake_case to camelCase (collection_methodcollectionMethod, days_until_duedaysUntilDue) follows JavaScript conventions while maintaining clear documentation.


72-85: Better property organization with improved labels.

Renaming to defaultPaymentMethod with a clear label and description improves the developer experience.


92-124: Well-structured new properties for automatic tax and payment behavior.

The addition of explicit properties for automatic tax calculation and payment behavior options enhances the component's functionality. Each property has appropriate types, labels, descriptions, and options where applicable.


127-141: Clean property destructuring in run method.

Explicitly destructuring all properties makes the code more readable and maintainable.


143-170: Well-implemented parameter construction with conditional logic.

The subscription creation call now explicitly sets each parameter and includes conditional logic for automatic tax parameters. The use of utils.parseJson and utils.parseArray ensures proper handling of string inputs.

components/stripe/actions/create-invoice/create-invoice.mjs (6)

7-8: Version bump and improved description.

The version increment and updated documentation link improve the component's maintainability.


11-15: Good renaming to camelCase.

Converting from auto_advance to autoAdvance follows JavaScript conventions.


17-38: Well-structured automatic tax properties.

The new properties for automatic tax calculation are well-documented with appropriate types, labels, and descriptions.


39-63: Improved property organization.

The restructured properties with consistent camelCase naming and clear descriptions enhance developer experience.


93-106: Clean property destructuring.

Explicitly destructuring all properties improves code readability.


107-131: Well-implemented conditional parameter construction.

The invoice creation call now explicitly sets each parameter with a clean conditional inclusion of the automatic_tax object only when relevant properties are provided.

components/stripe/actions/create-customer/create-customer.mjs (9)

1-2: Good addition of utilities module.

Adding the utils module provides functions for parsing JSON and arrays, improving code reusability across components.


8-9: Version bump with improved documentation.

The version increment and updated documentation link enhance the component's maintainability.


31-72: Improved property naming and organization.

Converting properties from snake_case to camelCase (e.g., addressLine1 instead of line1) improves consistency with JavaScript conventions.


73-90: Enhanced payment method properties.

The improved structure with paymentMethodType and dependent paymentMethod provides better control and clarity.


97-150: Comprehensive shipping address fields.

The addition of detailed shipping address fields with clear labeling improves the component's functionality and usability.


151-166: Well-structured tax-related properties.

The new tax-related properties are well-documented with appropriate types, labels, and descriptions.


167-253: Comprehensive customer configuration options.

The extensive addition of properties for balance, cash balance, invoice settings, and other customer configurations significantly enhances the component's capabilities.


256-292: Clean and comprehensive property destructuring.

The explicit destructuring of all properties improves code readability and maintainability.


294-391: Well-implemented conditional parameter construction.

The customer creation call uses an excellent pattern of conditional inclusion for nested objects (address, shipping, tax, cash_balance, invoice_settings) only when relevant fields are provided. This prevents sending unnecessary empty objects to the API and makes the code more efficient.

The use of utils.parseArray for taxIdData ensures proper handling of string inputs.

components/stripe/actions/confirm-payment-intent/confirm-payment-intent.mjs (1)

116-126: Verify automatic_async capture method value

The Stripe docs (up to 2024-08) list automatic and manual as the only accepted capture_method values for payment_intents.confirm. automatic_async may be unsupported and would cause a validation error.

Please double-check against the 2025-03-31 API changelog.
If not valid, remove it from the options array.

@jcortes jcortes force-pushed the stripe-upgrade-to-latest-api-version branch from 9ac195a to f60fdb4 Compare May 12, 2025 23:07
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: 4

♻️ Duplicate comments (2)
components/stripe/actions/confirm-payment-intent/confirm-payment-intent.mjs (2)

192-196: ⚠️ Potential issue

paymentMethodOptions should be parsed as JSON.

The prop is defined as a string but Stripe expects an object for payment_method_options. This will cause runtime errors when users provide JSON strings.

-      payment_method_options: paymentMethodOptions,
+      payment_method_options: utils.parseJson(paymentMethodOptions),

Additionally, you need to import the utils module:

+import utils from "../../common/utils.mjs";

294-313: ⚠️ Potential issue

Fix logical operator precedence in mandate_data condition.

There's a logical operator precedence issue that can cause runtime errors. The && operator has higher precedence than ||, which means the condition might evaluate to a non-object value which cannot be spread.

-      ...(
-        mandateDataCustomerAcceptanceType
-        || mandateDataCustomerAcceptanceAcceptedAt
-        || mandateDataCustomerAcceptanceOffline
-        || mandateDataCustomerAcceptanceOnlineIpAddress
-        || mandateDataCustomerAcceptanceOnlineUserAgent
-        && {
-          mandate_data: {
-            customer_acceptance: {
-              type: mandateDataCustomerAcceptanceType,
-              accepted_at: mandateDataCustomerAcceptanceAcceptedAt,
-              offline: mandateDataCustomerAcceptanceOffline,
-              online: {
-                ip_address: mandateDataCustomerAcceptanceOnlineIpAddress,
-                user_agent: mandateDataCustomerAcceptanceOnlineUserAgent,
-              },
-            },
-          },
-        }
-      ),
+      ...(
+        mandateDataCustomerAcceptanceType
+        || mandateDataCustomerAcceptanceAcceptedAt
+        || mandateDataCustomerAcceptanceOffline
+        || mandateDataCustomerAcceptanceOnlineIpAddress
+        || mandateDataCustomerAcceptanceOnlineUserAgent
+          ? {
+            mandate_data: {
+              customer_acceptance: {
+                ...(mandateDataCustomerAcceptanceType && { type: mandateDataCustomerAcceptanceType }),
+                ...(mandateDataCustomerAcceptanceAcceptedAt && { accepted_at: mandateDataCustomerAcceptanceAcceptedAt }),
+                ...(mandateDataCustomerAcceptanceOffline && { offline: mandateDataCustomerAcceptanceOffline }),
+                ...(
+                  mandateDataCustomerAcceptanceOnlineIpAddress
+                  || mandateDataCustomerAcceptanceOnlineUserAgent
+                    ? {
+                      online: {
+                        ...(mandateDataCustomerAcceptanceOnlineIpAddress && { ip_address: mandateDataCustomerAcceptanceOnlineIpAddress }),
+                        ...(mandateDataCustomerAcceptanceOnlineUserAgent && { user_agent: mandateDataCustomerAcceptanceOnlineUserAgent }),
+                      },
+                    }
+                    : {}
+                ),
+              },
+            },
+          }
+          : {}
+      ),
🧹 Nitpick comments (6)
components/stripe/common/utils.mjs (1)

26-33: Consider adding validation for date format compatibility

The function correctly converts date strings to Unix timestamps (seconds since epoch) but doesn't validate that the input date format is compatible with Stripe's expectations.

const fromDateToInteger = (date) => {
  if (typeof date === "string") {
    const parsedDate = new Date(date);
    if (!isNaN(parsedDate.getTime())) {
+     // Ensure the timestamp is valid for Stripe's expected range
+     const timestamp = Math.floor(parsedDate.getTime() / 1000);
+     if (timestamp < 0) {
+       return null; // Avoid negative timestamps which might cause issues
+     }
-     return Math.floor(parsedDate.getTime() / 1000);
+     return timestamp;
    }
  }
+ return null; // Explicitly return null for invalid inputs
};
components/stripe/actions/create-subscription/create-subscription.mjs (1)

127-169: Fix logical issue in conditional automatic tax object

The automatic tax configuration logic is correct, but there's a risk of passing empty objects in the liability section.

automatic_tax: {
  enabled: automaticTaxEnabled,
-  ...(automaticTaxLiabilityType && {
+  ...(automaticTaxLiabilityType ? {
    liability: {
      type: automaticTaxLiabilityType,
-      ...(automaticTaxLiabilityAccount && {
+      ...(automaticTaxLiabilityAccount ? {
        account: automaticTaxLiabilityAccount,
-      }),
+      } : {}),
    },
-  }),
+  } : {}),
},
components/stripe/actions/update-payment-intent/update-payment-intent.mjs (2)

196-196: Consider adding error handling for JSON parsing.

The metadata is parsed with utils.parseJson, but there's no error handling if the parsing fails. This could lead to runtime errors if the metadata contains malformed JSON.

-      metadata: utils.parseJson(metadata),
+      metadata: utils.parseJson(metadata, {}),

231-236: Simplify conditional statement descriptor logic.

The nullish coalescing with undefined fallback is redundant since if the value is falsy, it would be handled by the condition in the spread.

-      ...(statementDescriptor && {
-        statement_descriptor: statementDescriptor?.slice(0, 21) || undefined,
-      }),
-      ...(statementDescriptorSuffix && {
-        statement_descriptor_suffix: statementDescriptorSuffix?.slice(0, 21) || undefined,
-      }),
+      ...(statementDescriptor && {
+        statement_descriptor: statementDescriptor.slice(0, 21),
+      }),
+      ...(statementDescriptorSuffix && {
+        statement_descriptor_suffix: statementDescriptorSuffix.slice(0, 21),
+      }),
components/stripe/actions/create-payment-intent/create-payment-intent.mjs (1)

83-87: Simplify conditional statement descriptor logic.

Similar to update-payment-intent.mjs, the nullish coalescing with undefined fallback is redundant.

-      ...(statementDescriptor && {
-        statement_descriptor: statementDescriptor?.slice(0, 21) || undefined,
-      }),
-      ...(statementDescriptorSuffix && {
-        statement_descriptor_suffix: statementDescriptorSuffix?.slice(0, 21) || undefined,
-      }),
+      ...(statementDescriptor && {
+        statement_descriptor: statementDescriptor.slice(0, 21),
+      }),
+      ...(statementDescriptorSuffix && {
+        statement_descriptor_suffix: statementDescriptorSuffix.slice(0, 21),
+      }),
components/stripe/stripe.app.mjs (1)

359-360: Fix typo in "resource" name property description.

There's a typo in the property description for name - "resouce" should be "resource".

-      description: "The resouce name",
+      description: "The resource name",
📜 Review details

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

📥 Commits

Reviewing files that changed from the base of the PR and between 9ac195a and f60fdb4.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (38)
  • components/stripe/actions/cancel-payment-intent/cancel-payment-intent.mjs (2 hunks)
  • components/stripe/actions/capture-payment-intent/capture-payment-intent.mjs (1 hunks)
  • components/stripe/actions/confirm-payment-intent/confirm-payment-intent.mjs (3 hunks)
  • components/stripe/actions/create-customer/create-customer.mjs (1 hunks)
  • components/stripe/actions/create-invoice-item/create-invoice-item.mjs (2 hunks)
  • components/stripe/actions/create-invoice/create-invoice.mjs (1 hunks)
  • components/stripe/actions/create-payment-intent/create-payment-intent.mjs (2 hunks)
  • components/stripe/actions/create-payout/create-payout.mjs (2 hunks)
  • components/stripe/actions/create-product/create-product.mjs (4 hunks)
  • components/stripe/actions/create-refund/create-refund.mjs (4 hunks)
  • components/stripe/actions/create-subscription/create-subscription.mjs (3 hunks)
  • components/stripe/actions/delete-invoice-item/delete-invoice-item.mjs (2 hunks)
  • components/stripe/actions/delete-or-void-invoice/delete-or-void-invoice.mjs (2 hunks)
  • components/stripe/actions/finalize-invoice/finalize-invoice.mjs (2 hunks)
  • components/stripe/actions/list-balance-history/list-balance-history.mjs (2 hunks)
  • components/stripe/actions/list-invoices/list-invoices.mjs (3 hunks)
  • components/stripe/actions/list-payment-intents/list-payment-intents.mjs (2 hunks)
  • components/stripe/actions/list-payouts/list-payouts.mjs (1 hunks)
  • components/stripe/actions/list-refunds/list-refunds.mjs (3 hunks)
  • components/stripe/actions/retrieve-checkout-session-line-items/retrieve-checkout-session-line-items.mjs (2 hunks)
  • components/stripe/actions/retrieve-checkout-session/retrieve-checkout-session.mjs (2 hunks)
  • components/stripe/actions/retrieve-invoice-item/retrieve-invoice-item.mjs (2 hunks)
  • components/stripe/actions/retrieve-payment-intent/retrieve-payment-intent.mjs (1 hunks)
  • components/stripe/actions/retrieve-product/retrieve-product.mjs (1 hunks)
  • components/stripe/actions/search-customers/search-customers.mjs (4 hunks)
  • components/stripe/actions/update-customer/update-customer.mjs (4 hunks)
  • components/stripe/actions/update-invoice-item/update-invoice-item.mjs (3 hunks)
  • components/stripe/actions/update-invoice/update-invoice.mjs (3 hunks)
  • components/stripe/actions/update-payment-intent/update-payment-intent.mjs (3 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 (2 hunks)
  • components/stripe/actions/write-off-invoice/write-off-invoice.mjs (2 hunks)
  • components/stripe/common/constants.mjs (2 hunks)
  • components/stripe/common/utils.mjs (1 hunks)
  • components/stripe/package.json (2 hunks)
  • components/stripe/sources/common/webhook-base.mjs (4 hunks)
  • components/stripe/stripe.app.mjs (9 hunks)
✅ Files skipped from review due to trivial changes (1)
  • components/stripe/common/constants.mjs
🚧 Files skipped from review as they are similar to previous changes (24)
  • components/stripe/actions/delete-invoice-item/delete-invoice-item.mjs
  • components/stripe/actions/write-off-invoice/write-off-invoice.mjs
  • components/stripe/actions/update-refund/update-refund.mjs
  • components/stripe/actions/retrieve-invoice-item/retrieve-invoice-item.mjs
  • components/stripe/actions/retrieve-checkout-session/retrieve-checkout-session.mjs
  • components/stripe/actions/retrieve-product/retrieve-product.mjs
  • components/stripe/actions/update-payout/update-payout.mjs
  • components/stripe/actions/void-invoice/void-invoice.mjs
  • components/stripe/actions/finalize-invoice/finalize-invoice.mjs
  • components/stripe/actions/delete-or-void-invoice/delete-or-void-invoice.mjs
  • components/stripe/actions/retrieve-payment-intent/retrieve-payment-intent.mjs
  • components/stripe/actions/retrieve-checkout-session-line-items/retrieve-checkout-session-line-items.mjs
  • components/stripe/actions/list-payment-intents/list-payment-intents.mjs
  • components/stripe/actions/cancel-payment-intent/cancel-payment-intent.mjs
  • components/stripe/actions/update-invoice/update-invoice.mjs
  • components/stripe/actions/create-refund/create-refund.mjs
  • components/stripe/actions/update-invoice-item/update-invoice-item.mjs
  • components/stripe/actions/search-customers/search-customers.mjs
  • components/stripe/actions/list-payouts/list-payouts.mjs
  • components/stripe/actions/list-refunds/list-refunds.mjs
  • components/stripe/actions/create-invoice-item/create-invoice-item.mjs
  • components/stripe/actions/create-product/create-product.mjs
  • components/stripe/actions/create-payout/create-payout.mjs
  • components/stripe/actions/list-invoices/list-invoices.mjs
⏰ Context from checks skipped due to timeout of 90000ms (3)
  • GitHub Check: Publish TypeScript components
  • GitHub Check: Lint Code Base
  • GitHub Check: Verify TypeScript components
🔇 Additional comments (36)
components/stripe/package.json (2)

3-3: Version bumped from 0.6.4 to 0.7.0

The version bump to 0.7.0 is appropriate given the significant upgrade to the Stripe SDK (from v8 to v18). This follows semantic versioning principles where non-breaking API improvements warrant a minor version increment.


13-13: Significant Stripe SDK version upgrade from v8 to v18

Upgrading from Stripe SDK v8 to v18 is a major jump that brings the integration up to date with the latest Stripe API features and security improvements. This upgrade is aligned with the PR objectives to use the latest stable Stripe API version.

components/stripe/sources/common/webhook-base.mjs (3)

1-1: Import refactored from stripe to app

The import has been updated to use the app instance wrapper instead of directly importing the Stripe SDK, consistent with the broader refactoring approach in this PR.


5-5: Property name updated from stripe to app

This change aligns with the import change and ensures consistent naming throughout the codebase.


45-45: Updated Stripe SDK access to use app.sdk() method

All direct references to this.stripe have been replaced with this.app.sdk(), reflecting the new pattern for accessing the Stripe SDK through the app wrapper. This encapsulation makes SDK version management and configuration more centralized.

Also applies to: 52-52, 65-65, 81-81

components/stripe/actions/capture-payment-intent/capture-payment-intent.mjs (5)

7-7: Version increment from 0.1.1 to 0.1.2

Version number has been incremented appropriately to reflect changes in the component.


15-15: Prop naming standardization to camelCase

Props have been renamed from snake_case to camelCase (payment_intentpaymentIntent, amount_to_captureamountToCapture), improving consistency with JavaScript conventions while maintaining alignment with other components.

Also applies to: 19-20


26-61: Enhanced explicit properties replacing generic advanced prop

The generic advanced prop has been replaced with explicit, well-documented properties:

  • metadata
  • applicationFeeAmount
  • finalCapture
  • statementDescriptor
  • statementDescriptorSuffix
  • transferDataAmount

This improves type safety, documentation, and developer experience by making available options clear and discoverable.


64-87: Refactored parameter handling with explicit mapping

The run method now destructures specific properties and explicitly maps them to snake_case parameters required by the Stripe API. The conditional logic for transferDataAmount properly nests it within a transfer_data object, following Stripe's API structure.

This approach increases code clarity and maintainability by making the parameter mapping explicit rather than relying on lodash.pick.


88-90: Updated success message to reflect new property naming

The success message has been updated to use the new camelCase property names, maintaining consistency throughout the component.

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

2-2: Added utils import for enhanced date handling

The addition of the utils import provides access to functions for date conversion, which are used in the enhanced filtering parameters.


8-8: Significant version bump from 0.1.1 to 0.1.6

The version jump from 0.1.1 to 0.1.6 reflects the substantial enhancements made to this component, including expanded filtering options and pagination capabilities.


25-27: Enhanced currency prop with default country parameter

Adding a default country parameter ({ country: "US" }) to the currency prop definition improves usability by providing sensible defaults.


31-69: Expanded transaction type options with detailed definitions

The type prop has been enhanced from a simple propDefinition reference to a comprehensive string enum with all possible Stripe transaction types. This provides better documentation and type validation directly in the component.


76-111: Added comprehensive filtering and pagination options

New props have been added to support:

  1. Date-based filtering (createdGt, createdGte, createdLt, createdLte)
  2. Cursor-based pagination (endingBefore, startingAfter)

These additions significantly enhance the component's functionality, allowing for more precise data retrieval and efficient pagination through large result sets.


114-148: Refactored parameter building with date filter support

The run method has been refactored to:

  1. Use explicit destructuring for all properties
  2. Conditionally include date filtering parameters under a created object
  3. Convert date strings to timestamps using the utility function fromDateToInteger
  4. Properly pass pagination parameters

This implementation correctly translates the component's camelCase properties to Stripe's expected API parameters, while adding powerful filtering capabilities.

components/stripe/common/utils.mjs (3)

3-24: Well-structured recursive JSON parsing function

This recursive parseJson implementation handles nested JSON structures effectively, with proper error handling and type checking. The function can parse strings in deeply nested objects, which is valuable for handling complex Stripe metadata and other JSON inputs.


35-56: Robust array parsing with appropriate error handling

The parseArray function has comprehensive validation and error handling. It properly checks for various input types and provides clear error messages when the input isn't a valid array.


58-67: Clear and consistent module exports

The export pattern is consistent and provides good defaults. The exported parseJson function ensures objects are returned (defaulting to empty objects for non-object results), and parseArray applies parseJson to each element for consistent handling.

components/stripe/actions/create-subscription/create-subscription.mjs (2)

1-2: Proper migration to new SDK and naming conventions

The code has been successfully updated to use the new app import pattern and properly increments the version. Props have been renamed from snake_case to camelCase for consistency with modern JavaScript conventions.

Also applies to: 8-8, 11-11, 14-14, 21-21, 29-29, 36-36, 50-62, 72-85


92-124: Thorough implementation of automatic tax configuration

The new automatic tax properties provide comprehensive control over Stripe's tax calculation features, with clear descriptions and appropriate option constraints.

components/stripe/actions/update-customer/update-customer.mjs (2)

1-1: Successfully migrated to new utils module and naming conventions

The action has been properly updated to use the new utility functions and adopt consistent camelCase naming for address fields, which aligns with modern JavaScript conventions.

Also applies to: 8-8, 45-80


89-103: Well-structured property destructuring

All properties are clearly destructured, making the code more maintainable by explicitly showing which properties are being used.

components/stripe/actions/create-invoice/create-invoice.mjs (2)

7-90: Successfully updated props to match new SDK conventions

The props have been properly renamed to camelCase and new automatic tax properties have been added with clear descriptions. The reorganization improves readability and consistency with other components.


93-106: Clean property destructuring for improved readability

All properties are clearly destructured, making the code more maintainable by explicitly showing which properties are being used.

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

1-2: Properly upgraded Stripe SDK import style.

The code correctly updates the Stripe import from default to named import, aligning with Stripe SDK v18.x requirements, and adds the constants import for centralized version management.


71-108: Naming convention improved with camelCase.

The renaming from payment_method to paymentMethod properly aligns with JavaScript conventions and the updated Stripe SDK.


158-180: Rename to camelCase completed correctly.

The change from invoice_item to invoiceItem maintains consistent naming conventions across the codebase.


207-222: Consistent renaming of properties to camelCase.

The properties checkoutSession and paymentIntent are correctly renamed from snake_case to follow JavaScript conventions.


339-349: Updated statement descriptor documentation properly.

The updated documentation for statement descriptors better reflects Stripe's current API terminology and limits.


353-354: Updated metadata description with documentation link.

The metadata description now properly links to Stripe's documentation, improving developer experience.


396-402: Updated autoAdvance with improved description.

The property has been renamed from snake_case and the description now properly links to Stripe's documentation on automatic collection.


403-418: Collection and due date properties renamed and documented.

The collectionMethod and daysUntilDue properties have been properly renamed from snake_case and their documentation has been enhanced.


481-540: Added comprehensive date filtering and pagination capabilities.

Excellent addition of date filtering props (created and arrival date) with clear naming and descriptions. The pagination props properly follow Stripe's API conventions for cursor-based pagination.


541-600: Added detailed address and shipping fields.

The addition of comprehensive address and shipping fields enhances the integration with Stripe's detailed customer data model.


606-611:

✅ Verification successful

Updated SDK instantiation for version 18.

The SDK instantiation has been correctly updated to use the new Stripe named import and references the external API version constant instead of hardcoding it.


🏁 Script executed:

#!/bin/bash
# Verify the API version constant used for Stripe SDK initialization

# Check if the constants file exists and contains the API_VERSION constant
cat components/stripe/common/constants.mjs

Length of output: 639


🏁 Script executed:

#!/bin/bash
# Verify Stripe import style in SDK initialization file
rg -n "import.*stripe" -i components/stripe/stripe.app.mjs

Length of output: 91


SDK Instantiation Verified for Stripe v18

Verified that the Stripe SDK is correctly instantiated using the imported Stripe class and the external API_VERSION constant:

  • In components/stripe/stripe.app.mjs, you import Stripe from "stripe" and call
    sdk(apiVersion = constants.API_VERSION) {
      return new Stripe(this._apiKey(), { apiVersion, maxNetworkRetries: 2 });
    }
  • In components/stripe/common/constants.mjs, API_VERSION is defined as "2025-03-31.basil".

No further changes required.

@jcortes jcortes force-pushed the stripe-upgrade-to-latest-api-version branch from f60fdb4 to bb0ba34 Compare May 13, 2025 15:11
@jcortes jcortes force-pushed the stripe-upgrade-to-latest-api-version branch from bb0ba34 to 565e4e9 Compare May 19, 2025 20:44
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: 1

♻️ Duplicate comments (3)
components/stripe/actions/create-payment-intent/create-payment-intent.mjs (1)

64-80: ⚠️ Potential issue

Missing JSON parsing for metadata

The metadata property is passed directly without parsing, unlike other Stripe actions that use utils.parseJson. This inconsistency might lead to issues if users provide JSON strings.

+import utils from "../../common/utils.mjs";

...

-      metadata,
+      metadata: utils.parseJson(metadata),
components/stripe/actions/update-customer/update-customer.mjs (1)

99-116: ⚠️ Potential issue

Fix logical error in address condition

There's a logical error in the conditional check for including the address object. The missing parentheses around the condition and use of logical AND could lead to unexpected behavior.

-  ...(
-    addressCity
-    || addressCountry
-    || addressLine1
-    || addressLine2
-    || addressPostalCode
-    || addressState
-    && {
+  ...((
+    addressCity
+    || addressCountry
+    || addressLine1
+    || addressLine2
+    || addressPostalCode
+    || addressState
+  ) && {
     address: {
       city: addressCity,
       country: addressCountry,
       line1: addressLine1,
       line2: addressLine2,
       postal_code: addressPostalCode,
       state: addressState,
     },
-  }
+  })
components/stripe/actions/create-customer/create-customer.mjs (1)

386-401: 🛠️ Refactor suggestion

Missing JSON parsing for metadata

Similar to other actions like update-payment-intent.mjs, metadata should be parsed using utils.parseJson for consistency.

-      metadata,
+      metadata: utils.parseJson(metadata),
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
Cache: Disabled due to data retention organization setting
Knowledge Base: Disabled due to data retention organization setting

📥 Commits

Reviewing files that changed from the base of the PR and between bb0ba34 and 565e4e9.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (62)
  • 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 (1 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 (1 hunks)
  • components/stripe/actions/create-invoice-item/create-invoice-item.mjs (2 hunks)
  • components/stripe/actions/create-invoice/create-invoice.mjs (1 hunks)
  • components/stripe/actions/create-payment-intent/create-payment-intent.mjs (2 hunks)
  • components/stripe/actions/create-payout/create-payout.mjs (2 hunks)
  • components/stripe/actions/create-price/create-price.mjs (2 hunks)
  • components/stripe/actions/create-product/create-product.mjs (4 hunks)
  • components/stripe/actions/create-refund/create-refund.mjs (3 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 (2 hunks)
  • components/stripe/actions/delete-invoice-item/delete-invoice-item.mjs (3 hunks)
  • components/stripe/actions/delete-or-void-invoice/delete-or-void-invoice.mjs (2 hunks)
  • components/stripe/actions/finalize-invoice/finalize-invoice.mjs (2 hunks)
  • components/stripe/actions/list-balance-history/list-balance-history.mjs (2 hunks)
  • components/stripe/actions/list-customers/list-customers.mjs (2 hunks)
  • components/stripe/actions/list-invoices/list-invoices.mjs (3 hunks)
  • components/stripe/actions/list-payment-intents/list-payment-intents.mjs (2 hunks)
  • components/stripe/actions/list-payouts/list-payouts.mjs (1 hunks)
  • components/stripe/actions/list-refunds/list-refunds.mjs (3 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 (2 hunks)
  • components/stripe/actions/retrieve-checkout-session/retrieve-checkout-session.mjs (1 hunks)
  • components/stripe/actions/retrieve-customer/retrieve-customer.mjs (2 hunks)
  • components/stripe/actions/retrieve-invoice-item/retrieve-invoice-item.mjs (3 hunks)
  • components/stripe/actions/retrieve-invoice/retrieve-invoice.mjs (2 hunks)
  • components/stripe/actions/retrieve-payment-intent/retrieve-payment-intent.mjs (1 hunks)
  • components/stripe/actions/retrieve-payout/retrieve-payout.mjs (2 hunks)
  • components/stripe/actions/retrieve-price/retrieve-price.mjs (2 hunks)
  • components/stripe/actions/retrieve-product/retrieve-product.mjs (1 hunks)
  • components/stripe/actions/retrieve-refund/retrieve-refund.mjs (2 hunks)
  • components/stripe/actions/search-customers/search-customers.mjs (4 hunks)
  • components/stripe/actions/send-invoice/send-invoice.mjs (2 hunks)
  • components/stripe/actions/update-customer/update-customer.mjs (4 hunks)
  • components/stripe/actions/update-invoice-item/update-invoice-item.mjs (3 hunks)
  • components/stripe/actions/update-invoice/update-invoice.mjs (3 hunks)
  • components/stripe/actions/update-payment-intent/update-payment-intent.mjs (3 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 (2 hunks)
  • components/stripe/actions/write-off-invoice/write-off-invoice.mjs (2 hunks)
  • components/stripe/common/constants.mjs (2 hunks)
  • components/stripe/common/utils.mjs (1 hunks)
  • components/stripe/package.json (2 hunks)
  • components/stripe/sources/abandoned-cart/abandoned-cart.mjs (1 hunks)
  • components/stripe/sources/canceled-subscription/canceled-subscription.mjs (1 hunks)
  • components/stripe/sources/common/webhook-base.mjs (4 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 (9 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 (1)
  • components/stripe/actions/create-price/create-price.mjs
🚧 Files skipped from review as they are similar to previous changes (51)
  • components/stripe/sources/new-payment/new-payment.mjs
  • components/stripe/sources/custom-webhook-events/custom-webhook-events.mjs
  • components/stripe/sources/new-customer/new-customer.mjs
  • components/stripe/sources/abandoned-cart/abandoned-cart.mjs
  • components/stripe/sources/new-failed-invoice-payment/new-failed-invoice-payment.mjs
  • components/stripe/common/constants.mjs
  • components/stripe/sources/new-failed-payment/new-failed-payment.mjs
  • components/stripe/package.json
  • components/stripe/sources/new-subscription/new-subscription.mjs
  • components/stripe/sources/new-invoice/new-invoice.mjs
  • components/stripe/actions/update-refund/update-refund.mjs
  • components/stripe/sources/canceled-subscription/canceled-subscription.mjs
  • components/stripe/actions/delete-customer/delete-customer.mjs
  • components/stripe/sources/common/webhook-base.mjs
  • components/stripe/actions/write-off-invoice/write-off-invoice.mjs
  • components/stripe/sources/new-dispute/new-dispute.mjs
  • components/stripe/actions/retrieve-invoice/retrieve-invoice.mjs
  • components/stripe/actions/retrieve-balance/retrieve-balance.mjs
  • components/stripe/actions/void-invoice/void-invoice.mjs
  • components/stripe/actions/retrieve-invoice-item/retrieve-invoice-item.mjs
  • components/stripe/sources/subscription-updated/subscription-updated.mjs
  • components/stripe/actions/delete-or-void-invoice/delete-or-void-invoice.mjs
  • components/stripe/actions/retrieve-payout/retrieve-payout.mjs
  • components/stripe/actions/send-invoice/send-invoice.mjs
  • components/stripe/actions/retrieve-customer/retrieve-customer.mjs
  • components/stripe/actions/create-billing-meter/create-billing-meter.mjs
  • components/stripe/actions/retrieve-price/retrieve-price.mjs
  • components/stripe/actions/update-payout/update-payout.mjs
  • components/stripe/actions/finalize-invoice/finalize-invoice.mjs
  • components/stripe/actions/retrieve-checkout-session/retrieve-checkout-session.mjs
  • components/stripe/actions/list-payment-intents/list-payment-intents.mjs
  • components/stripe/actions/update-invoice-item/update-invoice-item.mjs
  • components/stripe/actions/retrieve-product/retrieve-product.mjs
  • components/stripe/actions/retrieve-payment-intent/retrieve-payment-intent.mjs
  • components/stripe/actions/list-customers/list-customers.mjs
  • components/stripe/actions/delete-invoice-item/delete-invoice-item.mjs
  • components/stripe/actions/retrieve-checkout-session-line-items/retrieve-checkout-session-line-items.mjs
  • components/stripe/actions/list-invoices/list-invoices.mjs
  • components/stripe/actions/capture-payment-intent/capture-payment-intent.mjs
  • components/stripe/actions/retrieve-refund/retrieve-refund.mjs
  • components/stripe/actions/cancel-or-reverse-payout/cancel-or-reverse-payout.mjs
  • components/stripe/actions/create-payout/create-payout.mjs
  • components/stripe/actions/update-invoice/update-invoice.mjs
  • components/stripe/actions/create-invoice-item/create-invoice-item.mjs
  • components/stripe/actions/list-refunds/list-refunds.mjs
  • components/stripe/common/utils.mjs
  • components/stripe/actions/search-customers/search-customers.mjs
  • components/stripe/actions/cancel-payment-intent/cancel-payment-intent.mjs
  • components/stripe/actions/create-invoice/create-invoice.mjs
  • components/stripe/actions/list-payouts/list-payouts.mjs
  • components/stripe/actions/create-product/create-product.mjs
⏰ Context from checks skipped due to timeout of 90000ms (4)
  • GitHub Check: Verify TypeScript components
  • GitHub Check: pnpm publish
  • GitHub Check: Publish TypeScript components
  • GitHub Check: Lint Code Base
🔇 Additional comments (43)
components/stripe/actions/list-balance-history/list-balance-history.mjs (6)

2-2: Good addition of utility module

Adding the utils module enables the action to properly handle date conversions for filtering, which is crucial for the newly added date range filtering capabilities.


8-9: Version bump appropriately reflects changes

The version increment from 0.1.1 to 0.1.6 accurately reflects the significant enhancements made to this action, including expanded filtering capabilities and improved documentation.


12-17: Helpful informational alert added

The new informational alert provides users with valuable context about the action's behavior and includes a link to the Stripe documentation.


34-72: Enhanced transaction type options

Replacing the previous propDefinition with an explicit list of transaction types improves the action's usability by providing a comprehensive set of options with proper labeling and description.


79-114: Great addition of filtering and pagination capabilities

The new date range filtering props (createdGt, createdGte, createdLt, createdLte) and pagination props (endingBefore, startingAfter) significantly enhance the query capabilities of this action, allowing for more precise and flexible data retrieval.


117-151: Well-structured parameter construction

The refactored run method improves code clarity and maintainability by:

  1. Explicitly destructuring all props
  2. Clearly building the parameters object with conditional date filters
  3. Using utility functions for date conversion
  4. Properly passing pagination parameters

This approach makes the code more readable and easier to maintain.

components/stripe/actions/create-subscription/create-subscription.mjs (5)

1-2: Good import refactoring

Renaming the import to app and adding the utilities module improves consistency across the codebase and enables robust JSON and array parsing.


50-62: Consistent naming convention

Converting props from snake_case to camelCase (e.g., collectionMethod, daysUntilDue, defaultPaymentMethod) improves consistency across the codebase and provides a better user experience.


92-112: Enhanced automatic tax handling

The addition of automatic tax-related props allows users to configure tax calculations with fine-grained control, including liability type and account references.


113-124: Helpful payment behavior options

The new paymentBehavior prop with clear options and documentation improves flexibility when creating subscriptions with different initial states.


149-169: Improved parameter handling

The use of utility functions for parsing JSON metadata and array items enhances robustness and error handling. The conditional inclusion of automatic tax parameters is well-structured and maintainable.

components/stripe/actions/create-refund/create-refund.mjs (3)

12-16: Helpful informational alert

Adding an informational alert provides valuable context about refund behavior and includes a link to Stripe documentation.


36-45: Improved reason options

Converting the reason prop to an explicit string prop with defined options and documentation enhances usability by providing clear guidance on available choices.


66-85: Well-structured parameter mapping

The refactored run method with explicit destructuring and parameter mapping improves code clarity and maintainability while correctly handling the conversion between camelCase prop names and snake_case API parameters.

components/stripe/actions/create-payment-intent/create-payment-intent.mjs (2)

81-86: Elegant inline truncation

The inline truncation of statementDescriptor and statementDescriptorSuffix within the parameter construction is a clean approach that improves code readability while ensuring values meet Stripe's length requirements.


88-88: Improved summary message formatting

Using backticks around dynamic values in the summary message improves readability and makes the message more consistent with other Stripe actions.

components/stripe/actions/update-customer/update-customer.mjs (1)

132-139: Successfully updated to use explicit parameter destructuring

The code was refactored to use explicit parameter destructuring and properly map props to their corresponding Stripe API parameters, making the code more maintainable.

components/stripe/actions/update-payment-intent/update-payment-intent.mjs (2)

182-217: Well-structured conditional parameter building

The getOtherParams method correctly builds nested objects for shipping, statement descriptors, and other parameters only when relevant fields are present. This is a cleaner approach than the previous implementation.


235-246: Good implementation of explicit parameter handling

The SDK call now explicitly maps all parameters and properly parses JSON metadata. This is more maintainable than using lodash.pick with an advanced options object.

components/stripe/actions/create-customer/create-customer.mjs (1)

256-363: Well-structured conditional parameter building

The getOtherParams method effectively handles the conditional construction of nested objects for address, shipping, tax, cash balance, and invoice settings. This is a clear and maintainable approach.

components/stripe/actions/confirm-payment-intent/confirm-payment-intent.mjs (3)

248-309: Well-structured conditional parameter building with proper nesting

The getOtherParams method correctly builds nested objects for shipping, mandate data, and radar options only when relevant fields are present. The conditional logic using ternary operators avoids operator precedence issues that could cause runtime errors.


342-342: Correctly parsing payment method options as JSON

Good use of utils.parseJson for the paymentMethodOptions parameter, ensuring proper conversion from string to object format as required by the Stripe API.


12-17: Helpful contextual alert for users

Adding an informational alert is a user-friendly touch that provides context about the action's behavior and links to the relevant documentation.

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

1-2: Updated import style for Stripe SDK compatibility

The import has been changed from a default import to a named import, matching the requirements of the upgraded Stripe SDK version (v18.0.0). This is accompanied by importing constants from a newly created common module that contains the API version information.


71-71: Property naming convention changed to camelCase

The property has been renamed from snake_case payment_method to camelCase paymentMethod, following JavaScript conventions and making the codebase more consistent.


158-158: Property naming convention changed to camelCase

The property has been renamed from snake_case invoice_item to camelCase invoiceItem, aligning with JavaScript conventions.


207-207: Property naming convention changed to camelCase

The property has been renamed from snake_case checkout_session to camelCase checkoutSession, following JavaScript conventions.


213-213: Property naming convention changed to camelCase

The property has been renamed from snake_case payment_intent to camelCase paymentIntent, aligning with JavaScript conventions.


292-293: Property naming convention changed to camelCase

The property has been renamed from snake_case payment_intent_client_secret to camelCase paymentIntentClientSecret, following JavaScript conventions.


299-300: Property naming convention changed to camelCase

The property has been renamed from snake_case payment_intent_cancellation_reason to camelCase paymentIntentCancellationReason, following JavaScript conventions.


317-318: Property naming convention changed to camelCase

The property has been renamed from snake_case payment_method_types to camelCase paymentMethodTypes, following JavaScript conventions.


338-343: Updated statement descriptor documentation

The description for statementDescriptor has been enhanced with more detailed information about character limits and linking to official documentation, improving developer understanding.


344-349: Added statement descriptor suffix property

A new property statementDescriptorSuffix has been added to support the Stripe feature that allows appending a suffix to the statement descriptor prefix. This enhances flexibility for merchants managing payment descriptors.


353-353: Enhanced metadata description

The description for metadata has been updated with a link to Stripe's documentation and more detailed explanation of how metadata can be used and modified, improving developer understanding.


359-378: Improved descriptions for common properties

The descriptions for name, email, phone, and description properties have been enhanced with more detailed and accurate information, better explaining their purpose and constraints.


380-381: Property naming convention changed to camelCase

The property has been renamed from snake_case setup_future_usage to camelCase setupFutureUsage, following JavaScript conventions.


396-402: Property naming convention changed to camelCase with improved documentation

The property has been renamed from snake_case auto_advance to camelCase autoAdvance, with an updated label and more detailed description linking to Stripe's documentation.


403-412: Property naming convention changed to camelCase with improved documentation

The property has been renamed from snake_case collection_method to camelCase collectionMethod, with an updated description that better explains the behavior of each option.


413-418: Property naming convention changed to camelCase with improved documentation

The property has been renamed from snake_case days_until_due to camelCase daysUntilDue, with an updated label and clearer description.


481-540: Added filtering and pagination properties

New filtering and pagination properties have been added to enhance querying capabilities:

  • Date-based filtering: createdGt, createdGte, createdLt, createdLte, arrivalDateGt, arrivalDateGte, arrivalDateLt, arrivalDateLte
  • Cursor-based pagination: endingBefore, startingAfter

These additions align with Stripe's API capabilities and provide more flexibility when retrieving resources.


541-600: Added structured address and shipping properties

New properties have been added for address and shipping information:

  • Address fields: addressCity, addressCountry, addressLine1, addressLine2, addressPostalCode, addressState
  • Shipping fields: shippingName, shippingCarrier, shippingPhone, shippingTrackingNumber

These replace the previous flat address fields and provide better structure and organization for address and shipping data.


606-608: Updated SDK instantiation for compatibility with Stripe v18

The SDK instantiation has been updated to use:

  1. The new class-based initialization with new Stripe() rather than the function-call style
  2. The API version from the constants module (constants.API_VERSION)

This change ensures compatibility with the upgraded Stripe SDK (v18) and centralizes API version management.


1-608:

❓ Verification inconclusive

Verify API version compatibility with production systems

The code update changes the Stripe API version to "2025-03-31.basil" as noted in the PR summary. This is a significant version jump from the previous "2020-03-02".

While the code changes look good, it's important to verify that all features used in production are compatible with this newer API version, as Stripe may have deprecated or changed behaviors for certain endpoints.


🌐 Web query:

What are the major changes between Stripe API version 2020-03-02 and 2025-03-31.basil?

💡 Result:

Between Stripe API versions 2020-03-02 and 2025-03-31.basil, several significant changes have been implemented:

1. Billing Enhancements:

  • Coupon Management: Support for discount coupons without specified end times has been removed, and parameters for stackable discounts have been reorganized. (docs.stripe.com)
  • Invoice Flexibility: Top-level price fields have been replaced with improved price modeling on Invoice Items and Invoice Line Items. Additionally, support for multiple (partial) payments on invoices has been added. (docs.stripe.com)

2. Checkout Session Updates:

  • Subscription Handling: The creation of subscriptions is now postponed until after the user completes payment, enhancing latency and allowing customers to modify billing details post-payment. (docs.stripe.com)
  • Custom UI Mode: A new ui_mode parameter allows the use of Elements and Checkout Sessions to design custom checkout pages. (docs.stripe.com)

3. Payment Method Support:

  • New Integrations: Support has been added for Affirm, Pix, Billie, Klarna on Hosted Invoice Pages, Naver Pay, Satispay, and New Zealand’s BECS Direct Debit across various APIs. (docs.stripe.com)

4. API Versioning and Release Process:

  • Basil Release: The 2025-03-31.basil release introduces breaking changes and new features, with subsequent Basil versions focusing on additive changes. This aligns with Stripe's new API release process, which combines semiannual major updates with monthly feature enhancements. (docs.stripe.com, stripe.com)

5. Deprecations and Removals:

  • Total Count Expansion: The ability to expand the total_count property on list API methods has been removed, as it is no longer a recommended integration pattern. (docs.stripe.com)

For a comprehensive list of changes, refer to Stripe's official changelog. (docs.stripe.com)

Citations:


Verify compatibility with Stripe API v2025-03-31.basil

We’ve jumped from v2020-03-02 to v2025-03-31.basil, which introduces several breaking and behavioral changes. Before rolling this out, please confirm that none of these impact your production workflows:

  • Coupon management no longer supports open-ended coupons or old stacking parameters.
  • Invoice price fields have been revamped to live on Line Items/Invoice Items, and partial payments on invoices are now allowed.
  • Checkout Sessions now postpone subscription creation until after payment and add a new ui_mode for custom UIs.
  • The total_count expand parameter on list endpoints has been removed—ensure you’re not relying on it.
  • New payment methods (Affirm, Pix, Klarna, etc.) have been added—verify that existing types still function as expected.

Action items:

  • Audit any usage of total_count expansions.
  • Review invoice-related code for price field changes.
  • Test customer/checkout flows (subscription creation, custom UI) in a staging environment.
  • Validate that all production‐critical endpoints behave as before under the new API version.

Copy link
Collaborator

@luancazarine luancazarine left a comment

Choose a reason for hiding this comment

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

Hi @jcortes, I just added a minor suggestion.

@jcortes jcortes force-pushed the stripe-upgrade-to-latest-api-version branch from 565e4e9 to 05e96e4 Compare May 20, 2025 20:41
@jcortes jcortes requested a review from luancazarine May 20, 2025 20:41
GTFalcao
GTFalcao previously approved these changes May 21, 2025
lcaresia
lcaresia previously approved these changes May 21, 2025
luancazarine

This comment was marked as outdated.

@jcortes jcortes dismissed stale reviews from luancazarine, lcaresia, and GTFalcao via d4a9734 May 26, 2025 17:11
@jcortes jcortes force-pushed the stripe-upgrade-to-latest-api-version branch 2 times, most recently from d4a9734 to 75a18ee Compare May 27, 2025 15:00
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

🔭 Outside diff range comments (1)
components/stripe/stripe.app.mjs (1)

71-108: 💡 Verification agent

🧩 Analysis chain

Breaking change: Property names converted from snake_case to camelCase.

The systematic conversion from snake_case to camelCase (e.g., payment_methodpaymentMethod, invoice_iteminvoiceItem) improves naming consistency but constitutes a breaking change for existing integrations.

Also applies to: 158-180, 207-212, 213-222, 292-298, 299-310, 317-337, 380-389, 403-418


🏁 Script executed:

#!/bin/bash
# Description: Verify all action and source files have been updated to use the new camelCase prop names
# Expected: No usage of old snake_case prop names should remain

# Check for usage of old snake_case prop names that were changed
rg 'payment_method|invoice_item|checkout_session|payment_intent|setup_future_usage|collection_method|days_until_due|statement_descriptor' --type js --type mjs -A 3

Length of output: 193


🏁 Script executed:

#!/bin/bash
# Description: Verify all action and source files have been updated to use the new camelCase prop names
# Checks for any remaining snake_case usage in .js, .mjs, .ts, and .tsx files
rg -g '*.js' -g '*.mjs' -g '*.ts' -g '*.tsx' \
  'payment_method|invoice_item|checkout_session|payment_intent|setup_future_usage|collection_method|days_until_due|statement_descriptor' -A 3 || echo "No matches found"

Length of output: 38488


Fix remaining snake_case props in Stripe components

The conversion from snake_case to camelCase in your Stripe props is a breaking change and several Stripe files still reference the old names. Please update these to the new camelCase properties (or provide backwards‐compatibility shims) before merging.

Files requiring updates:

  • components/stripe/actions/update-invoice/update-invoice.mjs
    • days_until_due → daysUntilDue
    • default_payment_method → defaultPaymentMethod
    • collection_method → collectionMethod
  • components/stripe/actions/list-refunds/list-refunds.mjs
    • payment_intent → paymentIntent
  • components/stripe/actions/list-invoices/list-invoices.mjs
    • collection_method → collectionMethod
  • components/stripe/actions/create-payout/create-payout.mjs
    • statement_descriptor → statementDescriptor
    • source_type → sourceType
  • components/stripe/actions/create-payment-intent/create-payment-intent.mjs
    • payment_method_types → paymentMethodTypes
    • statement_descriptor → statementDescriptor
    • statement_descriptor_suffix → statementDescriptorSuffix
  • components/stripe/actions/confirm-payment-intent/confirm-payment-intent.mjs
    • payment_method → paymentMethod
    • setup_future_usage → setupFutureUsage
  • components/stripe/actions/update-payment-intent/update-payment-intent.mjs
    • setup_future_usage → setupFutureUsage
  • components/stripe/actions/create-customer/create-customer.mjs
    • default_payment_method → defaultPaymentMethod
    • payment_method → paymentMethod
  • components/stripe/actions/create-subscription/create-subscription.mjs
    • collection_method → collectionMethod
    • days_until_due → daysUntilDue
  • components/stripe/actions/delete-invoice-item/delete-invoice-item.mjs
    • invoice_item → invoiceItem
  • components/stripe/actions/create-refund/create-refund.mjs
    • payment_intent → paymentIntent
  • components/stripe/actions/capture-payment-intent/capture-payment-intent.mjs
    • statement_descriptor → statementDescriptor
    • statement_descriptor_suffix → statementDescriptorSuffix
  • components/stripe/sources/common/constants.mjs
    • all payment_intent.* and payment_method.* event keys
  • components/stripe/sources/*.mjs test‐event fixtures
    • update any snake_case event payload fields to camelCase
♻️ Duplicate comments (1)
components/stripe/actions/create-customer/create-customer.mjs (1)

352-391: Clean parameter mapping with proper array parsing.

The explicit destructuring and parameter construction is well-implemented. The use of utils.parseArray(taxIdData) correctly handles the tax ID data array. However, the metadata field should be parsed as JSON for consistency.

The metadata should be parsed using utils.parseJson(metadata) for consistency with other actions like update-payment-intent.mjs.

-      metadata,
+      metadata: utils.parseJson(metadata),
🧹 Nitpick comments (3)
components/stripe/stripe.app.mjs (3)

508-509: Fix inconsistent descriptions for arrival date filters.

The descriptions for arrivalDateGt and arrivalDateGte incorrectly state "transactions that were created after this date" when they should refer to arrival dates.

-      description: "Only return transactions that were created after this date (exclusive). In ISO 8601 format. Eg. `2023-01-01T00:00:00Z`",
+      description: "Only return transactions that arrived after this date (exclusive). In ISO 8601 format. Eg. `2023-01-01T00:00:00Z`",
-      description: "Only return transactions that were created after this date (inclusive). In ISO 8601 format. Eg. `2023-01-01T00:00:00Z`",
+      description: "Only return transactions that arrived after this date (inclusive). In ISO 8601 format. Eg. `2023-01-01T00:00:00Z`",

Also applies to: 514-515


541-600: Good addition of address and shipping props with minor description inconsistencies.

The new address and shipping props provide comprehensive coverage for address handling. However, there are some inconsistencies in the descriptions.

Fix these description inconsistencies:

-      label: "Shipping - Address - Line 2",
+      label: "Address - Line 2",
-      label: "Shipping - Address - State",
+      label: "Address - State",

359-360: Fix typo in description.

There's a typo in the name prop description: "resouce" should be "resource".

-      description: "The resouce name",
+      description: "The resource name",
📜 Review details

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

📥 Commits

Reviewing files that changed from the base of the PR and between d4a9734 and 75a18ee.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (62)
  • 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 (1 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 (1 hunks)
  • components/stripe/actions/create-invoice-item/create-invoice-item.mjs (2 hunks)
  • components/stripe/actions/create-invoice/create-invoice.mjs (1 hunks)
  • components/stripe/actions/create-payment-intent/create-payment-intent.mjs (2 hunks)
  • components/stripe/actions/create-payout/create-payout.mjs (2 hunks)
  • components/stripe/actions/create-price/create-price.mjs (2 hunks)
  • components/stripe/actions/create-product/create-product.mjs (4 hunks)
  • components/stripe/actions/create-refund/create-refund.mjs (3 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 (2 hunks)
  • components/stripe/actions/delete-invoice-item/delete-invoice-item.mjs (3 hunks)
  • components/stripe/actions/delete-or-void-invoice/delete-or-void-invoice.mjs (2 hunks)
  • components/stripe/actions/finalize-invoice/finalize-invoice.mjs (2 hunks)
  • components/stripe/actions/list-balance-history/list-balance-history.mjs (2 hunks)
  • components/stripe/actions/list-customers/list-customers.mjs (2 hunks)
  • components/stripe/actions/list-invoices/list-invoices.mjs (3 hunks)
  • components/stripe/actions/list-payment-intents/list-payment-intents.mjs (2 hunks)
  • components/stripe/actions/list-payouts/list-payouts.mjs (1 hunks)
  • components/stripe/actions/list-refunds/list-refunds.mjs (3 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 (2 hunks)
  • components/stripe/actions/retrieve-checkout-session/retrieve-checkout-session.mjs (1 hunks)
  • components/stripe/actions/retrieve-customer/retrieve-customer.mjs (2 hunks)
  • components/stripe/actions/retrieve-invoice-item/retrieve-invoice-item.mjs (3 hunks)
  • components/stripe/actions/retrieve-invoice/retrieve-invoice.mjs (2 hunks)
  • components/stripe/actions/retrieve-payment-intent/retrieve-payment-intent.mjs (1 hunks)
  • components/stripe/actions/retrieve-payout/retrieve-payout.mjs (2 hunks)
  • components/stripe/actions/retrieve-price/retrieve-price.mjs (2 hunks)
  • components/stripe/actions/retrieve-product/retrieve-product.mjs (1 hunks)
  • components/stripe/actions/retrieve-refund/retrieve-refund.mjs (2 hunks)
  • components/stripe/actions/search-customers/search-customers.mjs (5 hunks)
  • components/stripe/actions/send-invoice/send-invoice.mjs (2 hunks)
  • components/stripe/actions/update-customer/update-customer.mjs (4 hunks)
  • components/stripe/actions/update-invoice-item/update-invoice-item.mjs (3 hunks)
  • components/stripe/actions/update-invoice/update-invoice.mjs (3 hunks)
  • components/stripe/actions/update-payment-intent/update-payment-intent.mjs (3 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 (2 hunks)
  • components/stripe/actions/write-off-invoice/write-off-invoice.mjs (2 hunks)
  • components/stripe/common/constants.mjs (2 hunks)
  • components/stripe/common/utils.mjs (1 hunks)
  • components/stripe/package.json (2 hunks)
  • components/stripe/sources/abandoned-cart/abandoned-cart.mjs (1 hunks)
  • components/stripe/sources/canceled-subscription/canceled-subscription.mjs (1 hunks)
  • components/stripe/sources/common/webhook-base.mjs (4 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 (9 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 (1)
  • components/stripe/actions/create-price/create-price.mjs
🚧 Files skipped from review as they are similar to previous changes (55)
  • components/stripe/actions/create-billing-meter/create-billing-meter.mjs
  • components/stripe/actions/create-payout/create-payout.mjs
  • components/stripe/actions/create-invoice-item/create-invoice-item.mjs
  • components/stripe/actions/retrieve-invoice/retrieve-invoice.mjs
  • components/stripe/sources/abandoned-cart/abandoned-cart.mjs
  • components/stripe/common/constants.mjs
  • components/stripe/sources/new-subscription/new-subscription.mjs
  • components/stripe/sources/new-failed-payment/new-failed-payment.mjs
  • components/stripe/package.json
  • components/stripe/actions/list-refunds/list-refunds.mjs
  • components/stripe/sources/new-dispute/new-dispute.mjs
  • components/stripe/sources/new-invoice/new-invoice.mjs
  • components/stripe/sources/new-customer/new-customer.mjs
  • components/stripe/sources/custom-webhook-events/custom-webhook-events.mjs
  • components/stripe/sources/new-payment/new-payment.mjs
  • components/stripe/sources/canceled-subscription/canceled-subscription.mjs
  • components/stripe/sources/common/webhook-base.mjs
  • components/stripe/actions/delete-or-void-invoice/delete-or-void-invoice.mjs
  • components/stripe/actions/delete-customer/delete-customer.mjs
  • components/stripe/sources/new-failed-invoice-payment/new-failed-invoice-payment.mjs
  • components/stripe/sources/subscription-updated/subscription-updated.mjs
  • components/stripe/actions/retrieve-balance/retrieve-balance.mjs
  • components/stripe/actions/write-off-invoice/write-off-invoice.mjs
  • components/stripe/actions/retrieve-customer/retrieve-customer.mjs
  • components/stripe/actions/finalize-invoice/finalize-invoice.mjs
  • components/stripe/actions/delete-invoice-item/delete-invoice-item.mjs
  • components/stripe/actions/update-refund/update-refund.mjs
  • components/stripe/actions/void-invoice/void-invoice.mjs
  • components/stripe/actions/retrieve-checkout-session/retrieve-checkout-session.mjs
  • components/stripe/actions/send-invoice/send-invoice.mjs
  • components/stripe/actions/retrieve-invoice-item/retrieve-invoice-item.mjs
  • components/stripe/actions/retrieve-payout/retrieve-payout.mjs
  • components/stripe/actions/list-balance-history/list-balance-history.mjs
  • components/stripe/actions/list-payment-intents/list-payment-intents.mjs
  • components/stripe/actions/update-payout/update-payout.mjs
  • components/stripe/actions/update-invoice-item/update-invoice-item.mjs
  • components/stripe/actions/retrieve-checkout-session-line-items/retrieve-checkout-session-line-items.mjs
  • components/stripe/actions/retrieve-price/retrieve-price.mjs
  • components/stripe/actions/list-customers/list-customers.mjs
  • components/stripe/actions/retrieve-payment-intent/retrieve-payment-intent.mjs
  • components/stripe/actions/retrieve-product/retrieve-product.mjs
  • components/stripe/actions/search-customers/search-customers.mjs
  • components/stripe/common/utils.mjs
  • components/stripe/actions/capture-payment-intent/capture-payment-intent.mjs
  • components/stripe/actions/retrieve-refund/retrieve-refund.mjs
  • components/stripe/actions/create-refund/create-refund.mjs
  • components/stripe/actions/cancel-payment-intent/cancel-payment-intent.mjs
  • components/stripe/actions/create-payment-intent/create-payment-intent.mjs
  • components/stripe/actions/list-invoices/list-invoices.mjs
  • components/stripe/actions/create-product/create-product.mjs
  • components/stripe/actions/update-invoice/update-invoice.mjs
  • components/stripe/actions/create-subscription/create-subscription.mjs
  • components/stripe/actions/create-invoice/create-invoice.mjs
  • components/stripe/actions/update-customer/update-customer.mjs
  • components/stripe/actions/cancel-or-reverse-payout/cancel-or-reverse-payout.mjs
⏰ Context from checks skipped due to timeout of 90000ms (4)
  • GitHub Check: Verify TypeScript components
  • GitHub Check: pnpm publish
  • GitHub Check: Lint Code Base
  • GitHub Check: Publish TypeScript components
🔇 Additional comments (15)
components/stripe/actions/list-payouts/list-payouts.mjs (4)

2-2: LGTM! Clean import of utilities module.

The addition of the utils module import aligns with the broader refactoring to remove lodash dependencies and provides necessary utility functions for date conversion.


30-95: Excellent enhancement with comprehensive filtering options.

The addition of extensive filtering props for creation dates, arrival dates, destination, and pagination significantly improves the action's functionality. The prop definitions are well-structured and use appropriate propDefinitions.


97-138: Well-implemented conditional parameter construction.

The getOtherParams method correctly constructs nested filter objects only when relevant date filters are provided. The use of utils.fromDateToInteger for date conversion is appropriate and consistent with the Stripe API requirements.


140-167: Clean refactoring with explicit parameter handling.

The replacement of lodash.pick with explicit destructuring improves code clarity. The parameter mapping from camelCase props to snake_case API parameters is correctly implemented.

components/stripe/actions/update-payment-intent/update-payment-intent.mjs (3)

59-162: Comprehensive prop expansion with excellent organization.

The addition of detailed shipping address fields, payment method options, and statement descriptor props significantly enhances the action's capabilities. The prop definitions are well-structured with clear labels and descriptions.


164-217: Excellent conditional object construction logic.

The getOtherParams method correctly constructs nested shipping objects only when relevant fields are provided. The statement descriptor truncation to 21 characters follows Stripe API requirements and handles edge cases properly with the optional chaining and undefined fallback.


219-249: Clean refactoring with proper parameter mapping.

The explicit destructuring and parameter construction replaces lodash.pick effectively. The use of utils.parseJson(metadata) ensures proper JSON parsing, and the camelCase to snake_case mapping is correctly implemented for all API parameters.

components/stripe/actions/create-customer/create-customer.mjs (1)

255-349: Excellent implementation of complex nested parameter construction.

The getOtherParams method effectively handles conditional construction of multiple nested objects (address, shipping, tax, cash_balance, invoice_settings) based on the presence of related props. The logic is well-structured and follows Stripe API requirements.

components/stripe/actions/confirm-payment-intent/confirm-payment-intent.mjs (4)

13-17: Good addition of informational alert.

The alert prop provides helpful context to users about payment confirmation behavior, improving the user experience.


196-201: Excellent fix for payment method options type.

The change from type: "string" to type: "object" correctly addresses the previous review feedback. This ensures the prop type matches Stripe API expectations for the payment_method_options parameter.


227-304: Well-implemented nested parameter construction.

The getOtherParams method correctly handles conditional construction of shipping, mandate data, and radar options. The mandate data construction properly addresses the previous operator precedence concern by using separate boolean checks (hasMandateData and hasOnlineData) with appropriate conditional spreading.


306-345: Clean implementation with proper JSON parsing.

The explicit parameter construction is well-implemented. The use of utils.parseJson(paymentMethodOptions) correctly handles the object parsing requirement, addressing previous feedback about type handling.

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

481-540: Good addition of enhanced filtering and pagination props.

The new date filtering props (createdGt, createdGte, createdLt, createdLte, arrivalDateGt, etc.) and pagination props (endingBefore, startingAfter) provide much-needed flexibility for data retrieval operations.


606-611:

✅ Verification successful

Verify the constants.API_VERSION is properly defined.

The SDK method correctly uses the new Stripe constructor pattern and references constants.API_VERSION. Ensure the constants file defines the correct API version.


🏁 Script executed:

#!/bin/bash
# Description: Verify the API_VERSION constant is properly defined
# Expected: Should show the new API version (likely "2025-03-31.basil" based on the PR summary)

# Check the constants file for API_VERSION definition
cat components/stripe/common/constants.mjs | grep -A 2 -B 2 API_VERSION

Length of output: 177


constants.API_VERSION is properly defined
The API_VERSION constant is set to "2025-03-31.basil" in components/stripe/common/constants.mjs as expected. No further changes needed.


1-2:

❓ Verification inconclusive

Verify consistent import changes across the codebase.

The import change from default to named import is correct for the newer Stripe SDK version. However, this is a breaking change that must be applied consistently across all files that use the Stripe SDK.


🏁 Script executed:

#!/bin/bash
# Description: Verify all Stripe SDK imports are updated consistently across the codebase
# Expected: All imports should use the named import pattern

# Search for any remaining default Stripe imports
rg -A 2 'import.*stripe.*from.*["\']stripe["\']' --type js --type mjs

# Search for any usage of stripe() constructor calls that need updating
rg 'new stripe\(' --type js --type mjs

Length of output: 116


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "🔍 Verifying Stripe import consistency..."

# 1. Check for any legacy lowercase default imports (should be uppercase/named now)
rg -n -E "import\s+stripe\s+from\s+['\"]stripe['\"]" --type js --type mjs || echo "No lowercase default imports found."

# 2. Check for named-import variants (e.g., import { Stripe } from 'stripe')
rg -n -E "import\s+\{\s*Stripe\s*\}\s+from\s+['\"]stripe['\"]" --type js --type mjs || echo "No named-import variants found."

# 3. Confirm the approved default import pattern (import Stripe from 'stripe')
rg -n -E "import\s+Stripe\s+from\s+['\"]stripe['\"]" --type js --type mjs || echo "No default imports of Stripe found; double-check if named import is intended."

echo "🔍 Verifying Stripe constructor usage..."

# 4. Look for any lowercase constructor calls
rg -n -E "new\s+stripe\s*\(" --type js --type mjs || echo "No lowercase `new stripe(` calls found."

# 5. Look for the correct constructor usage
rg -n -E "new\s+Stripe\s*\(" --type js --type mjs || echo "No `new Stripe(` calls found; ensure constructors are updated."

echo "✅ Verification script complete."

Length of output: 3588


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "🔍 Re-verifying Stripe imports with simplified patterns..."

# Check for any default lowercase imports
rg -n "import stripe from 'stripe'" --type js --type mjs || true
rg -n 'import stripe from "stripe"' --type js --type mjs || true

# Check for any named-import variants
rg -n "import { Stripe } from 'stripe'" --type js --type mjs || true
rg -n 'import { Stripe } from "stripe"' --type js --type mjs || true

# Check for any default uppercase imports
rg -n "import Stripe from 'stripe'" --type js --type mjs || true
rg -n 'import Stripe from "stripe"' --type js --type mjs || true

echo "🔍 Re-verifying Stripe constructor usage..."

# Look for lowercase constructor calls
rg -n "new stripe(" --type js --type mjs || echo "No lowercase `new stripe(` calls found."

# Look for uppercase constructor calls
rg -n "new Stripe(" --type js --type mjs || echo "No uppercase `new Stripe(` calls found."

echo "✅ Re-verification complete."

Length of output: 1928


Manual verification required: ensure Stripe imports & constructors are fully updated

This upgrade to the Stripe SDK is breaking and must be applied consistently across all .js/.mjs files. Please confirm:

  • No remaining legacy imports:
    • import stripe from 'stripe' or "stripe"
    • import { Stripe } from 'stripe' (if your intended pattern is default import)
  • Only the approved import style is used:
    import Stripe from 'stripe';
  • All constructor invocations use the updated class:
    new Stripe()

You can run these simple checks at the repo root:

# Look for any old-style imports
rg "import stripe from 'stripe'" -g "*.js" -g "*.mjs" || echo "✔ no legacy default imports"
rg "import { Stripe } from 'stripe'" -g "*.js" -g "*.mjs" || echo "✔ no named-import variants"

# Confirm desired import exists
rg "import Stripe from 'stripe'" -g "*.js" -g "*.mjs" || echo "⚠️ missing approved default import"

# Verify constructor usage
rg "new Stripe\(" -g "*.js" -g "*.mjs" || echo "⚠️ no updated constructor calls found"

Once you’ve confirmed there are no leftover imports or constructor calls, this breaking change can be considered safely applied.

@jcortes
Copy link
Collaborator Author

jcortes commented May 27, 2025

/approve

@jcortes jcortes force-pushed the stripe-upgrade-to-latest-api-version branch from 75a18ee to 1e58f7b Compare May 27, 2025 19:08
@jcortes
Copy link
Collaborator Author

jcortes commented May 27, 2025

/approve

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: 2

♻️ Duplicate comments (1)
components/stripe/actions/create-customer/create-customer.mjs (1)

376-376: Missing JSON parsing for metadata.

Similar to the previous review feedback, metadata is passed directly without parsing. For consistency with other actions like update-payment-intent.mjs, consider using utils.parseJson.

-      metadata,
+      metadata: utils.parseJson(metadata),
📜 Review details

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

📥 Commits

Reviewing files that changed from the base of the PR and between 75a18ee and 1e58f7b.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (62)
  • 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 (1 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 (1 hunks)
  • components/stripe/actions/create-invoice-item/create-invoice-item.mjs (2 hunks)
  • components/stripe/actions/create-invoice/create-invoice.mjs (1 hunks)
  • components/stripe/actions/create-payment-intent/create-payment-intent.mjs (2 hunks)
  • components/stripe/actions/create-payout/create-payout.mjs (2 hunks)
  • components/stripe/actions/create-price/create-price.mjs (2 hunks)
  • components/stripe/actions/create-product/create-product.mjs (4 hunks)
  • components/stripe/actions/create-refund/create-refund.mjs (3 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 (2 hunks)
  • components/stripe/actions/delete-invoice-item/delete-invoice-item.mjs (3 hunks)
  • components/stripe/actions/delete-or-void-invoice/delete-or-void-invoice.mjs (2 hunks)
  • components/stripe/actions/finalize-invoice/finalize-invoice.mjs (2 hunks)
  • components/stripe/actions/list-balance-history/list-balance-history.mjs (2 hunks)
  • components/stripe/actions/list-customers/list-customers.mjs (2 hunks)
  • components/stripe/actions/list-invoices/list-invoices.mjs (3 hunks)
  • components/stripe/actions/list-payment-intents/list-payment-intents.mjs (2 hunks)
  • components/stripe/actions/list-payouts/list-payouts.mjs (1 hunks)
  • components/stripe/actions/list-refunds/list-refunds.mjs (3 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 (2 hunks)
  • components/stripe/actions/retrieve-checkout-session/retrieve-checkout-session.mjs (1 hunks)
  • components/stripe/actions/retrieve-customer/retrieve-customer.mjs (2 hunks)
  • components/stripe/actions/retrieve-invoice-item/retrieve-invoice-item.mjs (3 hunks)
  • components/stripe/actions/retrieve-invoice/retrieve-invoice.mjs (2 hunks)
  • components/stripe/actions/retrieve-payment-intent/retrieve-payment-intent.mjs (1 hunks)
  • components/stripe/actions/retrieve-payout/retrieve-payout.mjs (2 hunks)
  • components/stripe/actions/retrieve-price/retrieve-price.mjs (2 hunks)
  • components/stripe/actions/retrieve-product/retrieve-product.mjs (1 hunks)
  • components/stripe/actions/retrieve-refund/retrieve-refund.mjs (2 hunks)
  • components/stripe/actions/search-customers/search-customers.mjs (5 hunks)
  • components/stripe/actions/send-invoice/send-invoice.mjs (2 hunks)
  • components/stripe/actions/update-customer/update-customer.mjs (4 hunks)
  • components/stripe/actions/update-invoice-item/update-invoice-item.mjs (3 hunks)
  • components/stripe/actions/update-invoice/update-invoice.mjs (3 hunks)
  • components/stripe/actions/update-payment-intent/update-payment-intent.mjs (3 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 (2 hunks)
  • components/stripe/actions/write-off-invoice/write-off-invoice.mjs (2 hunks)
  • components/stripe/common/constants.mjs (2 hunks)
  • components/stripe/common/utils.mjs (1 hunks)
  • components/stripe/package.json (2 hunks)
  • components/stripe/sources/abandoned-cart/abandoned-cart.mjs (1 hunks)
  • components/stripe/sources/canceled-subscription/canceled-subscription.mjs (1 hunks)
  • components/stripe/sources/common/webhook-base.mjs (4 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 (9 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 (1)
  • components/stripe/actions/create-price/create-price.mjs
🚧 Files skipped from review as they are similar to previous changes (55)
  • components/stripe/sources/custom-webhook-events/custom-webhook-events.mjs
  • components/stripe/package.json
  • components/stripe/sources/new-subscription/new-subscription.mjs
  • components/stripe/common/constants.mjs
  • components/stripe/sources/new-failed-invoice-payment/new-failed-invoice-payment.mjs
  • components/stripe/sources/new-failed-payment/new-failed-payment.mjs
  • components/stripe/sources/new-customer/new-customer.mjs
  • components/stripe/sources/new-payment/new-payment.mjs
  • components/stripe/sources/new-invoice/new-invoice.mjs
  • components/stripe/sources/new-dispute/new-dispute.mjs
  • components/stripe/actions/retrieve-invoice/retrieve-invoice.mjs
  • components/stripe/sources/subscription-updated/subscription-updated.mjs
  • components/stripe/sources/common/webhook-base.mjs
  • components/stripe/actions/write-off-invoice/write-off-invoice.mjs
  • components/stripe/sources/canceled-subscription/canceled-subscription.mjs
  • components/stripe/actions/send-invoice/send-invoice.mjs
  • components/stripe/actions/void-invoice/void-invoice.mjs
  • components/stripe/sources/abandoned-cart/abandoned-cart.mjs
  • components/stripe/actions/delete-or-void-invoice/delete-or-void-invoice.mjs
  • components/stripe/actions/create-billing-meter/create-billing-meter.mjs
  • components/stripe/actions/delete-customer/delete-customer.mjs
  • components/stripe/actions/update-payout/update-payout.mjs
  • components/stripe/actions/list-payment-intents/list-payment-intents.mjs
  • components/stripe/actions/retrieve-checkout-session/retrieve-checkout-session.mjs
  • components/stripe/actions/retrieve-product/retrieve-product.mjs
  • components/stripe/actions/retrieve-customer/retrieve-customer.mjs
  • components/stripe/actions/retrieve-payout/retrieve-payout.mjs
  • components/stripe/actions/retrieve-payment-intent/retrieve-payment-intent.mjs
  • components/stripe/actions/retrieve-price/retrieve-price.mjs
  • components/stripe/actions/retrieve-checkout-session-line-items/retrieve-checkout-session-line-items.mjs
  • components/stripe/actions/list-customers/list-customers.mjs
  • components/stripe/actions/retrieve-balance/retrieve-balance.mjs
  • components/stripe/actions/update-refund/update-refund.mjs
  • components/stripe/actions/delete-invoice-item/delete-invoice-item.mjs
  • components/stripe/actions/finalize-invoice/finalize-invoice.mjs
  • components/stripe/actions/update-invoice-item/update-invoice-item.mjs
  • components/stripe/actions/retrieve-refund/retrieve-refund.mjs
  • components/stripe/actions/create-payment-intent/create-payment-intent.mjs
  • components/stripe/actions/retrieve-invoice-item/retrieve-invoice-item.mjs
  • components/stripe/actions/create-invoice-item/create-invoice-item.mjs
  • components/stripe/actions/create-product/create-product.mjs
  • components/stripe/actions/list-refunds/list-refunds.mjs
  • components/stripe/actions/list-balance-history/list-balance-history.mjs
  • components/stripe/actions/search-customers/search-customers.mjs
  • components/stripe/actions/update-invoice/update-invoice.mjs
  • components/stripe/actions/create-payout/create-payout.mjs
  • components/stripe/actions/cancel-payment-intent/cancel-payment-intent.mjs
  • components/stripe/common/utils.mjs
  • components/stripe/actions/create-refund/create-refund.mjs
  • components/stripe/actions/create-subscription/create-subscription.mjs
  • components/stripe/actions/list-invoices/list-invoices.mjs
  • components/stripe/actions/create-invoice/create-invoice.mjs
  • components/stripe/actions/list-payouts/list-payouts.mjs
  • components/stripe/actions/cancel-or-reverse-payout/cancel-or-reverse-payout.mjs
  • components/stripe/actions/update-customer/update-customer.mjs
⏰ Context from checks skipped due to timeout of 90000ms (4)
  • GitHub Check: pnpm publish
  • GitHub Check: Publish TypeScript components
  • GitHub Check: Lint Code Base
  • GitHub Check: Verify TypeScript components
🔇 Additional comments (13)
components/stripe/actions/capture-payment-intent/capture-payment-intent.mjs (1)

7-96: Excellent refactoring from generic to explicit props!

The transformation from a generic advanced prop to explicit, well-defined individual properties significantly improves clarity and maintainability. Key improvements include:

  • Clear prop definitions with proper types and descriptions
  • Informational alert guiding users on PaymentIntent capture behavior
  • Proper camelCase to snake_case parameter mapping
  • Conditional parameter inclusion (e.g., transfer_data only when transferDataAmount is provided)

This approach makes the action more discoverable and reduces the likelihood of API errors from incorrect parameter formatting.

components/stripe/actions/update-payment-intent/update-payment-intent.mjs (2)

164-217: Well-implemented conditional parameter construction!

The getOtherParams method elegantly handles conditional inclusion of nested objects:

  • Shipping object only included when any shipping field is present
  • Statement descriptor truncation to 21 characters (Stripe's limit)
  • Clean conditional spread syntax for optional parameters

This approach prevents sending empty nested objects to the Stripe API.


237-237: Proper JSON parsing for metadata!

Good use of utils.parseJson(metadata) for consistent JSON handling across the codebase.

components/stripe/actions/create-customer/create-customer.mjs (2)

255-350: Excellent conditional parameter construction!

The getOtherParams method effectively handles complex nested objects:

  • Proper conditional checks for address, shipping, tax, cash balance, and invoice settings
  • Clean separation of concerns for different parameter groups
  • Appropriate snake_case parameter naming for Stripe API

385-385: Good use of parseArray utility!

Proper handling of taxIdData array parsing ensures robust input validation.

components/stripe/actions/confirm-payment-intent/confirm-payment-intent.mjs (3)

12-17: Helpful informational alert!

The alert prop provides valuable context about payment confirmation behavior, improving user experience.


227-304: Robust conditional parameter construction!

The getOtherParams method properly handles complex nested objects with safe conditional logic:

  • Shipping object construction with proper field checking
  • Mandate data with nested customer acceptance handling
  • Radar options conditional inclusion

The conditional spread syntax is correctly implemented and avoids potential runtime errors.


336-336: Proper JSON parsing for paymentMethodOptions!

Good implementation using utils.parseJson(paymentMethodOptions) which addresses the previous review concern about type handling. This ensures the Stripe API receives a proper object instead of a string.

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

1-2: LGTM - Correct SDK import pattern for v18

The change from default import to named import Stripe aligns with the newer Stripe SDK v18 patterns. The addition of the constants module import is also appropriate for centralizing API version configuration.


481-540: LGTM - Comprehensive filtering and pagination props

The new filtering and pagination properties (created/arrival date filters, cursor pagination) follow Stripe API patterns correctly and will enhance the functionality of list operations.


606-611: LGTM - Correct SDK initialization with API version

The SDK initialization has been properly updated to use the named import Stripe constructor and the centralized API version constant. This aligns with the v18 SDK patterns and maintains consistency.


341-341: LGTM - Improved property descriptions

The updated descriptions provide better clarity and include relevant documentation links. The changes improve the user experience by providing more detailed and accurate information.

Also applies to: 347-347, 353-353, 359-359, 365-365, 371-371, 377-377, 393-393, 399-399, 406-406, 416-416


71-71:

✅ Verification successful

Verify breaking changes from snake_case to camelCase property names

Multiple property names have been changed from snake_case to camelCase (e.g., payment_methodpaymentMethod, invoice_iteminvoiceItem, etc.). While this improves consistency, these are breaking changes that would affect all existing actions and sources using these properties.

Please run the following script to verify that all dependent files have been updated to use the new camelCase property names:

Also applies to: 158-158, 207-207, 213-213, 292-292, 299-299, 317-317, 380-380


🏁 Script executed:

#!/bin/bash
# Description: Verify that all references to old snake_case property names have been updated

echo "Checking for remaining snake_case property references..."

# Check for old property names that should have been updated
rg -n "payment_method[^_]" --type js
rg -n "invoice_item[^_]" --type js  
rg -n "checkout_session[^_]" --type js
rg -n "payment_intent[^_]" --type js
rg -n "setup_future_usage[^_]" --type js

echo "Checking for new camelCase usage in action files..."
rg -n "paymentMethod\|invoiceItem\|checkoutSession\|paymentIntent\|setupFutureUsage" components/stripe/actions/ -A 2

Length of output: 553


🏁 Script executed:

#!/bin/bash
# Refined check: include .mjs, .js, .ts, .tsx files and drop the [^_] suffix
echo "🔍 Checking for remaining snake_case property references across .{js,mjs,ts,tsx}..."
rg -n "payment_method" --glob "*.{js,mjs,ts,tsx}"
rg -n "invoice_item"    --glob "*.{js,mjs,ts,tsx}"
rg -n "checkout_session" --glob "*.{js,mjs,ts,tsx}"
rg -n "payment_intent"   --glob "*.{js,mjs,ts,tsx}"
rg -n "setup_future_usage" --glob "*.{js,mjs,ts,tsx}"

echo
echo "✅ Checking for new camelCase property usage across .{js,mjs,ts,tsx}..."
rg -n "paymentMethod"     --glob "*.{js,mjs,ts,tsx}"
rg -n "invoiceItem"       --glob "*.{js,mjs,ts,tsx}"
rg -n "checkoutSession"   --glob "*.{js,mjs,ts,tsx}"
rg -n "paymentIntent"     --glob "*.{js,mjs,ts,tsx}"
rg -n "setupFutureUsage"  --glob "*.{js,mjs,ts,tsx}"

Length of output: 32247


No action needed—Stripe input props are already camelCase and SDK request keys remain snake_case

The remaining payment_method, invoice_item, etc. strings are parameter keys for the Stripe SDK (which expects snake_case) and not references to input props. All input properties in components/stripe have been updated to camelCase.

},
addressLine2: {
type: "string",
label: "Shipping - Address - Line 2",
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue

Fix inconsistent property descriptions

The descriptions for these address properties incorrectly reference "Shipping" when they should reference "Address":

     addressLine2: {
       type: "string",
-      label: "Shipping - Address - Line 2",
+      label: "Address - Line 2",
       description: "Address line 2 (e.g., apartment, suite, unit, or building).",
       optional: true,
     },
     addressState: {
       type: "string", 
-      label: "Shipping - Address - State",
+      label: "Address - State",
       description: "State, county, province, or region.",
       optional: true,
     },

Also applies to: 573-573

🤖 Prompt for AI Agents
In components/stripe/stripe.app.mjs at lines 561 and 573, the property
descriptions incorrectly use "Shipping" instead of "Address". Update the
descriptions to replace "Shipping" with "Address" to ensure consistency and
accuracy in the property labels.

arrivalDateGt: {
type: "string",
label: "Arrival Date (Greater Than)",
description: "Only return transactions that were created after this date (exclusive). In ISO 8601 format. Eg. `2023-01-01T00:00:00Z`",
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue

Fix incorrect descriptions for arrival date filters

The descriptions for arrival date filters incorrectly reference "created" instead of "arrival date":

     arrivalDateGt: {
       type: "string",
       label: "Arrival Date (Greater Than)",
-      description: "Only return transactions that were created after this date (exclusive). In ISO 8601 format. Eg. `2023-01-01T00:00:00Z`",
+      description: "Only return transactions with arrival date after this date (exclusive). In ISO 8601 format. Eg. `2023-01-01T00:00:00Z`",
       optional: true,
     },

Apply similar fixes to arrivalDateGte, arrivalDateLt, and arrivalDateLte descriptions.

Also applies to: 514-514, 520-520, 526-526

🤖 Prompt for AI Agents
In components/stripe/stripe.app.mjs at lines 508, 514, 520, and 526, the
descriptions for the arrival date filters incorrectly mention "created" instead
of "arrival date." Update the description strings for arrivalDateGte,
arrivalDateLt, and arrivalDateLte to correctly reference "arrival date" rather
than "created" to accurately describe the filter criteria.

@jcortes jcortes merged commit 17c06e8 into master May 27, 2025
11 checks passed
@jcortes jcortes deleted the stripe-upgrade-to-latest-api-version branch May 27, 2025 20:20
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

5 participants