diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c36e1d8e..62c060cf 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -18,7 +18,7 @@ jobs: lint: timeout-minutes: 10 name: lint - runs-on: ${{ github.repository == 'stainless-sdks/lithic-typescript' && 'depot-ubuntu-24.04' || 'ubuntu-latest' }} + runs-on: ${{ startsWith(github.repository, 'stainless-sdks/') && 'depot-ubuntu-24.04' || 'ubuntu-latest' }} if: (github.event_name == 'push' || github.event.pull_request.head.repo.fork) && (github.event_name != 'push' || github.event.head_commit.message != 'codegen metadata') steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 @@ -26,7 +26,7 @@ jobs: - name: Set up Node uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 with: - node-version: '22' + node-version: '24' - name: Bootstrap run: ./scripts/bootstrap @@ -37,7 +37,7 @@ jobs: build: timeout-minutes: 5 name: build - runs-on: ${{ github.repository == 'stainless-sdks/lithic-typescript' && 'depot-ubuntu-24.04' || 'ubuntu-latest' }} + runs-on: ${{ startsWith(github.repository, 'stainless-sdks/') && 'depot-ubuntu-24.04' || 'ubuntu-latest' }} if: (github.event_name == 'push' || github.event.pull_request.head.repo.fork) && (github.event_name != 'push' || github.event.head_commit.message != 'codegen metadata') permissions: contents: read @@ -48,7 +48,7 @@ jobs: - name: Set up Node uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 with: - node-version: '22' + node-version: '24' - name: Bootstrap run: ./scripts/bootstrap @@ -88,7 +88,7 @@ jobs: test: timeout-minutes: 10 name: test - runs-on: ${{ github.repository == 'stainless-sdks/lithic-typescript' && 'depot-ubuntu-24.04' || 'ubuntu-latest' }} + runs-on: ${{ startsWith(github.repository, 'stainless-sdks/') && 'depot-ubuntu-24.04' || 'ubuntu-latest' }} if: github.event_name == 'push' || github.event.pull_request.head.repo.fork steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 @@ -96,7 +96,7 @@ jobs: - name: Set up Node uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 with: - node-version: '22' + node-version: '24' - name: Bootstrap run: ./scripts/bootstrap diff --git a/.github/workflows/publish-npm.yml b/.github/workflows/publish-npm.yml index b24a2038..531d4bc5 100644 --- a/.github/workflows/publish-npm.yml +++ b/.github/workflows/publish-npm.yml @@ -26,7 +26,7 @@ jobs: - name: Set up Node uses: actions/setup-node@3235b876344d2a9aa001b8d1453c930bba69e610 # v3.9.1 with: - node-version: '20' + node-version: '24' - name: Install dependencies run: | diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 6255c680..80e5148f 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "0.144.0" + ".": "0.145.0" } diff --git a/.stats.yml b/.stats.yml index 189b2dd2..6174bfd2 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 214 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/lithic/lithic-9e397c65ffb81e2928b8ecf979769a79131ae6058b6fb373a5e930dc8a168732.yml -openapi_spec_hash: 93aea3855d2d1c390107d223762aa818 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/lithic/lithic-2d2600072500797474f0d7798c1a8b668bfbc4e0c6a8f076ca7b4cc7ad82058b.yml +openapi_spec_hash: 7605eb6be77a3d150078916f0eb0e9ac config_hash: 5bb913c05ebeb301ec925b16e75bb251 diff --git a/CHANGELOG.md b/CHANGELOG.md index a0fa287b..f6301d25 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,27 @@ # Changelog +## 0.145.0 (2026-07-17) + +Full Changelog: [v0.144.0...v0.145.0](https://github.com/lithic-com/lithic-node/compare/v0.144.0...v0.145.0) + +### Features + +* **api:** add embed.session_generated and embed.viewed webhook event types ([11b01a3](https://github.com/lithic-com/lithic-node/commit/11b01a39d4e6d861ec9d344c307bd93217a0e2ce)) +* **api:** add PAYMENT enum value to category in book-transfers ([5336e09](https://github.com/lithic-com/lithic-node/commit/5336e09f4a90efeb39a9f8491fe1a82be988efd1)) +* **stlc:** configurable CI runner and private-production-repo support in workflow templates ([82e45d9](https://github.com/lithic-com/lithic-node/commit/82e45d9b890c8137b8bb6847a4728730b10d359f)) + + +### Bug Fixes + +* **ci:** bump @arethetypeswrong/cli to ^0.18.0 and run CI workflows on Node 24 ([26e94a9](https://github.com/lithic-com/lithic-node/commit/26e94a90083a853ff7ff5ec8ae0f45ef05e8ed20)) + + +### Documentation + +* **api:** expand dispute event descriptions in events resource ([6f33a7e](https://github.com/lithic-com/lithic-node/commit/6f33a7eac9ba69995d7cfdd4edba0e9844e0a2ec)) +* **api:** update category parameter description in externalPayments.list ([ffeabcb](https://github.com/lithic-com/lithic-node/commit/ffeabcba30c154d65bcf9c2fb3f74d8c90acd3cd)) +* **api:** update simulate_clearing method documentation in transactions ([ce3f22c](https://github.com/lithic-com/lithic-node/commit/ce3f22c7e0a90684772cd4c82c361763c9fcc063)) + ## 0.144.0 (2026-06-29) Full Changelog: [v0.143.0...v0.144.0](https://github.com/lithic-com/lithic-node/compare/v0.143.0...v0.144.0) diff --git a/api.md b/api.md index d97f0c92..4b129e69 100644 --- a/api.md +++ b/api.md @@ -915,6 +915,8 @@ Types: - DigitalWalletTokenizationUpdatedWebhookEvent - DisputeUpdatedWebhookEvent - DisputeEvidenceUploadFailedWebhookEvent +- EmbedSessionGeneratedWebhookEvent +- EmbedViewedWebhookEvent - ExternalBankAccountCreatedWebhookEvent - ExternalBankAccountUpdatedWebhookEvent - ExternalPaymentCreatedWebhookEvent diff --git a/package.json b/package.json index 1bebc2c2..3b80a553 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "lithic", - "version": "0.144.0", + "version": "0.145.0", "description": "The official TypeScript library for the Lithic API", "author": "Lithic ", "types": "dist/index.d.ts", @@ -30,7 +30,7 @@ "standardwebhooks": "^1.0.0" }, "devDependencies": { - "@arethetypeswrong/cli": "^0.17.0", + "@arethetypeswrong/cli": "^0.18.0", "@swc/core": "^1.3.102", "@swc/jest": "^0.2.29", "@types/jest": "^29.4.0", diff --git a/packages/mcp-server/manifest.json b/packages/mcp-server/manifest.json index 653fe9d1..7244cf48 100644 --- a/packages/mcp-server/manifest.json +++ b/packages/mcp-server/manifest.json @@ -1,7 +1,7 @@ { "dxt_version": "0.2", "name": "lithic-mcp", - "version": "0.144.0", + "version": "0.145.0", "description": "The official MCP Server for the Lithic API", "author": { "name": "Lithic", diff --git a/packages/mcp-server/package.json b/packages/mcp-server/package.json index c1124e63..01bc6d53 100644 --- a/packages/mcp-server/package.json +++ b/packages/mcp-server/package.json @@ -1,6 +1,6 @@ { "name": "lithic-mcp", - "version": "0.144.0", + "version": "0.145.0", "description": "The official MCP Server for the Lithic API", "author": "Lithic ", "types": "dist/index.d.ts", diff --git a/packages/mcp-server/src/local-docs-search.ts b/packages/mcp-server/src/local-docs-search.ts index a542d9af..29cdb9cb 100644 --- a/packages/mcp-server/src/local-docs-search.ts +++ b/packages/mcp-server/src/local-docs-search.ts @@ -3593,13 +3593,13 @@ const EMBEDDED_METHODS: MethodEntry[] = [ httpMethod: 'get', summary: 'Embedded card UI', description: - 'Handling full card PANs and CVV codes requires that you comply with the Payment Card Industry Data Security Standards (PCI DSS). Some clients choose to reduce their compliance obligations by leveraging our embedded card UI solution documented below.\n\nIn this setup, PANs and CVV codes are presented to the end-user via a card UI that we provide, optionally styled in the customer\'s branding using a specified css stylesheet. A user\'s browser makes the request directly to api.lithic.com, so card PANs and CVVs never touch the API customer\'s servers while full card data is displayed to their end-users. The response contains an HTML document (see Embedded Card UI or Changelog for upcoming changes in January). This means that the url for the request can be inserted straight into the `src` attribute of an iframe.\n\n```html\n\n```\n\nYou should compute the request payload on the server side. You can render it (or the whole iframe) on the server or make an ajax call from your front end code, but **do not ever embed your API key into front end code, as doing so introduces a serious security vulnerability**.\n', + '**Deprecated.** Use the modern embedded card flow instead: create a session with `POST /v1/cards/{card_token}/embed` and render it via `GET /v1/embed`.\n\nHandling full card PANs and CVV codes requires that you comply with the Payment Card Industry Data Security Standards (PCI DSS). Some clients choose to reduce their compliance obligations by leveraging our embedded card UI solution documented below.\n\nIn this setup, PANs and CVV codes are presented to the end-user via a card UI that we provide, optionally styled in the customer\'s branding using a specified css stylesheet. A user\'s browser makes the request directly to api.lithic.com, so card PANs and CVVs never touch the API customer\'s servers while full card data is displayed to their end-users. The response contains an HTML document (see Embedded Card UI or Changelog for upcoming changes in January). This means that the url for the request can be inserted straight into the `src` attribute of an iframe.\n\n```html\n\n```\n\nYou should compute the request payload on the server side. You can render it (or the whole iframe) on the server or make an ajax call from your front end code, but **do not ever embed your API key into front end code, as doing so introduces a serious security vulnerability**.\n', stainlessPath: '(resource) cards > (method) embed', qualified: 'client.cards.embed', params: ['embed_request: string;', 'hmac: string;'], response: 'string', markdown: - "## embed\n\n`client.cards.embed(embed_request: string, hmac: string): string`\n\n**get** `/v1/embed/card`\n\nHandling full card PANs and CVV codes requires that you comply with the Payment Card Industry Data Security Standards (PCI DSS). Some clients choose to reduce their compliance obligations by leveraging our embedded card UI solution documented below.\n\nIn this setup, PANs and CVV codes are presented to the end-user via a card UI that we provide, optionally styled in the customer's branding using a specified css stylesheet. A user's browser makes the request directly to api.lithic.com, so card PANs and CVVs never touch the API customer's servers while full card data is displayed to their end-users. The response contains an HTML document (see Embedded Card UI or Changelog for upcoming changes in January). This means that the url for the request can be inserted straight into the `src` attribute of an iframe.\n\n```html\n\n```\n\nYou should compute the request payload on the server side. You can render it (or the whole iframe) on the server or make an ajax call from your front end code, but **do not ever embed your API key into front end code, as doing so introduces a serious security vulnerability**.\n\n\n### Parameters\n\n- `embed_request: string`\n A base64 encoded JSON string of an EmbedRequest to specify which card to load.\n\n- `hmac: string`\n SHA256 HMAC of the embed_request JSON string with base64 digest.\n\n### Returns\n\n- `string`\n\n### Example\n\n```typescript\nimport Lithic from 'lithic';\n\nconst client = new Lithic();\n\nconst response = await client.cards.embed({ embed_request: 'embed_request', hmac: 'hmac' });\n\nconsole.log(response);\n```", + "## embed\n\n`client.cards.embed(embed_request: string, hmac: string): string`\n\n**get** `/v1/embed/card`\n\n**Deprecated.** Use the modern embedded card flow instead: create a session with `POST /v1/cards/{card_token}/embed` and render it via `GET /v1/embed`.\n\nHandling full card PANs and CVV codes requires that you comply with the Payment Card Industry Data Security Standards (PCI DSS). Some clients choose to reduce their compliance obligations by leveraging our embedded card UI solution documented below.\n\nIn this setup, PANs and CVV codes are presented to the end-user via a card UI that we provide, optionally styled in the customer's branding using a specified css stylesheet. A user's browser makes the request directly to api.lithic.com, so card PANs and CVVs never touch the API customer's servers while full card data is displayed to their end-users. The response contains an HTML document (see Embedded Card UI or Changelog for upcoming changes in January). This means that the url for the request can be inserted straight into the `src` attribute of an iframe.\n\n```html\n\n```\n\nYou should compute the request payload on the server side. You can render it (or the whole iframe) on the server or make an ajax call from your front end code, but **do not ever embed your API key into front end code, as doing so introduces a serious security vulnerability**.\n\n\n### Parameters\n\n- `embed_request: string`\n A base64 encoded JSON string of an EmbedRequest to specify which card to load.\n\n- `hmac: string`\n SHA256 HMAC of the embed_request JSON string with base64 digest.\n\n### Returns\n\n- `string`\n\n### Example\n\n```typescript\nimport Lithic from 'lithic';\n\nconst client = new Lithic();\n\nconst response = await client.cards.embed({ embed_request: 'embed_request', hmac: 'hmac' });\n\nconsole.log(response);\n```", perLanguage: { typescript: { method: 'client.cards.embed', @@ -7187,13 +7187,13 @@ const EMBEDDED_METHODS: MethodEntry[] = [ httpMethod: 'post', summary: 'Simulate clearing', description: - 'Clears an existing authorization, either debit or credit. After this event, the transaction transitions from `PENDING` to `SETTLED` status.\n\nIf `amount` is not set, the full amount of the transaction will be cleared. Transactions that have already cleared, either partially or fully, cannot be cleared again using this endpoint.\n', + 'Clears an existing authorization, either debit or credit. After this event, the transaction transitions from `PENDING` to `SETTLED` status.\n\nIf `amount` is not set, the full amount of the transaction will be cleared. This endpoint may be called multiple times against the same authorization to simulate a multiple-completion scenario, with each call creating a separate clearing event.\n', stainlessPath: '(resource) transactions > (method) simulate_clearing', qualified: 'client.transactions.simulateClearing', params: ['token: string;', 'amount?: number;'], response: '{ debugging_request_id?: string; }', markdown: - "## simulate_clearing\n\n`client.transactions.simulateClearing(token: string, amount?: number): { debugging_request_id?: string; }`\n\n**post** `/v1/simulate/clearing`\n\nClears an existing authorization, either debit or credit. After this event, the transaction transitions from `PENDING` to `SETTLED` status.\n\nIf `amount` is not set, the full amount of the transaction will be cleared. Transactions that have already cleared, either partially or fully, cannot be cleared again using this endpoint.\n\n\n### Parameters\n\n- `token: string`\n The transaction token returned from the /v1/simulate/authorize response.\n\n- `amount?: number`\n Amount (in cents) to clear. Typically this will match the amount in the original authorization, but can be higher or lower. The sign of this amount will automatically match the sign of the original authorization's amount. For example, entering 100 in this field will result in a -100 amount in the transaction, if the original authorization is a credit authorization.\n\nIf `amount` is not set, the full amount of the transaction will be cleared. Transactions that have already cleared, either partially or fully, cannot be cleared again using this endpoint.\n\n\n### Returns\n\n- `{ debugging_request_id?: string; }`\n\n - `debugging_request_id?: string`\n\n### Example\n\n```typescript\nimport Lithic from 'lithic';\n\nconst client = new Lithic();\n\nconst response = await client.transactions.simulateClearing({ token: 'fabd829d-7f7b-4432-a8f2-07ea4889aaac' });\n\nconsole.log(response);\n```", + "## simulate_clearing\n\n`client.transactions.simulateClearing(token: string, amount?: number): { debugging_request_id?: string; }`\n\n**post** `/v1/simulate/clearing`\n\nClears an existing authorization, either debit or credit. After this event, the transaction transitions from `PENDING` to `SETTLED` status.\n\nIf `amount` is not set, the full amount of the transaction will be cleared. This endpoint may be called multiple times against the same authorization to simulate a multiple-completion scenario, with each call creating a separate clearing event.\n\n\n### Parameters\n\n- `token: string`\n The transaction token returned from the /v1/simulate/authorize response.\n\n- `amount?: number`\n Amount (in cents) to clear. Typically this will match the amount in the original authorization, but can be higher or lower. The sign of this amount will automatically match the sign of the original authorization's amount. For example, entering 100 in this field will result in a -100 amount in the transaction, if the original authorization is a credit authorization.\n\nIf `amount` is not set, the full amount of the transaction will be cleared. This endpoint may be called multiple times against the same authorization to simulate a multiple-completion scenario, with each call creating a separate clearing event.\n\n\n### Returns\n\n- `{ debugging_request_id?: string; }`\n\n - `debugging_request_id?: string`\n\n### Example\n\n```typescript\nimport Lithic from 'lithic';\n\nconst client = new Lithic();\n\nconst response = await client.transactions.simulateClearing({ token: 'fabd829d-7f7b-4432-a8f2-07ea4889aaac' });\n\nconsole.log(response);\n```", perLanguage: { typescript: { method: 'client.transactions.simulateClearing', @@ -10069,7 +10069,7 @@ const EMBEDDED_METHODS: MethodEntry[] = [ response: "{ token: string; created: string; status: 'PENDING' | 'SETTLED' | 'DECLINED' | 'REVERSED' | 'CANCELED' | 'RETURNED'; updated: string; category?: string; currency?: string; events?: { token: string; amount: number; created: string; detailed_results: 'APPROVED' | 'INSUFFICIENT_FUNDS'[]; effective_date: string; memo: string; result: 'APPROVED' | 'DECLINED'; type: string; }[]; family?: 'EXTERNAL_PAYMENT'; financial_account_token?: string; payment_type?: 'DEPOSIT' | 'WITHDRAWAL'; pending_amount?: number; result?: 'APPROVED' | 'DECLINED'; settled_amount?: number; user_defined_id?: string; }", markdown: - "## list\n\n`client.externalPayments.list(begin?: string, business_account_token?: string, category?: string, end?: string, ending_before?: string, financial_account_token?: string, page_size?: number, result?: 'APPROVED' | 'DECLINED', starting_after?: string, status?: 'PENDING' | 'SETTLED' | 'DECLINED' | 'REVERSED' | 'CANCELED' | 'RETURNED'): { token: string; created: string; status: 'PENDING' | 'SETTLED' | 'DECLINED' | 'REVERSED' | 'CANCELED' | 'RETURNED'; updated: string; category?: string; currency?: string; events?: object[]; family?: 'EXTERNAL_PAYMENT'; financial_account_token?: string; payment_type?: 'DEPOSIT' | 'WITHDRAWAL'; pending_amount?: number; result?: 'APPROVED' | 'DECLINED'; settled_amount?: number; user_defined_id?: string; }`\n\n**get** `/v1/external_payments`\n\nList external payments\n\n### Parameters\n\n- `begin?: string`\n Date string in RFC 3339 format. Only entries created after the specified time will be included. UTC time zone.\n\n- `business_account_token?: string`\n\n- `category?: string`\n External Payment category to be returned.\n\n- `end?: string`\n Date string in RFC 3339 format. Only entries created before the specified time will be included. UTC time zone.\n\n- `ending_before?: string`\n A cursor representing an item's token before which a page of results should end. Used to retrieve the previous page of results before this item.\n\n- `financial_account_token?: string`\n Globally unique identifier for the financial account or card that will send the funds. Accepted type dependent on the program's use case.\n\n- `page_size?: number`\n Page size (for pagination).\n\n- `result?: 'APPROVED' | 'DECLINED'`\n External Payment result to be returned.\n\n- `starting_after?: string`\n A cursor representing an item's token after which a page of results should begin. Used to retrieve the next page of results after this item.\n\n- `status?: 'PENDING' | 'SETTLED' | 'DECLINED' | 'REVERSED' | 'CANCELED' | 'RETURNED'`\n Book transfer status to be returned.\n\n### Returns\n\n- `{ token: string; created: string; status: 'PENDING' | 'SETTLED' | 'DECLINED' | 'REVERSED' | 'CANCELED' | 'RETURNED'; updated: string; category?: string; currency?: string; events?: { token: string; amount: number; created: string; detailed_results: 'APPROVED' | 'INSUFFICIENT_FUNDS'[]; effective_date: string; memo: string; result: 'APPROVED' | 'DECLINED'; type: string; }[]; family?: 'EXTERNAL_PAYMENT'; financial_account_token?: string; payment_type?: 'DEPOSIT' | 'WITHDRAWAL'; pending_amount?: number; result?: 'APPROVED' | 'DECLINED'; settled_amount?: number; user_defined_id?: string; }`\n\n - `token: string`\n - `created: string`\n - `status: 'PENDING' | 'SETTLED' | 'DECLINED' | 'REVERSED' | 'CANCELED' | 'RETURNED'`\n - `updated: string`\n - `category?: string`\n - `currency?: string`\n - `events?: { token: string; amount: number; created: string; detailed_results: 'APPROVED' | 'INSUFFICIENT_FUNDS'[]; effective_date: string; memo: string; result: 'APPROVED' | 'DECLINED'; type: string; }[]`\n - `family?: 'EXTERNAL_PAYMENT'`\n - `financial_account_token?: string`\n - `payment_type?: 'DEPOSIT' | 'WITHDRAWAL'`\n - `pending_amount?: number`\n - `result?: 'APPROVED' | 'DECLINED'`\n - `settled_amount?: number`\n - `user_defined_id?: string`\n\n### Example\n\n```typescript\nimport Lithic from 'lithic';\n\nconst client = new Lithic();\n\n// Automatically fetches more pages as needed.\nfor await (const externalPayment of client.externalPayments.list()) {\n console.log(externalPayment);\n}\n```", + "## list\n\n`client.externalPayments.list(begin?: string, business_account_token?: string, category?: string, end?: string, ending_before?: string, financial_account_token?: string, page_size?: number, result?: 'APPROVED' | 'DECLINED', starting_after?: string, status?: 'PENDING' | 'SETTLED' | 'DECLINED' | 'REVERSED' | 'CANCELED' | 'RETURNED'): { token: string; created: string; status: 'PENDING' | 'SETTLED' | 'DECLINED' | 'REVERSED' | 'CANCELED' | 'RETURNED'; updated: string; category?: string; currency?: string; events?: object[]; family?: 'EXTERNAL_PAYMENT'; financial_account_token?: string; payment_type?: 'DEPOSIT' | 'WITHDRAWAL'; pending_amount?: number; result?: 'APPROVED' | 'DECLINED'; settled_amount?: number; user_defined_id?: string; }`\n\n**get** `/v1/external_payments`\n\nList external payments\n\n### Parameters\n\n- `begin?: string`\n Date string in RFC 3339 format. Only entries created after the specified time will be included. UTC time zone.\n\n- `business_account_token?: string`\n\n- `category?: string`\n The external rail the funds moved on\n\n- `end?: string`\n Date string in RFC 3339 format. Only entries created before the specified time will be included. UTC time zone.\n\n- `ending_before?: string`\n A cursor representing an item's token before which a page of results should end. Used to retrieve the previous page of results before this item.\n\n- `financial_account_token?: string`\n Globally unique identifier for the financial account or card that will send the funds. Accepted type dependent on the program's use case.\n\n- `page_size?: number`\n Page size (for pagination).\n\n- `result?: 'APPROVED' | 'DECLINED'`\n External Payment result to be returned.\n\n- `starting_after?: string`\n A cursor representing an item's token after which a page of results should begin. Used to retrieve the next page of results after this item.\n\n- `status?: 'PENDING' | 'SETTLED' | 'DECLINED' | 'REVERSED' | 'CANCELED' | 'RETURNED'`\n Book transfer status to be returned.\n\n### Returns\n\n- `{ token: string; created: string; status: 'PENDING' | 'SETTLED' | 'DECLINED' | 'REVERSED' | 'CANCELED' | 'RETURNED'; updated: string; category?: string; currency?: string; events?: { token: string; amount: number; created: string; detailed_results: 'APPROVED' | 'INSUFFICIENT_FUNDS'[]; effective_date: string; memo: string; result: 'APPROVED' | 'DECLINED'; type: string; }[]; family?: 'EXTERNAL_PAYMENT'; financial_account_token?: string; payment_type?: 'DEPOSIT' | 'WITHDRAWAL'; pending_amount?: number; result?: 'APPROVED' | 'DECLINED'; settled_amount?: number; user_defined_id?: string; }`\n\n - `token: string`\n - `created: string`\n - `status: 'PENDING' | 'SETTLED' | 'DECLINED' | 'REVERSED' | 'CANCELED' | 'RETURNED'`\n - `updated: string`\n - `category?: string`\n - `currency?: string`\n - `events?: { token: string; amount: number; created: string; detailed_results: 'APPROVED' | 'INSUFFICIENT_FUNDS'[]; effective_date: string; memo: string; result: 'APPROVED' | 'DECLINED'; type: string; }[]`\n - `family?: 'EXTERNAL_PAYMENT'`\n - `financial_account_token?: string`\n - `payment_type?: 'DEPOSIT' | 'WITHDRAWAL'`\n - `pending_amount?: number`\n - `result?: 'APPROVED' | 'DECLINED'`\n - `settled_amount?: number`\n - `user_defined_id?: string`\n\n### Example\n\n```typescript\nimport Lithic from 'lithic';\n\nconst client = new Lithic();\n\n// Automatically fetches more pages as needed.\nfor await (const externalPayment of client.externalPayments.list()) {\n console.log(externalPayment);\n}\n```", perLanguage: { typescript: { method: 'client.externalPayments.list', diff --git a/packages/mcp-server/src/server.ts b/packages/mcp-server/src/server.ts index 650f59f0..6465ef6d 100644 --- a/packages/mcp-server/src/server.ts +++ b/packages/mcp-server/src/server.ts @@ -29,7 +29,7 @@ export const newMcpServer = async ({ new McpServer( { name: 'lithic_api', - version: '0.144.0', + version: '0.145.0', }, { instructions: await getInstructions({ stainlessApiKey, customInstructionsPath }), diff --git a/src/client.ts b/src/client.ts index 525fa561..980f9079 100644 --- a/src/client.ts +++ b/src/client.ts @@ -225,6 +225,8 @@ import { DisputeTransactionCreatedWebhookEvent, DisputeTransactionUpdatedWebhookEvent, DisputeUpdatedWebhookEvent, + EmbedSessionGeneratedWebhookEvent, + EmbedViewedWebhookEvent, ExternalBankAccountCreatedWebhookEvent, ExternalBankAccountUpdatedWebhookEvent, ExternalPaymentCreatedWebhookEvent, @@ -1623,6 +1625,8 @@ export declare namespace Lithic { type DigitalWalletTokenizationUpdatedWebhookEvent as DigitalWalletTokenizationUpdatedWebhookEvent, type DisputeUpdatedWebhookEvent as DisputeUpdatedWebhookEvent, type DisputeEvidenceUploadFailedWebhookEvent as DisputeEvidenceUploadFailedWebhookEvent, + type EmbedSessionGeneratedWebhookEvent as EmbedSessionGeneratedWebhookEvent, + type EmbedViewedWebhookEvent as EmbedViewedWebhookEvent, type ExternalBankAccountCreatedWebhookEvent as ExternalBankAccountCreatedWebhookEvent, type ExternalBankAccountUpdatedWebhookEvent as ExternalBankAccountUpdatedWebhookEvent, type ExternalPaymentCreatedWebhookEvent as ExternalPaymentCreatedWebhookEvent, diff --git a/src/resources/book-transfers.ts b/src/resources/book-transfers.ts index 79bad906..7f31aa83 100644 --- a/src/resources/book-transfers.ts +++ b/src/resources/book-transfers.ts @@ -220,6 +220,7 @@ export namespace BookTransferResponse { | 'INTEREST' | 'LATE_PAYMENT' | 'BILL_PAYMENT' + | 'PAYMENT_FEE' | 'CASH_BACK' | 'ACCOUNT_TO_ACCOUNT' | 'CARD_TO_CARD' @@ -308,6 +309,7 @@ export interface BookTransferCreateParams { | 'INTEREST' | 'LATE_PAYMENT' | 'BILL_PAYMENT' + | 'PAYMENT_FEE' | 'CASH_BACK' | 'ACCOUNT_TO_ACCOUNT' | 'CARD_TO_CARD' diff --git a/src/resources/cards/cards.ts b/src/resources/cards/cards.ts index 9fabb8a6..5bb08e6b 100644 --- a/src/resources/cards/cards.ts +++ b/src/resources/cards/cards.ts @@ -151,6 +151,9 @@ export class Cards extends APIResource { } /** + * **Deprecated.** Use the modern embedded card flow instead: create a session with + * `POST /v1/cards/{card_token}/embed` and render it via `GET /v1/embed`. + * * Handling full card PANs and CVV codes requires that you comply with the Payment * Card Industry Data Security Standards (PCI DSS). Some clients choose to reduce * their compliance obligations by leveraging our embedded card UI solution @@ -179,13 +182,7 @@ export class Cards extends APIResource { * but **do not ever embed your API key into front end code, as doing so introduces * a serious security vulnerability**. * - * @example - * ```ts - * const response = await client.cards.embed({ - * embed_request: 'embed_request', - * hmac: 'hmac', - * }); - * ``` + * @deprecated */ embed(query: CardEmbedParams, options?: RequestOptions): APIPromise { return this._client.get('/v1/embed/card', { diff --git a/src/resources/events/events.ts b/src/resources/events/events.ts index 622b5099..2f4c58f0 100644 --- a/src/resources/events/events.ts +++ b/src/resources/events/events.ts @@ -98,7 +98,7 @@ export interface Event { * The type of event that occurred. Possible values: * * - account_holder_document.updated: Occurs when an account holder's document - * upload status has been updated + * upload status has been updated. * - account_holder.created: Occurs when a new account_holder is created. * - account_holder.updated: Occurs when an account_holder is updated. * - account_holder.verification: Occurs when an asynchronous account_holder's @@ -162,10 +162,25 @@ export interface Event { * This event will be deprecated in the future. We recommend using * `tokenization.updated` instead. * - * - dispute_evidence.upload_failed: Occurs when a dispute evidence upload fails. + * - dispute_evidence.upload_failed: Occurs when an evidence upload fails for a + * dispute filed through the Chargebacks API (`/v1/disputes`). + * + * This event is not emitted for Managed Disputes. + * * - dispute_transaction.created: Occurs when a new dispute transaction is created - * - dispute_transaction.updated: Occurs when a dispute transaction is updated - * - dispute.updated: Occurs when a dispute is updated. + * for a Managed Disputes case. + * - dispute_transaction.updated: Occurs when a dispute transaction for a Managed + * Disputes case is updated. + * - dispute.updated: Occurs when a dispute filed through the Chargebacks API + * (`/v1/disputes`) is created or updated. + * + * This event is not emitted for Managed Disputes. Use + * `dispute_transaction.created` and `dispute_transaction.updated` instead. + * + * - embed.session_generated: Occurs when a card embed session is successfully + * generated. + * - embed.viewed: Occurs when a card detail is successfully revealed through an + * embed. * - external_bank_account.created: Occurs when an external bank account is * created. * - external_bank_account.updated: Occurs when an external bank account is @@ -187,7 +202,7 @@ export interface Event { * - payment_transaction.updated: Occurs when a payment transaction is updated. * - settlement_report.updated: Occurs when a settlement report is created or * updated. - * - statements.created: Occurs when a statement has been created + * - statements.created: Occurs when a statement has been created. * - three_ds_authentication.challenge: The `three_ds_authentication.challenge` * event. Upon receiving this request, the Card Program should issue its own * challenge to the cardholder. After a cardholder challenge is successfully @@ -242,6 +257,8 @@ export interface Event { | 'dispute_transaction.created' | 'dispute_transaction.updated' | 'dispute.updated' + | 'embed.session_generated' + | 'embed.viewed' | 'external_bank_account.created' | 'external_bank_account.updated' | 'external_payment.created' @@ -327,6 +344,8 @@ export interface EventSubscription { | 'dispute_transaction.created' | 'dispute_transaction.updated' | 'dispute.updated' + | 'embed.session_generated' + | 'embed.viewed' | 'external_bank_account.created' | 'external_bank_account.updated' | 'external_payment.created' @@ -450,6 +469,8 @@ export interface EventListParams extends CursorPageParams { | 'dispute_transaction.created' | 'dispute_transaction.updated' | 'dispute.updated' + | 'embed.session_generated' + | 'embed.viewed' | 'external_bank_account.created' | 'external_bank_account.updated' | 'external_payment.created' diff --git a/src/resources/events/subscriptions.ts b/src/resources/events/subscriptions.ts index 29bd8d7f..3cd8b991 100644 --- a/src/resources/events/subscriptions.ts +++ b/src/resources/events/subscriptions.ts @@ -199,6 +199,8 @@ export interface SubscriptionCreateParams { | 'dispute_transaction.created' | 'dispute_transaction.updated' | 'dispute.updated' + | 'embed.session_generated' + | 'embed.viewed' | 'external_bank_account.created' | 'external_bank_account.updated' | 'external_payment.created' @@ -282,6 +284,8 @@ export interface SubscriptionUpdateParams { | 'dispute_transaction.created' | 'dispute_transaction.updated' | 'dispute.updated' + | 'embed.session_generated' + | 'embed.viewed' | 'external_bank_account.created' | 'external_bank_account.updated' | 'external_payment.created' @@ -395,6 +399,8 @@ export interface SubscriptionSendSimulatedExampleParams { | 'dispute_transaction.created' | 'dispute_transaction.updated' | 'dispute.updated' + | 'embed.session_generated' + | 'embed.viewed' | 'external_bank_account.created' | 'external_bank_account.updated' | 'external_payment.created' diff --git a/src/resources/external-payments.ts b/src/resources/external-payments.ts index c51ffd83..0abeca89 100644 --- a/src/resources/external-payments.ts +++ b/src/resources/external-payments.ts @@ -234,7 +234,7 @@ export interface ExternalPaymentListParams extends CursorPageParams { business_account_token?: string; /** - * External Payment category to be returned. + * The external rail the funds moved on */ category?: | 'EXTERNAL_WIRE' diff --git a/src/resources/index.ts b/src/resources/index.ts index be8a79b7..b4b412fe 100644 --- a/src/resources/index.ts +++ b/src/resources/index.ts @@ -333,6 +333,8 @@ export { type DigitalWalletTokenizationUpdatedWebhookEvent, type DisputeUpdatedWebhookEvent, type DisputeEvidenceUploadFailedWebhookEvent, + type EmbedSessionGeneratedWebhookEvent, + type EmbedViewedWebhookEvent, type ExternalBankAccountCreatedWebhookEvent, type ExternalBankAccountUpdatedWebhookEvent, type ExternalPaymentCreatedWebhookEvent, diff --git a/src/resources/transactions/transactions.ts b/src/resources/transactions/transactions.ts index 5c847fb0..5e559aec 100644 --- a/src/resources/transactions/transactions.ts +++ b/src/resources/transactions/transactions.ts @@ -138,9 +138,10 @@ export class Transactions extends APIResource { * Clears an existing authorization, either debit or credit. After this event, the * transaction transitions from `PENDING` to `SETTLED` status. * - * If `amount` is not set, the full amount of the transaction will be cleared. - * Transactions that have already cleared, either partially or fully, cannot be - * cleared again using this endpoint. + * If `amount` is not set, the full amount of the transaction will be cleared. This + * endpoint may be called multiple times against the same authorization to simulate + * a multiple-completion scenario, with each call creating a separate clearing + * event. * * @example * ```ts @@ -1440,9 +1441,10 @@ export interface TransactionSimulateClearingParams { * example, entering 100 in this field will result in a -100 amount in the * transaction, if the original authorization is a credit authorization. * - * If `amount` is not set, the full amount of the transaction will be cleared. - * Transactions that have already cleared, either partially or fully, cannot be - * cleared again using this endpoint. + * If `amount` is not set, the full amount of the transaction will be cleared. This + * endpoint may be called multiple times against the same authorization to simulate + * a multiple-completion scenario, with each call creating a separate clearing + * event. */ amount?: number; } diff --git a/src/resources/webhooks.ts b/src/resources/webhooks.ts index 718b0fb2..0bd104ef 100644 --- a/src/resources/webhooks.ts +++ b/src/resources/webhooks.ts @@ -1765,6 +1765,94 @@ export interface DisputeEvidenceUploadFailedWebhookEvent extends DisputesAPI.Dis event_type: 'dispute_evidence.upload_failed'; } +export interface EmbedSessionGeneratedWebhookEvent { + /** + * The token of the account associated with the card + */ + account_token: string; + + /** + * The token of the card associated with the embed session + */ + card_token: string; + + /** + * Details about the request that generated the embed session + */ + device_details: EmbedSessionGeneratedWebhookEvent.DeviceDetails; + + /** + * The type of event + */ + event_type: 'embed.session_generated'; + + /** + * The identifier shared by webhook events for the same embed session. + */ + session_id: string; + + /** + * The type of embed session that was generated + */ + session_type: 'CARD_EMBED' | 'PIN_SETTING_EMBED'; +} + +export namespace EmbedSessionGeneratedWebhookEvent { + /** + * Details about the request that generated the embed session + */ + export interface DeviceDetails { + /** + * The IP address recorded for the request that generated the event + */ + ip_address: string; + } +} + +export interface EmbedViewedWebhookEvent { + /** + * The token of the account associated with the card + */ + account_token: string; + + /** + * The token of the card whose details were revealed + */ + card_token: string; + + /** + * Details about the request that revealed the card detail + */ + device_details: EmbedViewedWebhookEvent.DeviceDetails; + + /** + * The type of card detail that was revealed + */ + embed_type: 'PAN' | 'CVV' | 'EXP_MONTH' | 'EXP_YEAR'; + + /** + * The type of event + */ + event_type: 'embed.viewed'; + + /** + * The identifier shared by webhook events for the same embed session. + */ + session_id: string; +} + +export namespace EmbedViewedWebhookEvent { + /** + * Details about the request that revealed the card detail + */ + export interface DeviceDetails { + /** + * The IP address recorded for the request that generated the event + */ + ip_address: string; + } +} + export interface ExternalBankAccountCreatedWebhookEvent extends ExternalBankAccountsAPI.ExternalBankAccount { /** * The type of event that occurred. @@ -2356,6 +2444,8 @@ export type ParsedWebhookEvent = | DigitalWalletTokenizationUpdatedWebhookEvent | DisputeUpdatedWebhookEvent | DisputeEvidenceUploadFailedWebhookEvent + | EmbedSessionGeneratedWebhookEvent + | EmbedViewedWebhookEvent | ExternalBankAccountCreatedWebhookEvent | ExternalBankAccountUpdatedWebhookEvent | ExternalPaymentCreatedWebhookEvent @@ -2842,6 +2932,8 @@ export declare namespace Webhooks { type DigitalWalletTokenizationUpdatedWebhookEvent as DigitalWalletTokenizationUpdatedWebhookEvent, type DisputeUpdatedWebhookEvent as DisputeUpdatedWebhookEvent, type DisputeEvidenceUploadFailedWebhookEvent as DisputeEvidenceUploadFailedWebhookEvent, + type EmbedSessionGeneratedWebhookEvent as EmbedSessionGeneratedWebhookEvent, + type EmbedViewedWebhookEvent as EmbedViewedWebhookEvent, type ExternalBankAccountCreatedWebhookEvent as ExternalBankAccountCreatedWebhookEvent, type ExternalBankAccountUpdatedWebhookEvent as ExternalBankAccountUpdatedWebhookEvent, type ExternalPaymentCreatedWebhookEvent as ExternalPaymentCreatedWebhookEvent, diff --git a/src/version.ts b/src/version.ts index 3a430fbb..cce58f68 100644 --- a/src/version.ts +++ b/src/version.ts @@ -1 +1 @@ -export const VERSION = '0.144.0'; // x-release-please-version +export const VERSION = '0.145.0'; // x-release-please-version diff --git a/yarn.lock b/yarn.lock index a2134ae4..e214ed5c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12,12 +12,12 @@ resolved "https://registry.yarnpkg.com/@andrewbranch/untar.js/-/untar.js-1.0.3.tgz#ba9494f85eb83017c5c855763969caf1d0adea00" integrity sha512-Jh15/qVmrLGhkKJBdXlK1+9tY4lZruYjsgkDFj08ZmDiWVBLJcqkok7Z0/R0In+i1rScBpJlSvrTS2Lm41Pbnw== -"@arethetypeswrong/cli@^0.17.0": - version "0.17.0" - resolved "https://registry.yarnpkg.com/@arethetypeswrong/cli/-/cli-0.17.0.tgz#f97f10926b3f9f9eb5117550242d2e06c25cadac" - integrity sha512-xSMW7bfzVWpYw5JFgZqBXqr6PdR0/REmn3DkxCES5N0JTcB0CVgbIynJCvKBFmXaPc3hzmmTrb7+yPDRoOSZdA== +"@arethetypeswrong/cli@^0.18.0": + version "0.18.4" + resolved "https://registry.yarnpkg.com/@arethetypeswrong/cli/-/cli-0.18.4.tgz#c31f54f3b0d0e0f3256ab3edb6530beeb5e64b4b" + integrity sha512-kNWo6LTzGAuLYPpJ7Sgo63whSUeeSuKMlYx6IBgzs4ONEG807gW4hSSENvpeCHzO2H2wIzG5EFl0OKBbqGBAyA== dependencies: - "@arethetypeswrong/core" "0.17.0" + "@arethetypeswrong/core" "0.18.4" chalk "^4.1.2" cli-table3 "^0.6.3" commander "^10.0.1" @@ -25,15 +25,16 @@ marked-terminal "^7.1.0" semver "^7.5.4" -"@arethetypeswrong/core@0.17.0": - version "0.17.0" - resolved "https://registry.yarnpkg.com/@arethetypeswrong/core/-/core-0.17.0.tgz#abb3b5f425056d37193644c2a2de4aecf866b76b" - integrity sha512-FHyhFizXNetigTVsIhqXKGYLpazPS5YNojEPpZEUcBPt9wVvoEbNIvG+hybuBR+pjlRcbyuqhukHZm1fr+bDgA== +"@arethetypeswrong/core@0.18.4": + version "0.18.4" + resolved "https://registry.yarnpkg.com/@arethetypeswrong/core/-/core-0.18.4.tgz#24edea3d651dea7d32bf6f1cc9ee9a00db39de49" + integrity sha512-M5F0ePyN6h2Z6XxRiyIPqjGbltotXLjR0CKA0uKspsDu0QmgTNYvRb4RSQPMUs2ZXZHCCYpbaZbFbYOXLxCjUA== dependencies: "@andrewbranch/untar.js" "^1.0.3" + "@loaderkit/resolve" "^1.0.2" cjs-module-lexer "^1.2.3" - fflate "^0.8.2" - lru-cache "^10.4.3" + fflate "^0.8.3" + lru-cache "^11.0.1" semver "^7.5.4" typescript "5.6.1-rc" validate-npm-package-name "^5.0.0" @@ -306,6 +307,11 @@ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== +"@braidai/lang@^1.0.0": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@braidai/lang/-/lang-1.1.2.tgz#65bc2bc1db6d00e153b95ac7006f4573e289e9be" + integrity sha512-qBcknbBufNHlui137Hft8xauQMTZDKdophmLFv05r2eNmdIv/MlPuP4TdUknHG68UdWLgVZwgxVe735HzJNIwA== + "@colors/colors@1.5.0": version "1.5.0" resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" @@ -688,6 +694,13 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" +"@loaderkit/resolve@^1.0.2": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@loaderkit/resolve/-/resolve-1.0.6.tgz#8d45341e688faecc25b3ae919c0f45d94c4e26c9" + integrity sha512-G8FdIoF5CypfwmD9rl8BXod5HDn8JqB0CCNBXDTaRZ+yRYhARrrSToX1zg1zy9jX3zLqigsELwhT4gNtkdQAUg== + dependencies: + "@braidai/lang" "^1.0.0" + "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" @@ -1220,9 +1233,9 @@ baseline-browser-mapping@^2.9.0: integrity sha512-B0xUquLkiGLgHhpPBqvl7GWegWBUNuujQ6kXd/r1U38ElPT6Ok8KZ8e+FpUGEc2ZoRQUzq/aUnaKFc/svWUGSg== brace-expansion@^2.0.2: - version "2.1.1" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.1.1.tgz#c68b1c4111c76aae3a6fba55d496cee10c39dad8" - integrity sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA== + version "2.1.2" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.1.2.tgz#0bba2271feb7d458b0d31ad13625aaa4754431e2" + integrity sha512-w5JZcKgdhDOgOwm8H+KgbosopHMuGcl6qbulwjtz3SM7I7P3yW1eAjzMPLrIE+NQ9vjgANKHWeMHnrT0OXW1oA== dependencies: balanced-match "^1.0.0" @@ -1706,10 +1719,10 @@ fb-watchman@^2.0.0: dependencies: bser "2.1.1" -fflate@^0.8.2: - version "0.8.2" - resolved "https://registry.yarnpkg.com/fflate/-/fflate-0.8.2.tgz#fc8631f5347812ad6028bbe4a2308b2792aa1dea" - integrity sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A== +fflate@^0.8.3: + version "0.8.3" + resolved "https://registry.yarnpkg.com/fflate/-/fflate-0.8.3.tgz#bc27d8eb30343d4d512abb03480202ce65d825fc" + integrity sha512-tbZNuJrLwGUp3zshBtdy4W+ORxZuIh8a5ilyIEQDC5rY1f3U20JMry0Ll3WBzU58EZKsEuJFXhb5gwv8CsPvgA== file-entry-cache@^8.0.0: version "8.0.0" @@ -2500,10 +2513,10 @@ lodash.merge@^4.6.2: resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== -lru-cache@^10.4.3: - version "10.4.3" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" - integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== +lru-cache@^11.0.1: + version "11.5.2" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-11.5.2.tgz#00e16665c90c620fba14a3c368732a976493f760" + integrity sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g== lru-cache@^5.1.1: version "5.1.1"