finished sdk

This commit is contained in:
John Yeo
2026-02-19 17:02:18 +00:00
parent e60a77503a
commit 2a0afd9798
54 changed files with 1104 additions and 872 deletions

View File

@@ -136,6 +136,18 @@ export const useCustomer = (params: UseCustomerParams = {}) => {
};
```
### SDK Casing Convention
**Important:** The TypeScript SDK and React hooks use **camelCase** for all properties. Speakeasy automatically transforms snake_case API responses to camelCase.
- API response: `{ plan_id: "pro", created_at: 123, auto_enable: true }`
- SDK/Hook response: `{ planId: "pro", createdAt: 123, autoEnable: true }`
When writing documentation examples for React hooks or the TypeScript SDK, always use camelCase:
- `data?.balances?.messages?.featureId` (not `feature_id`)
- `subscription.planId` (not `plan_id`)
- `plan.createdAt` (not `created_at`)
---
## 6. Testing (sdk-test)

View File

@@ -1,8 +0,0 @@
{
"mcpServers": {
"mintlify": {
"type": "http",
"url": "https://mintlify.com/docs/mcp"
}
}
}

View File

@@ -1,5 +1,16 @@
When writing the docs, always make sure to add it to `docs.json` for it to appear
## React Hook Documentation
**Always read the actual types** in `packages/autumn-js/src/` before writing hook docs:
- Hook params: `packages/autumn-js/src/react/hooks/<hookName>.ts`
- Client params: `packages/autumn-js/src/types/params.ts`
- SDK types: `packages/sdk/src/models/`
**Casing:** The TypeScript SDK uses camelCase (Speakeasy transforms snake_case API responses). All JSON examples in docs must use camelCase (`planId`, `createdAt`, `featureId`).
**Keep it concise:** Only document the most important parameters. Link to API reference for the full list.
## Manual API Documentation
Manual documentation (explanations, examples, use cases) should go in `api-reference-generator/` folder, NOT in `mintlify/api-reference/`. The generator merges manual content from `api-reference-generator/` with auto-generated body params and outputs the final result to `mintlify/api-reference/`.

View File

@@ -0,0 +1,281 @@
# SDK Documentation Update Plan
## Overview
Update the Documentation section (`mintlify/documentation/`) to match the new v2 API types and SDK conventions.
**Goal**: Update code examples to match new types. DO NOT change content/explanations.
---
## Rules
> **⚠️ CRITICAL: ONE FILE AT A TIME**
>
> Never edit more than one file per phase. Complete each phase fully before moving to the next.
### Casing Conventions
| Context | Casing | Example |
|---------|--------|---------|
| TypeScript/Node.js SDK | camelCase | `customerId`, `featureId`, `productId` |
| Python SDK | snake_case | `customer_id`, `feature_id`, `product_id` |
| cURL / Raw API | snake_case | `customer_id`, `feature_id`, `product_id` |
| JSON examples (SDK response) | camelCase | `{ "featureId": "...", "createdAt": 123 }` |
### Key API Changes
1. `attach()` - if `attach.checkoutUrl` is defined, redirect (React hook auto-opens)
2. `check`, `track`, `attach` NO LONGER auto-create customers
3. Customer object: `products``subscriptions`, `features``balances`
4. Hook returns `data` not `customer`
5. Component library removed (`CheckoutDialog`, `PricingTable`, `PaywallDialog`)
6. Method rename: `openBillingPortal``openCustomerPortal`
### Reference Files (read these for correct types)
- Hook params: `packages/autumn-js/src/react/hooks/<hookName>.ts`
- Client params: `packages/autumn-js/src/types/params.ts`
- SDK types: `packages/sdk/src/models/`
---
## Phases
### Phase 1: `documentation/getting-started/setup/react.mdx`
**Status**: ⬜ Not Started
**Changes**:
- [ ] Line 7: Remove reference to `/react/components/pricing-table`
- [ ] Line 353: Change `const { customer } = useCustomer()``const { data } = useCustomer()`
- [ ] Line 359: Change `customer``data`
- [ ] Lines 370-433: Update JSON example:
- snake_case → camelCase (`created_at``createdAt`, `stripe_id``stripeId`, etc.)
- `products``subscriptions`
- `features``balances`
- [ ] Lines 444-470: Remove `checkout` method with `CheckoutDialog` - replace with `attach()` flow
- [ ] Lines 446, 453: Remove `CheckoutDialog` import and usage
- [ ] Lines 490-493: Remove `<PricingTable />` reference and link
---
### Phase 2: `documentation/getting-started/setup/sdk.mdx`
**Status**: ⬜ Not Started
**Changes**:
- [ ] Lines 167-169: TypeScript `checkout` params: `customer_id``customerId`, `product_id``productId`
- [ ] Lines 225-228: TypeScript `attach` params: `customer_id``customerId`, `product_id``productId`
*Note: Python and cURL examples stay snake_case*
---
### Phase 3: `documentation/getting-started/gating.mdx`
**Status**: ⬜ Not Started
**Changes**:
- [ ] Lines 53-57: TypeScript SDK params: `customer_id``customerId`, `feature_id``featureId`, `required_balance``requiredBalance`
- [ ] Lines 119-123: TypeScript SDK params: `customer_id``customerId`, `feature_id``featureId`
---
### Phase 4: `documentation/getting-started/display-billing.mdx`
**Status**: ⬜ Not Started
**Changes**:
- [ ] Lines 20-26: Change `customer?.products``data?.subscriptions`
- [ ] Lines 84-88: Change `customer?.features.messages``data?.balances.messages`
- [ ] Lines 37-47: TypeScript SDK: verify `customers.get` returns correct structure
- [ ] Lines 133-155: Remove `checkout` with `CheckoutDialog` - use `attach()` flow instead
- [ ] Lines 138-155: Remove `CheckoutDialog` import and usage
- [ ] Lines 238-244: Verify `cancel` method exists on hook or remove
- [ ] Line 297: Change `openBillingPortal``openCustomerPortal`
- [ ] Lines 348-354: Fix analytics hook - verify correct import (`useAggregateEvents`)
---
### Phase 5: `documentation/customers/check.mdx`
**Status**: ⬜ Not Started
**Changes**:
- [ ] Lines 47-50: TypeScript SDK params: `customer_id``customerId`, `feature_id``featureId`
- [ ] Lines 79-92: JSON response: convert to camelCase (`feature_id``featureId`, etc.)
- [ ] Lines 124-128: TypeScript SDK params: `customer_id``customerId`, `feature_id``featureId`, `required_balance``requiredBalance`
- [ ] Lines 174-179: TypeScript SDK params: add `sendEvent` (camelCase)
- [ ] Lines 225-229: TypeScript SDK params: camelCase
---
### Phase 6: `documentation/customers/tracking-usage.mdx`
**Status**: ⬜ Not Started
**Changes**:
- [ ] Lines 23-28: Fix TypeScript import pattern (`import { Autumn }` not `import { Autumn as autumn }`)
- [ ] Lines 25-28: TypeScript SDK params: `customer_id``customerId`, `feature_id``featureId`
- [ ] Lines 60-66: JSON response: convert to camelCase
- [ ] Lines 81-86: Fix TypeScript import and params
- [ ] Lines 163-168: Fix TypeScript import and params
---
### Phase 7: `documentation/customers/balances.mdx`
**Status**: ⬜ Not Started
**Changes**:
- [ ] Lines 29-32: Fix TypeScript import pattern
- [ ] Lines 47-72: JSON response: convert to camelCase (`feature_id``featureId`, `included_usage``includedUsage`, `next_reset_at``nextResetAt`)
---
### Phase 8: `documentation/customers/creating-customers.mdx`
**Status**: ⬜ Not Started
**Changes**:
- [ ] Lines 17-70: Update/collapse accordion - clarify that `attach`, `track`, `check` NO LONGER auto-create customers. Add note about using `autumn.customers.getOrCreate()`
- [ ] Lines 88-89: Fix TypeScript import pattern
---
### Phase 9: `documentation/customers/enabling-product.mdx`
**Status**: ⬜ Not Started
**Changes**:
- [ ] Lines 37-40: TypeScript SDK params: `customer_id``customerId`, `product_id``productId`
- [ ] Lines 57-73: JSON response: convert to camelCase (`checkout_url``checkoutUrl`, `customer_id``customerId`, `product_ids``productIds`)
- [ ] Lines 76-79: Remove/update tip about auto-customer creation
---
### Phase 10: `documentation/customers/feature-entities.mdx`
**Status**: ⬜ Not Started
**Changes**:
- [ ] Lines 54-60: Fix TypeScript import and params: `feature_id``featureId`
- [ ] Lines 112-118: TypeScript SDK params: `customer_id``customerId`, `feature_id``featureId`, `entity_id``entityId`
- [ ] Lines 166-171: TypeScript SDK params: camelCase
- [ ] Lines 219-228: React example: fix `entity_data``entityData`, ensure `featureId` (already camelCase - verify)
- [ ] Lines 231-241: TypeScript SDK params: camelCase, fix `entity_data``entityData`
- [ ] Lines 316-318: Fix TypeScript method call pattern
---
### Phase 11: `documentation/customers/managing-customers.mdx`
**Status**: ⬜ Not Started
**Changes**:
- [ ] Lines 93-100: Fix TypeScript import pattern
- [ ] Lines 95-100: Verify `customers.update` method signature and params
---
### Phase 12: `documentation/pricing/credits.mdx`
**Status**: ⬜ Not Started
**Changes**:
- [ ] Lines 54-66: TypeScript SDK params: `customer_id``customerId`, `feature_id``featureId`, `required_balance``requiredBalance`
- [ ] Lines 101-127: JSON response: convert to camelCase
- [ ] Lines 142-153: TypeScript SDK params: camelCase
---
### Phase 13: Final Review
**Status**: ⬜ Not Started
**Tasks**:
- [ ] Run through all changed files
- [ ] Verify no broken links
- [ ] Check that `docs.json` navigation is correct
- [ ] Ensure consistency across all examples
---
## Files NOT Requiring Changes
These files are mostly conceptual with no SDK code examples:
- `documentation/pricing/plans.mdx`
- `documentation/pricing/features.mdx`
- `documentation/pricing/plan-features.mdx`
- `documentation/pricing/rewards.mdx` (cURL only - snake_case correct)
- `documentation/pricing/versioning.mdx`
- `documentation/getting-started/setup/convex.mdx` (skip for now per instructions)
---
## Quick Reference: Common Replacements
### TypeScript SDK Params
```
customer_id → customerId
feature_id → featureId
product_id → productId
entity_id → entityId
required_balance → requiredBalance
send_event → sendEvent
event_name → eventName
customer_data → customerData
entity_data → entityData
```
### JSON Response Fields
```
feature_id → featureId
customer_id → customerId
product_id → productId
created_at → createdAt
updated_at → updatedAt
started_at → startedAt
canceled_at → canceledAt
stripe_id → stripeId
included_usage → includedUsage
next_reset_at → nextResetAt
checkout_url → checkoutUrl
product_ids → productIds
event_id → eventId
```
### Customer Object Structure
```
customer.products → data.subscriptions
customer.features → data.balances
```
### Hook Method Names
```
openBillingPortal → openCustomerPortal
```
---
## Progress Tracker
| Phase | File | Status |
|-------|------|--------|
| 1 | `getting-started/setup/react.mdx` | ⬜ |
| 2 | `getting-started/setup/sdk.mdx` | ⬜ |
| 3 | `getting-started/gating.mdx` | ⬜ |
| 4 | `getting-started/display-billing.mdx` | ⬜ |
| 5 | `customers/check.mdx` | ⬜ |
| 6 | `customers/tracking-usage.mdx` | ⬜ |
| 7 | `customers/balances.mdx` | ⬜ |
| 8 | `customers/creating-customers.mdx` | ⬜ |
| 9 | `customers/enabling-product.mdx` | ⬜ |
| 10 | `customers/feature-entities.mdx` | ⬜ |
| 11 | `customers/managing-customers.mdx` | ⬜ |
| 12 | `pricing/credits.mdx` | ⬜ |
| 13 | Final Review | ⬜ |
Legend: ⬜ Not Started | 🔄 In Progress | ✅ Complete

View File

@@ -2,7 +2,7 @@ info:
title: Autumn API
version: 2.1.0
servers:
- url: http://localhost:8080
- url: https://api.useautumn.com
description: Production server
openapi: 3.1.1
components:

View File

@@ -108,20 +108,15 @@
{
"group": "React Hooks",
"pages": [
"react/hooks/introduction",
"react/hooks/autumn-provider",
"react/hooks/autumn-handler",
"react/hooks/useCustomer",
"react/hooks/useEntity",
"react/hooks/useListEvents",
"react/hooks/useAggregateEvents"
]
},
{
"group": "Component Library",
"pages": [
"react/components/pricing-table",
"react/components/checkout-dialog",
"react/components/paywall-dialog"
"react/hooks/useAggregateEvents",
"react/hooks/useListPlans",
"react/hooks/useReferrals"
]
}
]

View File

@@ -5,45 +5,53 @@ description: "Server-side handler for managing Autumn API endpoints and customer
import LearnHooksTip from '/snippets/learn-hooks-tip.mdx';
The `autumnHandler` creates server-side endpoints that handle communication between your frontend React hooks and Autumn's API. It manages customer authentication and data flow for all Autumn operations.
The `autumnHandler` creates server-side endpoints that handle communication between your frontend React hooks and Autumn's API. It manages customer authentication and proxies requests securely using your secret key.
<LearnHooksTip />
## Usage
```ts
// app/api/autumn/[...all]/route.ts
import { autumnHandler } from "autumn-js/next";
import { auth } from "@clerk/nextjs/server";
export const { GET, POST } = autumnHandler({
identify: async () => {
const { userId } = await auth();
return { customerId: userId };
},
});
```
## Parameters
<ParamField body="identify" type="(request: any) => AuthResult" required>
Function that receives the incoming request and returns customer identification data. This function should extract the user/customer ID from your authentication provider and return both the ID and optional customer metadata.
<ParamField body="identify" type="(request: Request) => AuthResult" required>
Function that receives the incoming request and returns customer identification data.
<Expandable title="AuthResult properties">
<Expandable title="AuthResult">
<ParamField body="customerId" type="string" required>
The unique identifier for the customer. This should be the user ID or organization ID from your authentication system.
The unique identifier for the customer.
</ParamField>
<ParamField body="customerData" type="object" optional>
Additional metadata about the customer that will be stored in Autumn.
<Expandable title="customerData properties">
<ParamField body="name" type="string" optional>
The customer's display name
</ParamField>
<ParamField body="email" type="string" optional>
The customer's email address
</ParamField>
</Expandable>
<ParamField body="customerData" type="CustomerData">
Additional metadata about the customer (e.g., `name`, `email`).
</ParamField>
</Expandable>
</ParamField>
<ParamField body="url" type="string" optional>
Override the default Autumn API base URL (api.useautumn.com/v1). Use this when self-hosting Autumn or when you need to connect to a different API endpoint.
<ParamField body="secretKey" type="string">
Autumn API secret key. Defaults to `AUTUMN_SECRET_KEY` environment variable.
</ParamField>
<ParamField body="secretKey" type="string" optional>
Override the Autumn secret key. If not provided, the handler will use the `AUTUMN_SECRET_KEY` environment variable.
<ParamField body="autumnURL" type="string">
Override the Autumn API URL. Use when self-hosting.
</ParamField>
<ParamField body="suppressLogs" type="boolean" optional>
If true, suppresses console warnings and logs from the Autumn handler. Useful for reducing noise in production environments.
<ParamField body="pathPrefix" type="string">
Path prefix for routes. Defaults to `/api/autumn`.
</ParamField>
<ParamField body="suppressLogs" type="boolean">
If true, suppresses console warnings and logs.
</ParamField>

View File

@@ -5,39 +5,49 @@ description: "Provider component for your React application"
import LearnHooksTip from '/snippets/learn-hooks-tip.mdx';
The `AutumnProvider` component is used to wrap your React application and provides the `autumnHandler` with the customer ID.
The `AutumnProvider` component wraps your React application and provides the Autumn client to all hooks.
<LearnHooksTip />
## Usage
```tsx
// app/layout.tsx
import { AutumnProvider } from "autumn-js/react";
export default function RootLayout({ children }) {
return (
<html>
<body>
<AutumnProvider>{children}</AutumnProvider>
</body>
</html>
);
}
```
## Parameters
<ParamField body="suppressLogs" type="boolean" optional>
If true, suppresses all console warnings and logs from Autumn hooks and provider. Useful for reducing noise in production environments.
<ParamField body="backendUrl" type="string">
Base URL for your backend server (e.g., `https://api.example.com`). Defaults to current origin. Set this when your backend is hosted on a separate domain.
</ParamField>
<ParamField body="getBearerToken" type="() =&gt; Promise&lt;string | null&gt;" optional>
Optional function that returns a bearer token for authenticated requests. Use this when you need to pass the user's auth token in the <code>Authorization</code> header to your backend (e.g., Clerk, Supabase).
<ParamField body="pathPrefix" type="string">
Path prefix for Autumn routes. Defaults to `/api/autumn`, or `/api/auth/autumn` if `useBetterAuth` is true.
</ParamField>
<ParamField body="headers" type="Record&lt;string, string&gt;" optional>
Additional HTTP headers to send with each request, which can be accessed in the `autumnHandler` (e.g., for custom authentication flows).
<ParamField body="useBetterAuth" type="boolean">
Use [better-auth](https://www.better-auth.com/docs/plugins/autumn) integration. Sets `pathPrefix` to `/api/auth/autumn` and `includeCredentials` to true.
</ParamField>
<ParamField body="backendUrl" type="string" optional>
Optional absolute URL for your backend endpoint. Set this when your backend is hosted on a separate domain (e.g., when using Vite with a custom server).
<ParamField body="includeCredentials" type="boolean">
Include credentials (cookies) in cross-origin requests. Defaults to true if `useBetterAuth` is true.
</ParamField>
<ParamField body="customerData" type="CustomerData" optional>
Optional object containing additional metadata about the current customer, such as <code>email</code> or <code>name</code>.
<ParamField body="queryClient" type="QueryClient">
Custom TanStack Query client. Uses a default client if not provided.
</ParamField>
<ParamField body="includeCredentials" type="boolean" optional>
If true, passes credentials in fetch requests to the backend (e.g., cookies, HTTP auth). Autumn will warn you in the console if this is needed.
<ParamField body="suppressLogs" type="boolean">
If true, suppresses console warnings and logs.
</ParamField>
<ParamField body="betterAuthUrl" type="string" optional>
URL for use with the [better-auth plugin](https://www.better-auth.com/docs/plugins/autumn).
</ParamField>

View File

@@ -0,0 +1,32 @@
---
title: "Introduction"
description: "How Autumn's React hooks work"
---
## How Hooks Work
Autumn's React hooks connect to your backend via the `autumnHandler`. When you call a hook, it makes a request to your backend route (e.g., `/api/autumn`), which securely communicates with Autumn's API using your secret key.
All hooks are built on [TanStack Query](https://tanstack.com/query) and return standard query results (`data`, `isLoading`, `error`, `refetch`). You can pass `queryOptions` to customize caching, refetching, and other query behaviors.
## Shared Options
Every hook accepts a `queryOptions` parameter that forwards to TanStack Query's `useQuery`:
```tsx
const { data } = useCustomer({
queryOptions: {
enabled: isAuthenticated,
staleTime: 1000 * 60 * 5, // 5 minutes
refetchInterval: 1000 * 30, // 30 seconds
},
});
```
Common options:
- `enabled` - Whether the query should run automatically
- `staleTime` - How long data is considered fresh (ms)
- `refetchInterval` - Polling interval (ms)
- `refetchOnWindowFocus` - Refetch when window regains focus
See the [TanStack Query docs](https://tanstack.com/query/latest/docs/framework/react/reference/useQuery) for all available options.

View File

@@ -3,7 +3,7 @@ title: "useAggregateEvents"
description: "Show event usage to your customers in a timeseries chart"
---
import SWRConfigParam from '/snippets/swr-config-param.mdx';
import QueryOptionsParam from '/snippets/swr-config-param.mdx';
import LearnHooksTip from '/snippets/learn-hooks-tip.mdx';
The `useAggregateEvents` hook provides access to usage analytics and reporting data.
@@ -45,7 +45,7 @@ Aggregate data by an event properties paramater. This property is metadata passe
</Expandable>
</ParamField>
<SWRConfigParam />
<QueryOptionsParam />
## Returns

View File

@@ -1,76 +1,111 @@
---
title: "useCustomer"
description: "Access a customer's state and use it to display information in your React app"
description: "Access a customer's state and billing actions in your React app"
---
import SWRConfigParam from '/snippets/swr-config-param.mdx';
import LearnHooksTip from '/snippets/learn-hooks-tip.mdx';
The `useCustomer` hook provides access to customer data and related operations. You can use it from your frontend to retrieve customer information, manage loading states, and create entities.
The `useCustomer` hook fetches customer data and provides billing actions like attaching plans and checking feature access.
<LearnHooksTip />
## Parameters
<ParamField body="expand" type="CustomerExpandOption[]">
Array of additional data to include in the customer response. Options include
`invoices`, `rewards`, `trials_used`, `entities`, `referrals`, `payment_method`.
</ParamField>
<ParamField body="errorOnNotFound" type="boolean">
Whether to throw an error if the customer is not found. Defaults to `false`.
</ParamField>
<SWRConfigParam />
<ParamField body="expand" type="CustomerExpand[]">
Array of additional data to include in the response. Options: `invoices`, `trials_used`, `rewards`, `entities`, `referrals`, `payment_method`, `subscriptions.plan`, `purchases.plan`, `balances.feature`.
</ParamField>
<ParamField body="queryOptions" type="UseQueryOptions">
Optional [TanStack Query options](https://tanstack.com/query/latest/docs/framework/react/reference/useQuery) to customize caching and refetching behavior.
</ParamField>
## Returns
### `customer`
### `data`
The customer object containing all customer data.
The customer object containing subscriptions, purchases, and balances.
```jsx
```tsx
import { useCustomer } from "autumn-js/react";
export default function CustomerProfile() {
const { customer } = useCustomer({ expand: ["invoices"] });
const { data, isLoading } = useCustomer();
if (isLoading) return <div>Loading...</div>;
return (
<div>
<h2>Customer Profile</h2>
<p>Name: {customer?.name}</p>
<p>Email: {customer?.email}</p>
<p>Balance: {customer?.features.chat_messages?.balance}</p>
<p>Name: {data?.name}</p>
<p>Email: {data?.email}</p>
<p>Messages remaining: {data?.balances?.messages?.remaining}</p>
</div>
);
}
```
### `checkout()`
<Expandable title="Customer object">
Opens a checkout URL for the user to make a payment.
```json
{
"id": "user_123",
"name": "John Doe",
"email": "john@example.com",
"createdAt": 1771409161016,
"fingerprint": null,
"stripeId": "cus_stripe123",
"env": "sandbox",
"metadata": {},
"sendEmailReceipts": false,
"subscriptions": [
{
"planId": "pro_plan",
"autoEnable": false,
"addOn": false,
"status": "active",
"pastDue": false,
"canceledAt": null,
"expiresAt": null,
"trialEndsAt": null,
"startedAt": 1771431921437,
"currentPeriodStart": 1771431921437,
"currentPeriodEnd": 1771999921437,
"quantity": 1
}
],
"purchases": [],
"balances": {
"messages": {
"featureId": "messages",
"granted": 100,
"remaining": 72,
"usage": 28,
"unlimited": false,
"overageAllowed": false,
"maxPurchase": null,
"nextResetAt": 1773851121437
}
}
}
```
If the payment method already exists, purchase confirmation data will be returned.
</Expandable>
If a `dialog` is passed in, a payment confirmation dialog ([`CheckoutDialog`](/react/components/checkout-dialog)) will be opened.
### `attach()`
```jsx
Attaches a plan to the customer. Handles new subscriptions, upgrades, and downgrades. Automatically redirects to checkout if payment is required.
```tsx
import { useCustomer } from "autumn-js/react";
import CheckoutDialog from "@/components/autumn/checkout-dialog";
// or import { CheckoutDialog } from "autumn-js/react";
export default function PurchaseButton() {
const { checkout } = useCustomer();
export default function UpgradeButton() {
const { attach } = useCustomer();
return (
<button
onClick={async () => {
await checkout({
productId: "pro",
dialog: CheckoutDialog,
});
}}
>
<button onClick={() => attach({ planId: "pro" })}>
Upgrade to Pro
</button>
);
@@ -79,151 +114,46 @@ export default function PurchaseButton() {
**Parameters**
<ParamField body="productId" type="string" required>
The ID of the product being enabled.
</ParamField>
<ParamField body="dialog" type="(data: any) => JSX.Element | React.ReactNode">
A dialog that pops up to confirm the purchase (eg, for upgrades/downgrades).
See the [\<CheckoutDialog />](/react/components/checkout-dialog) page.
</ParamField>
<ParamField body="entityId" type="string">
The ID of the entity (eg, user seat) to attach the product to.
</ParamField>
<ParamField body="options" type="AttachFeatureOptions[]">
Array of feature options to configure for the attachment. Each option contains
`featureId` (string) and `quantity` (number).
</ParamField>
<ParamField body="productIds" type="string[]">
Array of additional product IDs to attach simultaneously.
</ParamField>
<ParamField body="freeTrial" type="boolean">
Whether to disable free trials for this product. Only applicable if the
product has a free trial.
<ParamField body="planId" type="string" required>
The ID of the plan to attach.
</ParamField>
<ParamField body="successUrl" type="string">
URL to redirect to after successful attachment/checkout.
URL to redirect to after successful checkout.
</ParamField>
<ParamField body="metadata" type="Record<string, string>">
Additional metadata to pass onto Stripe.
<ParamField body="openInNewTab" type="boolean">
Open checkout URL in a new tab instead of redirecting.
</ParamField>
<ParamField body="checkoutSessionParams" type="object">
Pass in Stripe checkout session fields and they will be forwarded on.
</ParamField>
<ParamField body="forceCheckout" type="boolean">
Whether to force the checkout flow even if the payment method already exists.
Not available for upgrades/downgrades.
</ParamField>
<ParamField body="openInNewTab" type="boolean" default="false">
Whether to open the checkout URL in a new tab.
</ParamField>
### `attach()`
Enables a product for a customer and handles a payment. Typically used after the `checkout` function.
If the payment method is not on file, this function will also return a Checkout URL.
```jsx
import { useCustomer } from "autumn-js/react";
export default function ConfirmationButton() {
const { attach } = useCustomer();
return (
<div>
Click to confirm your upgrade. Your card will be charged.
<button
onClick={async () => {
await attach({
productId: "ultra",
});
}}
>
Confirm Purchase
</button>
</div>
);
}
```
**Parameters**
<ParamField body="productId" type="string" required>
The ID of the product to attach.
</ParamField>
<ParamField body="entityId" type="string">
The ID of the entity (eg, user seat) to attach the product to.
</ParamField>
<ParamField body="options" type="AttachFeatureOptions[]">
Array of feature options to configure for the attachment. Each option contains
`featureId` (string) and `quantity` (number).
</ParamField>
<ParamField body="productIds" type="string[]">
Array of additional product IDs to attach simultaneously.
</ParamField>
<ParamField body="freeTrial" type="boolean">
Whether to disable free trials for this product. Only applicable if the
product has a free trial.
</ParamField>
<ParamField body="successUrl" type="string">
URL to redirect to after successful attachment/checkout.
</ParamField>
<ParamField body="metadata" type="Record<string, string>">
Additional metadata to pass onto Stripe.
</ParamField>
<ParamField body="forceCheckout" type="boolean">
Whether to force the checkout flow even if the payment method already exists.
Not available for upgrades/downgrades.
</ParamField>
<ParamField body="openInNewTab" type="boolean" default="false">
Whether to open the checkout URL in a new tab.
</ParamField>
See the [API reference](/api-reference/billing/billingAttach) for all available parameters.
### `check()`
Check if a user has access to a specific feature or product.
Checks feature access and balance for the customer locally (no API call).
<Note>
This will be read from the local `customer` state object, so no API call to
Autumn is made. This should be combined with a backend `check` call for
security.
This reads from the local `data` state. Combine with a backend `check` call for security.
</Note>
```jsx
```tsx
import { useCustomer } from "autumn-js/react";
export default function FeatureGate({ children }) {
export default function SendMessageButton() {
const { check } = useCustomer();
return (
<button
onClick={async () => {
const { data, error } = await check({
featureId: "chat-messages",
requiredBalance: 7,
});
}}
>
Send 7 Messages
</button>
);
const handleSend = () => {
const result = check({ featureId: "messages" });
if (!result.allowed) {
alert("You've run out of messages!");
return;
}
// Send the message...
};
return <button onClick={handleSend}>Send Message</button>;
}
```
@@ -233,101 +163,29 @@ export default function FeatureGate({ children }) {
The ID of the feature to check access for.
</ParamField>
<ParamField body="productId" type="string">
The ID of the product to check access for.
</ParamField>
<ParamField body="dialog" type="(data: any) => JSX.Element | React.ReactNode">
A dialog that pops up to act as a paywall (eg, when a feature runs out). See
the [\<PaywallDialog />](/react/components/paywall-dialog) page.
</ParamField>
<ParamField body="entityId" type="string">
The ID of the entity (customer/user) to check access for.
The ID of the entity to check access for.
</ParamField>
<ParamField body="requiredBalance" type="number">
The required balance/usage amount to check against.
The required balance amount to check against.
</ParamField>
<ParamField body="sendEvent" type="boolean">
Whether to send an event when checking access.
</ParamField>
### `openCustomerPortal()`
<ParamField body="withPreview" type="boolean">
Return preview data to display to the user. Using this with a `featureID` will
return paywall data, and using it with a `productId` will return
upgrade/downgrade data.
</ParamField>
Opens the Stripe customer billing portal for managing subscriptions and payment methods.
### `track()`
Track usage events for features or analytics.
<Warning>
Tracking usage client-side is not recommended, as a user in theory could stop
script execution and mess with your tracking data.
</Warning>
```jsx
import { useCustomer } from "autumn-js/react";
export default function ApiCallButton() {
const { track } = useCustomer();
const handleApiCall = async () => {
// Make your API call
await makeApiCall();
// Track the usage
await track({
featureId: "api-calls",
value: 1,
idempotencyKey: `api-call-${Date.now()}`,
});
};
return <button onClick={handleApiCall}>Make API Call</button>;
}
```
**Parameters**
<ParamField body="featureId" type="string">
The ID of the feature to track usage for.
</ParamField>
<ParamField body="eventName" type="string">
Custom event name for tracking.
</ParamField>
<ParamField body="entityId" type="string">
The ID of the entity (customer/user) to track usage for.
</ParamField>
<ParamField body="value" type="number">
The value/quantity to track (e.g., number of API calls, storage used).
</ParamField>
<ParamField body="idempotencyKey" type="string">
Unique key to prevent duplicate tracking events.
</ParamField>
### `openBillingPortal()`
Open the billing portal for customers to manage their subscriptions, payment methods, and billing information.
```jsx
```tsx
import { useCustomer } from "autumn-js/react";
export default function BillingSettings() {
const { openBillingPortal } = useCustomer();
const { openCustomerPortal } = useCustomer();
return (
<button
onClick={async () => {
await openBillingPortal({
returnUrl: "https://useautumn.com/settings/billing",
await openCustomerPortal({
returnUrl: window.location.href,
});
}}
>
@@ -343,144 +201,23 @@ export default function BillingSettings() {
URL to redirect to when the customer exits the billing portal.
</ParamField>
### `setupPayment()`
Setup a payment method for a customer.
```jsx
import { useCustomer } from "autumn-js/react";
export default function SetupPayment() {
const { setupPayment } = useCustomer();
}
```
**Parameters**
<ParamField body="successUrl" type="string">
Optional URL to redirect to after successful setup. If not provided, the default return URL will be used.
</ParamField>
<ParamField body="checkoutSessionParams" type="object">
Optional parameters to pass to the Checkout session. Accepts an object with string keys and any values.
</ParamField>
<ParamField body="openInNewTab" type="boolean">
If true, will open the payment session in a new tab. Defaults to false.
</ParamField>
### `cancel()`
Cancel a product or subscription for a user/entity.
```jsx
import { useCustomer } from "autumn-js/react";
export default function CancelSubscription() {
const { cancel } = useCustomer();
return (
<button
onClick={async () => {
await cancel({ productId: "pro" });
}}
>
Cancel Subscription
</button>
);
}
```
**Parameters**
<ParamField body="productId" type="string" required>
The ID of the product to cancel.
</ParamField>
<ParamField body="cancelImmediately" type="boolean">
Whether to cancel the product immediately. If false, the product will be
cancelled at the end of the billing cycle.
</ParamField>
<ParamField body="entityId" type="string">
The ID of the entity (customer/user) to cancel the product for.
</ParamField>
### `refetch()`
Function to manually refetch the `customer` data, eg when updating a customer's usage or balance to display.
```jsx
import { useCustomer } from "autumn-js/react";
export default function CustomerWithRefresh() {
const { customer, refetch } = useCustomer();
const { track } = useCustomer();
const sendMessage = async () => {
await track({ featureId: "chat_messages" });
await refetch();
};
return <button onClick={sendMessage}>Send Message</button>;
}
```
### `createEntity()`
Function to create one or more [entities](/documentation/customers/feature-entities) for the customer.
```jsx
import { useCustomer } from "autumn-js/react";
export default function CreateUserSeat() {
const { createEntity } = useCustomer();
const handleCreateSeat = async () => {
const { data, error } = await createEntity({
id: "user_abc",
name: "John Doe",
featureId: "seats",
});
console.log("Created entity:", data);
};
}
return <button onClick={handleCreateSeat}>Create User Seat</button>;
```
**Parameters**
<ParamField body="id" type="string" required>
The ID of the entity to create.
</ParamField>
<ParamField body="name" type="string">
Display name for the entity.
</ParamField>
<ParamField body="featureId" type="string">
The feature ID for the entity being created. Must be a `continuous_use`
feature.
Open portal in a new tab instead of redirecting.
</ParamField>
### `isLoading`
Boolean indicating whether the customer data is currently being fetched.
```jsx
```tsx
import { useCustomer } from "autumn-js/react";
export default function CustomerLoader() {
const { customer, isLoading } = useCustomer();
const { data, isLoading } = useCustomer();
if (isLoading) {
return <div>Loading customer data...</div>;
}
if (isLoading) return <div>Loading...</div>;
return <div>Welcome, {customer?.name}!</div>;
return <div>Welcome, {data?.name}!</div>;
}
```
@@ -488,20 +225,34 @@ export default function CustomerLoader() {
Any error that occurred while fetching customer data.
```jsx
```tsx
import { useCustomer } from "autumn-js/react";
export default function CustomerWithError() {
const { customer, error, isLoading } = useCustomer();
const { data, error, isLoading } = useCustomer();
if (error) {
return <div>Error loading customer: {error.message}</div>;
}
if (error) return <div>Error: {error.message}</div>;
if (isLoading) return <div>Loading...</div>;
if (isLoading) {
return <div>Loading...</div>;
}
return <div>Customer: {customer?.name}</div>;
return <div>Customer: {data?.name}</div>;
}
```
### `refetch()`
Function to manually refetch the customer data.
```tsx
import { useCustomer } from "autumn-js/react";
export default function CustomerWithRefresh() {
const { data, refetch } = useCustomer();
return (
<div>
<p>Balance: {data?.balances?.messages?.remaining}</p>
<button onClick={() => refetch()}>Refresh</button>
</div>
);
}
```

View File

@@ -1,11 +1,11 @@
---
title: "useEntity"
description: "Access an entity's state and use it to display information in your React app"
description: "Access an entity's state in your React app"
---
import LearnHooksTip from '/snippets/learn-hooks-tip.mdx';
The `useEntity` hook provides access to [entity data](/documentation/customers/feature-entities) and related operations. You can use it from your frontend to retrieve entity information and manage loading states.
The `useEntity` hook fetches [entity data](/documentation/customers/feature-entities). Entities are sub-resources of customers, typically used for per-seat or per-resource billing.
<LearnHooksTip />
@@ -15,89 +15,85 @@ The `useEntity` hook provides access to [entity data](/documentation/customers/f
The ID of the entity to retrieve.
</ParamField>
<ParamField body="expand" type="string[]">
Array of additional data to include in the entity response. Currently supports
`invoices`.
<ParamField body="queryOptions" type="UseQueryOptions">
Optional [TanStack Query options](https://tanstack.com/query/latest/docs/framework/react/reference/useQuery) to customize caching and refetching behavior.
</ParamField>
## Returns
### `entity`
### `data`
The entity object containing all entity data.
The entity object containing subscriptions, purchases, and balances for that entity.
```jsx
```tsx
import { useEntity } from "autumn-js/react";
export default function EntityProfile() {
const { entity } = useEntity("entity_abc", { expand: ["invoices"] });
export default function SeatDetails() {
const { data, isLoading } = useEntity({ entityId: "seat_42" });
if (isLoading) return <div>Loading...</div>;
return (
<div>
<h2>User Profile</h2>
<p>Name: {entity?.name}</p>
<p>Balance: {entity?.features.chat_messages?.balance}</p>
<p>Name: {data?.name}</p>
<p>Messages remaining: {data?.balances?.messages?.remaining}</p>
</div>
);
}
```
### `refetch()`
<Expandable title="Entity object">
Function to manually refetch the entity data, eg when updating an entity's state or metadata to display.
```jsx
import { useEntity, useCustomer } from "autumn-js/react";
export default function EntityWithRefresh() {
const { entity, refetch } = useEntity("entity_abc");
const { track } = useCustomer();
const updateEntity = async () => {
// Perform some entity update operation
await refetch({ expand: ["metadata"] });
};
return <button onClick={updateEntity}>Refresh Entity</button>;
```json
{
"id": "seat_42",
"name": "Seat 42",
"customerId": "cus_123",
"featureId": "seats",
"createdAt": 1771409161016,
"env": "sandbox",
"subscriptions": [
{
"planId": "pro_plan",
"autoEnable": true,
"addOn": false,
"status": "active",
"pastDue": false,
"canceledAt": null,
"expiresAt": null,
"trialEndsAt": null,
"startedAt": 1771431921437,
"currentPeriodStart": 1771431921437,
"currentPeriodEnd": 1771999921437,
"quantity": 1
}
],
"purchases": [],
"balances": {
"messages": {
"featureId": "messages",
"granted": 100,
"remaining": 72,
"usage": 28,
"unlimited": false,
"overageAllowed": false,
"maxPurchase": null,
"nextResetAt": 1773851121437
}
}
}
```
</Expandable>
### `isLoading`
Boolean indicating whether the entity data is currently being fetched.
```jsx
import { useEntity } from "autumn-js/react";
export default function EntityLoader() {
const { entity, isLoading } = useEntity("entity_abc");
if (isLoading) {
return <div>Loading entity data...</div>;
}
return <div>Entity: {entity?.name}</div>;
}
```
### `error`
Any error that occurred while fetching entity data.
```jsx
import { useEntity } from "autumn-js/react";
### `refetch()`
export default function EntityWithError() {
const { entity, error, isLoading } = useEntity("entity_abc");
if (error) {
return <div>Error loading entity: {error.message}</div>;
}
if (isLoading) {
return <div>Loading...</div>;
}
return <div>Entity: {entity?.name}</div>;
}
```
Function to manually refetch the entity data.

View File

@@ -3,7 +3,7 @@ title: "useListEvents"
description: "List and paginate through individual customer events"
---
import SWRConfigParam from '/snippets/swr-config-param.mdx';
import QueryOptionsParam from '/snippets/swr-config-param.mdx';
import LearnHooksTip from '/snippets/learn-hooks-tip.mdx';
The `useListEvents` hook provides access to individual event records with pagination.
@@ -40,7 +40,7 @@ It fetches data from the [/events/list](/api-reference/events/list-events) endpo
</Expandable>
</ParamField>
<SWRConfigParam />
<QueryOptionsParam />
## Returns
@@ -49,8 +49,8 @@ It fetches data from the [/events/list](/api-reference/events/list-events) endpo
Array of individual event records. Each event object includes:
- `id`: Unique event identifier
- `timestamp`: Unix timestamp in milliseconds when the event occurred
- `feature_id`: The feature associated with the event recorded
- `customer_id`: The customer that recorded this event
- `featureId`: The feature associated with the event recorded
- `customerId`: The customer that recorded this event
- `value`: The numeric value recorded with the event
- `properties`: Metadata and custom properties for the event
@@ -61,8 +61,8 @@ Array of individual event records. Each event object includes:
{
"id": "evt_abc123",
"timestamp": 1765411200000,
"feature_id": "api_calls",
"customer_id": "cust_xyz789",
"featureId": "api_calls",
"customerId": "cust_xyz789",
"value": 1,
"properties": {
"endpoint": "/api/users",
@@ -73,8 +73,8 @@ Array of individual event records. Each event object includes:
{
"id": "evt_def456",
"timestamp": 1765411260000,
"feature_id": "api_calls",
"customer_id": "cust_xyz789",
"featureId": "api_calls",
"customerId": "cust_xyz789",
"value": 1,
"properties": {
"endpoint": "/api/posts",
@@ -97,7 +97,7 @@ Boolean indicating whether there are previous events available on earlier pages.
### `page`
Current page number (1-based indexing).
Current page number (0-based indexing).
### `isLoading`

View File

@@ -0,0 +1,88 @@
---
title: "useListPlans"
description: "Fetch the list of available plans"
---
import LearnHooksTip from '/snippets/learn-hooks-tip.mdx';
The `useListPlans` hook fetches all available plans configured in your Autumn dashboard. Use this to build custom pricing pages or plan selectors.
<LearnHooksTip />
## Parameters
<ParamField body="queryOptions" type="UseQueryOptions">
Optional [TanStack Query options](https://tanstack.com/query/latest/docs/framework/react/reference/useQuery) to customize caching and refetching behavior.
</ParamField>
## Returns
### `data`
Array of plan objects.
```tsx
import { useListPlans } from "autumn-js/react";
export default function PlansList() {
const { data, isLoading } = useListPlans();
if (isLoading) return <div>Loading plans...</div>;
return (
<ul>
{data?.map((plan) => (
<li key={plan.id}>
{plan.name} - {plan.price ? `$${plan.price.amount}/${plan.price.interval}` : 'Free'}
</li>
))}
</ul>
);
}
```
<Expandable title="Plan object">
```json
{
"id": "pro",
"name": "Pro Plan",
"description": null,
"group": null,
"version": 1,
"addOn": false,
"autoEnable": false,
"price": {
"amount": 10,
"interval": "month"
},
"items": [
{
"featureId": "messages",
"included": 1000,
"unlimited": false,
"reset": { "interval": "month" },
"price": null
}
],
"freeTrial": null,
"createdAt": 1771513979217,
"env": "sandbox",
"archived": false,
"baseVariantId": null
}
```
</Expandable>
### `isLoading`
Boolean indicating whether the plans are currently being fetched.
### `error`
Any error that occurred while fetching plans.
### `refetch()`
Function to manually refetch the plans list.

View File

@@ -0,0 +1,100 @@
---
title: "useReferrals"
description: "Create and redeem referral codes"
---
import LearnHooksTip from '/snippets/learn-hooks-tip.mdx';
The `useReferrals` hook provides methods to create and redeem referral codes as part of a referral program.
<LearnHooksTip />
## Parameters
<ParamField body="programId" type="string" required>
The ID of your referral program.
</ParamField>
<ParamField body="queryOptions" type="UseQueryOptions">
Optional [TanStack Query options](https://tanstack.com/query/latest/docs/framework/react/reference/useQuery) to customize caching and refetching behavior.
</ParamField>
## Returns
### `data`
The referral code response. The hook starts with `enabled: false`, so call `refetch()` to create/fetch the code.
```tsx
import { useReferrals } from "autumn-js/react";
export default function ReferralCode() {
const { data, refetch, isLoading } = useReferrals({ programId: "refer-a-friend" });
return (
<div>
<button onClick={() => refetch()}>Get My Referral Code</button>
{data && <p>Share this code: {data.code}</p>}
</div>
);
}
```
<Expandable title="Response object">
```json
{
"code": "REF123ABC",
"customerId": "cus_123",
"createdAt": 1717000000
}
```
</Expandable>
### `redeemCode()`
Redeems a referral code for the current customer.
```tsx
import { useReferrals } from "autumn-js/react";
export default function RedeemForm() {
const { redeemCode } = useReferrals({ programId: "refer-a-friend" });
const handleRedeem = async (code: string) => {
const result = await redeemCode({ code });
console.log("Redeemed! Reward:", result.rewardId);
};
return <button onClick={() => handleRedeem("REF123ABC")}>Redeem Code</button>;
}
```
**Parameters**
<ParamField body="code" type="string" required>
The referral code to redeem.
</ParamField>
**Returns**
```json
{
"id": "red_123",
"customerId": "cus_456",
"rewardId": "reward_789"
}
```
### `isLoading`
Boolean indicating whether a referral code is being created/fetched.
### `error`
Any error that occurred.
### `refetch()`
Creates or fetches the referral code for the configured `programId`.

View File

@@ -1,3 +1,3 @@
<ParamField body="swrConfig" type="SWRConfiguration">
Optional [SWR configuration object](https://swr.vercel.app/docs/api#options) to customize caching and revalidation behavior. Accepts a `refreshInterval` in milliseconds.
</ParamField>
<ParamField body="queryOptions" type="UseQueryOptions">
Optional [TanStack Query options](https://tanstack.com/query/latest/docs/framework/react/reference/useQuery) to customize caching and refetching behavior. Common options include `enabled`, `staleTime`, and `refetchInterval`.
</ParamField>

View File

@@ -1,8 +1,6 @@
import { Autumn } from "autumn-js";
const autumn = new Autumn({
secretKey: process.env.AUTUMN_SECRET_KEY,
});
const autumn = new Autumn();
const res = await autumn.plans.create({
planId: "pro_plan",

139
bun.lock
View File

@@ -101,42 +101,29 @@
},
"packages/autumn-js": {
"name": "autumn-js",
"version": "0.1.40",
"version": "1.0.0-beta.1",
"dependencies": {
"@useautumn/sdk": "workspace:*",
"query-string": "^9.2.2",
"rou3": "^0.6.1",
"swr": "^2.3.3",
"zod": "^4.0.0",
},
"devDependencies": {
"@remix-run/node": "^2.16.6",
"@supabase/ssr": "^0.6.1",
"@tanstack/react-query": "catalog:",
"@tanstack/react-start": "^1.120.5",
"@types/express": "^5.0.1",
"@types/node": "^22.15.32",
"@types/react": "^19",
"convex": "^1.25.4",
"elysia": "^1.3.5",
"@useautumn/sdk": "workspace:*",
"esbuild-plugin-path-alias": "^1.0.7",
"express": "^5.1.0",
"fastify": "^5.3.3",
"hono": "^4.7.9",
"next": "^15.2.3",
"nodemon": "^3.1.10",
"react-dom": "^19.1.0",
"stripe": "^18.3.0",
"tsgo": "catalog:",
"tsup": "^8.4.0",
"tsx": "^4.19.3",
"typescript": "^5.8.3",
},
"peerDependencies": {
"@tanstack/react-query": "^5.0.0",
"better-auth": "^1.3.17",
"better-call": "^1.0.12",
"convex": "^1.25.4",
"react": "^18.0.0 || ^19.0.0",
},
"optionalPeers": [
@@ -168,7 +155,7 @@
},
"packages/sdk": {
"name": "@useautumn/sdk",
"version": "0.10.15",
"version": "0.10.16",
"dependencies": {
"zod": "^3.25.65 || ^4.0.0",
},
@@ -703,8 +690,6 @@
"@biomejs/cli-win32-x64": ["@biomejs/cli-win32-x64@2.4.0", "", { "os": "win32", "cpu": "x64" }, "sha512-g47s+V+OqsGxbSZN3lpav6WYOk0PIc3aCBAq+p6dwSynL3K5MA6Cg6nkzDOlu28GEHwbakW+BllzHCJCxnfK5Q=="],
"@borewit/text-codec": ["@borewit/text-codec@0.2.1", "", {}, "sha512-k7vvKPbf7J2fZ5klGRD9AeKfUvojuZIQ3BT5u7Jfv+puwXkUBUT5PVyMDfJZpy30CBDXGMgw7fguK/lpOMBvgw=="],
"@braintree/sanitize-url": ["@braintree/sanitize-url@7.1.2", "", {}, "sha512-jigsZK+sMF/cuiB7sERuo9V7N9jx+dhmHHnQyDSVdpZwVutaBu7WvNYqMDLSgFgfB30n452TP3vjDAvFC973mA=="],
"@bufbuild/protobuf": ["@bufbuild/protobuf@2.11.0", "", {}, "sha512-sBXGT13cpmPR5BMgHE6UEEfEaShh5Ror6rfN3yEK5si7QVrtZg8LEPQb0VVhiLRUslD2yLnXtnRzG035J/mZXQ=="],
@@ -1513,22 +1498,6 @@
"@reduxjs/toolkit": ["@reduxjs/toolkit@2.11.2", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "@standard-schema/utils": "^0.3.0", "immer": "^11.0.0", "redux": "^5.0.1", "redux-thunk": "^3.1.0", "reselect": "^5.1.0" }, "peerDependencies": { "react": "^16.9.0 || ^17.0.0 || ^18 || ^19", "react-redux": "^7.2.1 || ^8.1.3 || ^9.0.0" }, "optionalPeers": ["react", "react-redux"] }, "sha512-Kd6kAHTA6/nUpp8mySPqj3en3dm0tdMIgbttnQ1xFMVpufoj+ADi8pXLBsd4xzTRHQa7t/Jv8W5UnCuW4kuWMQ=="],
"@remix-run/node": ["@remix-run/node@2.17.4", "", { "dependencies": { "@remix-run/server-runtime": "2.17.4", "@remix-run/web-fetch": "^4.4.2", "@web3-storage/multipart-parser": "^1.0.0", "cookie-signature": "^1.1.0", "source-map-support": "^0.5.21", "stream-slice": "^0.1.2", "undici": "^6.21.2" }, "peerDependencies": { "typescript": "^5.1.0" }, "optionalPeers": ["typescript"] }, "sha512-9A29JaYiGHDEmaiQuD1IlO/TrQxnnkj98GpytihU+Nz6yTt6RwzzyMMqTAoasRd1dPD4OeSaSqbwkcim/eE76Q=="],
"@remix-run/router": ["@remix-run/router@1.23.2", "", {}, "sha512-Ic6m2U/rMjTkhERIa/0ZtXJP17QUi2CbWE7cqx4J58M8aA3QTfW+2UlQ4psvTX9IO1RfNVhK3pcpdjej7L+t2w=="],
"@remix-run/server-runtime": ["@remix-run/server-runtime@2.17.4", "", { "dependencies": { "@remix-run/router": "1.23.2", "@types/cookie": "^0.6.0", "@web3-storage/multipart-parser": "^1.0.0", "cookie": "^0.7.2", "set-cookie-parser": "^2.4.8", "source-map": "^0.7.3", "turbo-stream": "2.4.1" }, "peerDependencies": { "typescript": "^5.1.0" }, "optionalPeers": ["typescript"] }, "sha512-oCsFbPuISgh8KpPKsfBChzjcntvTz5L+ggq9VNYWX8RX3yA7OgQpKspRHOSxb05bw7m0Hx+L1KRHXjf3juKX8w=="],
"@remix-run/web-blob": ["@remix-run/web-blob@3.1.0", "", { "dependencies": { "@remix-run/web-stream": "^1.1.0", "web-encoding": "1.1.5" } }, "sha512-owGzFLbqPH9PlKb8KvpNJ0NO74HWE2euAn61eEiyCXX/oteoVzTVSN8mpLgDjaxBf2btj5/nUllSUgpyd6IH6g=="],
"@remix-run/web-fetch": ["@remix-run/web-fetch@4.4.2", "", { "dependencies": { "@remix-run/web-blob": "^3.1.0", "@remix-run/web-file": "^3.1.0", "@remix-run/web-form-data": "^3.1.0", "@remix-run/web-stream": "^1.1.0", "@web3-storage/multipart-parser": "^1.0.0", "abort-controller": "^3.0.0", "data-uri-to-buffer": "^3.0.1", "mrmime": "^1.0.0" } }, "sha512-jgKfzA713/4kAW/oZ4bC3MoLWyjModOVDjFPNseVqcJKSafgIscrYL9G50SurEYLswPuoU3HzSbO0jQCMYWHhA=="],
"@remix-run/web-file": ["@remix-run/web-file@3.1.0", "", { "dependencies": { "@remix-run/web-blob": "^3.1.0" } }, "sha512-dW2MNGwoiEYhlspOAXFBasmLeYshyAyhIdrlXBi06Duex5tDr3ut2LFKVj7tyHLmn8nnNwFf1BjNbkQpygC2aQ=="],
"@remix-run/web-form-data": ["@remix-run/web-form-data@3.1.0", "", { "dependencies": { "web-encoding": "1.1.5" } }, "sha512-NdeohLMdrb+pHxMQ/Geuzdp0eqPbea+Ieo8M8Jx2lGC6TBHsgHzYcBvr0LyPdPVycNRDEpWpiDdCOdCryo3f9A=="],
"@remix-run/web-stream": ["@remix-run/web-stream@1.1.0", "", { "dependencies": { "web-streams-polyfill": "^3.1.1" } }, "sha512-KRJtwrjRV5Bb+pM7zxcTJkhIqWWSy+MYsIxHK+0m5atcznsf15YwUBWHWulZerV2+vvHH1Lp1DD7pw6qKW8SgA=="],
"@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-beta.27", "", {}, "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA=="],
"@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.57.1", "", { "os": "android", "cpu": "arm" }, "sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg=="],
@@ -1649,8 +1618,6 @@
"@shikijs/vscode-textmate": ["@shikijs/vscode-textmate@10.0.2", "", {}, "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg=="],
"@sinclair/typebox": ["@sinclair/typebox@0.34.48", "", {}, "sha512-kKJTNuK3AQOrgjjotVxMrCn1sUJwM76wMszfq1kdU4uYVJjvEWuFQ6HgvLt4Xz3fSmZlTOxJ/Ie13KnIcWQXFA=="],
"@sindresorhus/is": ["@sindresorhus/is@5.6.0", "", {}, "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g=="],
"@sindresorhus/merge-streams": ["@sindresorhus/merge-streams@4.0.0", "", {}, "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ=="],
@@ -1795,8 +1762,6 @@
"@supabase/realtime-js": ["@supabase/realtime-js@2.95.3", "", { "dependencies": { "@types/phoenix": "^1.6.6", "@types/ws": "^8.18.1", "tslib": "2.8.1", "ws": "^8.18.2" } }, "sha512-D7EAtfU3w6BEUxDACjowWNJo/ZRo7sDIuhuOGKHIm9FHieGeoJV5R6GKTLtga/5l/6fDr2u+WcW/m8I9SYmaIw=="],
"@supabase/ssr": ["@supabase/ssr@0.6.1", "", { "dependencies": { "cookie": "^1.0.1" }, "peerDependencies": { "@supabase/supabase-js": "^2.43.4" } }, "sha512-QtQgEMvaDzr77Mk3vZ3jWg2/y+D8tExYF7vcJT+wQ8ysuvOeGGjYbZlvj5bHYsj/SpC0bihcisnwPrM4Gp5G4g=="],
"@supabase/storage-js": ["@supabase/storage-js@2.95.3", "", { "dependencies": { "iceberg-js": "^0.8.1", "tslib": "2.8.1" } }, "sha512-4GxkJiXI3HHWjxpC3sDx1BVrV87O0hfX+wvJdqGv67KeCu+g44SPnII8y0LL/Wr677jB7tpjAxKdtVWf+xhc9A=="],
"@supabase/supabase-js": ["@supabase/supabase-js@2.95.3", "", { "dependencies": { "@supabase/auth-js": "2.95.3", "@supabase/functions-js": "2.95.3", "@supabase/postgrest-js": "2.95.3", "@supabase/realtime-js": "2.95.3", "@supabase/storage-js": "2.95.3" } }, "sha512-Fukw1cUTQ6xdLiHDJhKKPu6svEPaCEDvThqCne3OaQyZvuq2qjhJAd91kJu3PXLG18aooCgYBaB6qQz35hhABg=="],
@@ -1891,10 +1856,6 @@
"@tanstack/virtual-file-routes": ["@tanstack/virtual-file-routes@1.154.7", "", {}, "sha512-cHHDnewHozgjpI+MIVp9tcib6lYEQK5MyUr0ChHpHFGBl8Xei55rohFK0I0ve/GKoHeioaK42Smd8OixPp6CTg=="],
"@tokenizer/inflate": ["@tokenizer/inflate@0.4.1", "", { "dependencies": { "debug": "^4.4.3", "token-types": "^6.1.1" } }, "sha512-2mAv+8pkG6GIZiF1kNg1jAjh27IDxEPKwdGul3snfztFerfPGI1LjDezZp3i7BElXompqEtPmoPx6c2wgtWsOA=="],
"@tokenizer/token": ["@tokenizer/token@0.3.0", "", {}, "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A=="],
"@tootallnate/quickjs-emscripten": ["@tootallnate/quickjs-emscripten@0.23.0", "", {}, "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA=="],
"@ts-morph/common": ["@ts-morph/common@0.27.0", "", { "dependencies": { "fast-glob": "^3.3.3", "minimatch": "^10.0.1", "path-browserify": "^1.0.1" } }, "sha512-Wf29UqxWDpc+i61k3oIOzcUfQt79PIT9y/MWfAGlrkjg6lBC1hwDECLXPVJAhWjiGbfBCxZd65F/LIZF3+jeJQ=="],
@@ -1931,7 +1892,7 @@
"@types/connect": ["@types/connect@3.4.38", "", { "dependencies": { "@types/node": "*" } }, "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug=="],
"@types/cookie": ["@types/cookie@0.6.0", "", {}, "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA=="],
"@types/cookie": ["@types/cookie@0.4.1", "", {}, "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q=="],
"@types/cookiejar": ["@types/cookiejar@2.1.5", "", {}, "sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q=="],
@@ -2149,12 +2110,8 @@
"@vitejs/plugin-react": ["@vitejs/plugin-react@4.7.0", "", { "dependencies": { "@babel/core": "^7.28.0", "@babel/plugin-transform-react-jsx-self": "^7.27.1", "@babel/plugin-transform-react-jsx-source": "^7.27.1", "@rolldown/pluginutils": "1.0.0-beta.27", "@types/babel__core": "^7.20.5", "react-refresh": "^0.17.0" }, "peerDependencies": { "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" } }, "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA=="],
"@web3-storage/multipart-parser": ["@web3-storage/multipart-parser@1.0.0", "", {}, "sha512-BEO6al7BYqcnfX15W2cnGR+Q566ACXAT9UQykORCWW80lmkpWsnEob6zJS1ZVBKsSJC8+7vJkHwlp+lXG1UCdw=="],
"@wooorm/starry-night": ["@wooorm/starry-night@3.9.0", "", { "dependencies": { "@types/hast": "^3.0.0", "import-meta-resolve": "^4.0.0", "vscode-oniguruma": "^2.0.0", "vscode-textmate": "^9.0.0" } }, "sha512-LXVGKfYhTuFhoRuPAHz2XolS/J45L4lI/lCSIBugDpklXYDUPrJyA8tk17u7G32fcFaGODJXH/YDwQDfUXdPRw=="],
"@zxing/text-encoding": ["@zxing/text-encoding@0.9.0", "", {}, "sha512-U/4aVJ2mxI0aDNI8Uq0wEhMgY+u4CNtEb0om3+y3+niDAsoTCOB33UF0sxpzqzdqXLqmvc+vZyAt4O8pPdfkwA=="],
"abort-controller": ["abort-controller@3.0.0", "", { "dependencies": { "event-target-shim": "^5.0.0" } }, "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg=="],
"abort-controller-x": ["abort-controller-x@0.4.3", "", {}, "sha512-VtUwTNU8fpMwvWGn4xE93ywbogTYsuT+AUxAXOeelbXuQVIwNmC5YLeho9sH4vZ4ITW8414TTAOG1nW6uIVHCA=="],
@@ -2483,8 +2440,6 @@
"convert-to-spaces": ["convert-to-spaces@2.0.1", "", {}, "sha512-rcQ1bsQO9799wq24uE5AM2tAILy4gXGIK/njFWcVQkGNZ96edlpY+A7bjwvzjYvLDyzmG1MmMLZhpcsb+klNMQ=="],
"convex": ["convex@1.31.7", "", { "dependencies": { "esbuild": "0.27.0", "prettier": "^3.0.0" }, "peerDependencies": { "@auth0/auth0-react": "^2.0.1", "@clerk/clerk-react": "^4.12.8 || ^5.0.0", "react": "^18.0.0 || ^19.0.0-0 || ^19.0.0" }, "optionalPeers": ["@auth0/auth0-react", "@clerk/clerk-react", "react"], "bin": { "convex": "bin/main.js" } }, "sha512-PtNMe1mAIOvA8Yz100QTOaIdgt2rIuWqencVXrb4McdhxBHZ8IJ1eXTnrgCC9HydyilGT1pOn+KNqT14mqn9fQ=="],
"cookie": ["cookie@0.7.2", "", {}, "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w=="],
"cookie-es": ["cookie-es@2.0.0", "", {}, "sha512-RAj4E421UYRgqokKUmotqAwuplYw15qtdXfY+hGzgCJ/MBjCVZcSoHK/kH9kocfjRjcDME7IiDWR/1WX1TM2Pg=="],
@@ -2599,7 +2554,7 @@
"dagre-d3-es": ["dagre-d3-es@7.0.13", "", { "dependencies": { "d3": "^7.9.0", "lodash-es": "^4.17.21" } }, "sha512-efEhnxpSuwpYOKRm/L5KbqoZmNNukHa/Flty4Wp62JRvgH2ojwVgPgdYyr4twpieZnyRDdIH7PY2mopX26+j2Q=="],
"data-uri-to-buffer": ["data-uri-to-buffer@3.0.1", "", {}, "sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og=="],
"data-uri-to-buffer": ["data-uri-to-buffer@4.0.1", "", {}, "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A=="],
"data-view-buffer": ["data-view-buffer@1.0.2", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-data-view": "^1.0.2" } }, "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ=="],
@@ -2731,8 +2686,6 @@
"electron-to-chromium": ["electron-to-chromium@1.5.286", "", {}, "sha512-9tfDXhJ4RKFNerfjdCcZfufu49vg620741MNs26a9+bhLThdB+plgMeou98CAaHu/WATj2iHOOHTp1hWtABj2A=="],
"elysia": ["elysia@1.4.25", "", { "dependencies": { "cookie": "^1.1.1", "exact-mirror": "^0.2.7", "fast-decode-uri-component": "^1.0.1", "memoirist": "^0.4.0" }, "peerDependencies": { "@sinclair/typebox": ">= 0.34.0 < 1", "@types/bun": ">= 1.2.0", "file-type": ">= 20.0.0", "openapi-types": ">= 12.0.0", "typescript": ">= 5.0.0" }, "optionalPeers": ["@types/bun", "typescript"] }, "sha512-liKjavH99Gpzrv9cDil6uYWmPuqESfPFV1FIaFSd3iNqo3y7e29sN43VxFIK8tWWnyi6eDAmi2SZk8hNAMQMyg=="],
"emoji-regex": ["emoji-regex@10.6.0", "", {}, "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A=="],
"encodeurl": ["encodeurl@2.0.0", "", {}, "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg=="],
@@ -2839,8 +2792,6 @@
"eventsource-parser": ["eventsource-parser@3.0.6", "", {}, "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg=="],
"exact-mirror": ["exact-mirror@0.2.7", "", { "peerDependencies": { "@sinclair/typebox": "^0.34.15" }, "optionalPeers": ["@sinclair/typebox"] }, "sha512-+MeEmDcLA4o/vjK2zujgk+1VTxPR4hdp23qLqkWfStbECtAq9gmsvQa3LW6z/0GXZyHJobrCnmy1cdeE7BjsYg=="],
"execa": ["execa@9.6.1", "", { "dependencies": { "@sindresorhus/merge-streams": "^4.0.0", "cross-spawn": "^7.0.6", "figures": "^6.1.0", "get-stream": "^9.0.0", "human-signals": "^8.0.1", "is-plain-obj": "^4.1.0", "is-stream": "^4.0.1", "npm-run-path": "^6.0.0", "pretty-ms": "^9.2.0", "signal-exit": "^4.1.0", "strip-final-newline": "^4.0.0", "yoctocolors": "^2.1.1" } }, "sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA=="],
"expand-template": ["expand-template@2.0.3", "", {}, "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg=="],
@@ -2905,8 +2856,6 @@
"file-entry-cache": ["file-entry-cache@8.0.0", "", { "dependencies": { "flat-cache": "^4.0.0" } }, "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ=="],
"file-type": ["file-type@21.3.0", "", { "dependencies": { "@tokenizer/inflate": "^0.4.1", "strtok3": "^10.3.4", "token-types": "^6.1.1", "uint8array-extras": "^1.4.0" } }, "sha512-8kPJMIGz1Yt/aPEwOsrR97ZyZaD1Iqm8PClb1nYFclUCkBi0Ma5IsYNQzvSFS9ib51lWyIw5mIT9rWzI/xjpzA=="],
"file-uri-to-path": ["file-uri-to-path@1.0.0", "", {}, "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw=="],
"filelist": ["filelist@1.0.4", "", { "dependencies": { "minimatch": "^5.0.1" } }, "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q=="],
@@ -3195,8 +3144,6 @@
"is-alphanumerical": ["is-alphanumerical@2.0.1", "", { "dependencies": { "is-alphabetical": "^2.0.0", "is-decimal": "^2.0.0" } }, "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw=="],
"is-arguments": ["is-arguments@1.2.0", "", { "dependencies": { "call-bound": "^1.0.2", "has-tostringtag": "^1.0.2" } }, "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA=="],
"is-array-buffer": ["is-array-buffer@3.0.5", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "get-intrinsic": "^1.2.6" } }, "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A=="],
"is-arrayish": ["is-arrayish@0.2.1", "", {}, "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="],
@@ -3511,8 +3458,6 @@
"media-typer": ["media-typer@0.3.0", "", {}, "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ=="],
"memoirist": ["memoirist@0.4.0", "", {}, "sha512-zxTgA0mSYELa66DimuNQDvyLq36AwDlTuVRbnQtB+VuTcKWm5Qc4z3WkSpgsFWHNhexqkIooqpv4hdcqrX5Nmg=="],
"merge-descriptors": ["merge-descriptors@1.0.3", "", {}, "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ=="],
"merge-stream": ["merge-stream@2.0.0", "", {}, "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="],
@@ -3647,8 +3592,6 @@
"motion-utils": ["motion-utils@12.29.2", "", {}, "sha512-G3kc34H2cX2gI63RqU+cZq+zWRRPSsNIOjpdl9TN4AQwC4sgwYPl/Q/Obf/d53nOm569T0fYK+tcoSV50BWx8A=="],
"mrmime": ["mrmime@1.0.1", "", {}, "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw=="],
"ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
"msgpackr": ["msgpackr@1.11.5", "", { "optionalDependencies": { "msgpackr-extract": "^3.0.2" } }, "sha512-UjkUHN0yqp9RWKy0Lplhh+wlpdt9oQBYgULZOiFhV3VclSF1JnSQWZ5r9gORQlNYaUKQoR8itv7g7z1xDDuACA=="],
@@ -4295,8 +4238,6 @@
"stop-iteration-iterator": ["stop-iteration-iterator@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "internal-slot": "^1.1.0" } }, "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ=="],
"stream-slice": ["stream-slice@0.1.2", "", {}, "sha512-QzQxpoacatkreL6jsxnVb7X5R/pGw9OUv2qWTYWnmLpg4NdN31snPy/f3TdQE1ZUXaThRvj1Zw4/OGg0ZkaLMA=="],
"streamdown": ["streamdown@1.6.11", "", { "dependencies": { "clsx": "^2.1.1", "hast": "^1.0.0", "hast-util-to-jsx-runtime": "^2.3.6", "html-url-attributes": "^3.0.1", "katex": "^0.16.22", "lucide-react": "^0.542.0", "marked": "^16.2.1", "mermaid": "^11.11.0", "rehype-harden": "^1.1.6", "rehype-katex": "^7.0.1", "rehype-raw": "^7.0.0", "rehype-sanitize": "^6.0.0", "remark-cjk-friendly": "^1.2.3", "remark-cjk-friendly-gfm-strikethrough": "^1.2.3", "remark-gfm": "^4.0.1", "remark-math": "^6.0.0", "remark-parse": "^11.0.0", "remark-rehype": "^11.1.2", "remend": "1.0.1", "shiki": "^3.12.2", "tailwind-merge": "^3.3.1", "unified": "^11.0.5", "unist-util-visit": "^5.0.0" }, "peerDependencies": { "react": "^18.0.0 || ^19.0.0" } }, "sha512-Y38fwRx5kCKTluwM+Gf27jbbi9q6Qy+WC9YrC1YbCpMkktT3PsRBJHMWiqYeF8y/JzLpB1IzDoeaB6qkQEDnAA=="],
"streamx": ["streamx@2.23.0", "", { "dependencies": { "events-universal": "^1.0.0", "fast-fifo": "^1.3.2", "text-decoder": "^1.1.0" } }, "sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg=="],
@@ -4333,8 +4274,6 @@
"strnum": ["strnum@2.1.2", "", {}, "sha512-l63NF9y/cLROq/yqKXSLtcMeeyOfnSQlfMSlzFt/K73oIaD8DGaQWd7Z34X9GPiKqP5rbSh84Hl4bOlLcjiSrQ=="],
"strtok3": ["strtok3@10.3.4", "", { "dependencies": { "@tokenizer/token": "^0.3.0" } }, "sha512-KIy5nylvC5le1OdaaoCJ07L+8iQzJHGH6pWDuzS+d07Cu7n1MZ2x26P8ZKIWfbK02+XIL8Mp4RkWeqdUCrDMfg=="],
"style-to-js": ["style-to-js@1.1.21", "", { "dependencies": { "style-to-object": "1.0.14" } }, "sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ=="],
"style-to-object": ["style-to-object@1.0.14", "", { "dependencies": { "inline-style-parser": "0.2.7" } }, "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw=="],
@@ -4461,8 +4400,6 @@
"toidentifier": ["toidentifier@1.0.1", "", {}, "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="],
"token-types": ["token-types@6.1.2", "", { "dependencies": { "@borewit/text-codec": "^0.2.1", "@tokenizer/token": "^0.3.0", "ieee754": "^1.2.1" } }, "sha512-dRXchy+C0IgK8WPC6xvCHFRIWYUbqqdEIKPaKo/AcTUNzwLTK6AH7RjdLWsEZcAN/TBdtfUw3PYEgPr5VPr6ww=="],
"touch": ["touch@3.1.1", "", { "bin": { "nodetouch": "bin/nodetouch.js" } }, "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA=="],
"tough-cookie": ["tough-cookie@6.0.0", "", { "dependencies": { "tldts": "^7.0.5" } }, "sha512-kXuRi1mtaKMrsLUxz3sQYvVl37B0Ns6MzfrtV5DvJceE9bPyspOqk9xxv7XbZWcfLWbFmm997vl83qUWVJA64w=="],
@@ -4513,8 +4450,6 @@
"tunnel-agent": ["tunnel-agent@0.6.0", "", { "dependencies": { "safe-buffer": "^5.0.1" } }, "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w=="],
"turbo-stream": ["turbo-stream@2.4.1", "", {}, "sha512-v8kOJXpG3WoTN/+at8vK7erSzo6nW6CIaeOvNOkHQVDajfz1ZVeSxCbc6tOH4hrGZW7VUCV0TOXd8CPzYnYkrw=="],
"tw-animate-css": ["tw-animate-css@1.4.0", "", {}, "sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ=="],
"twoslash": ["twoslash@0.3.6", "", { "dependencies": { "@typescript/vfs": "^1.6.2", "twoslash-protocol": "0.3.6" }, "peerDependencies": { "typescript": "^5.5.0" } }, "sha512-VuI5OKl+MaUO9UIW3rXKoPgHI3X40ZgB/j12VY6h98Ae1mCBihjPvhOPeJWlxCYcmSbmeZt5ZKkK0dsVtp+6pA=="],
@@ -4543,8 +4478,6 @@
"ufo": ["ufo@1.6.3", "", {}, "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q=="],
"uint8array-extras": ["uint8array-extras@1.5.0", "", {}, "sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A=="],
"unbox-primitive": ["unbox-primitive@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "has-bigints": "^1.0.2", "has-symbols": "^1.1.0", "which-boxed-primitive": "^1.1.1" } }, "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw=="],
"unbzip2-stream": ["unbzip2-stream@1.4.3", "", { "dependencies": { "buffer": "^5.2.1", "through": "^2.3.8" } }, "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg=="],
@@ -4553,7 +4486,7 @@
"undefsafe": ["undefsafe@2.0.5", "", {}, "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA=="],
"undici": ["undici@6.23.0", "", {}, "sha512-VfQPToRA5FZs/qJxLIinmU59u0r7LXqoJkCzinq3ckNJp3vKEh7jTWN589YQ5+aoAC/TGRLyJLCPKcLQbM8r9g=="],
"undici": ["undici@7.22.0", "", {}, "sha512-RqslV2Us5BrllB+JeiZnK4peryVTndy9Dnqq62S3yYRRTj0tFQCwEniUy2167skdGOy3vqRzEvl1Dm4sV2ReDg=="],
"undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="],
@@ -4613,8 +4546,6 @@
"use-sync-external-store": ["use-sync-external-store@1.6.0", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w=="],
"util": ["util@0.12.5", "", { "dependencies": { "inherits": "^2.0.3", "is-arguments": "^1.0.4", "is-generator-function": "^1.0.7", "is-typed-array": "^1.1.3", "which-typed-array": "^1.1.2" } }, "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA=="],
"util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="],
"utility-types": ["utility-types@3.11.0", "", {}, "sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw=="],
@@ -4663,8 +4594,6 @@
"walk-up-path": ["walk-up-path@3.0.1", "", {}, "sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA=="],
"web-encoding": ["web-encoding@1.1.5", "", { "dependencies": { "util": "^0.12.3" }, "optionalDependencies": { "@zxing/text-encoding": "0.9.0" } }, "sha512-HYLeVCdJ0+lBYV2FvNZmv3HJ2Nt0QYXqZojk3d9FJOLkwnuhzM9tmamh8d7HPM8QqjKH8DeHkFTx+CFlWpZZDA=="],
"web-namespaces": ["web-namespaces@2.0.1", "", {}, "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ=="],
"web-streams-polyfill": ["web-streams-polyfill@4.0.0-beta.3", "", {}, "sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug=="],
@@ -4775,6 +4704,8 @@
"@autumn/server/@types/node": ["@types/node@25.2.3", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-m0jEgYlYz+mDJZ2+F4v8D1AyQb+QzsNqRuI7xg1VQX/KlKS0qT9r1Mo16yo5F/MtifXFgaofIFsdFMox2SxIbQ=="],
"@autumn/server/autumn-js": ["autumn-js@0.1.75", "", { "dependencies": { "query-string": "^9.2.2", "rou3": "^0.6.1", "swr": "^2.3.3", "zod": "^4.0.0" }, "peerDependencies": { "better-auth": "^1.3.17", "better-call": "^1.0.12", "convex": "^1.25.4" }, "optionalPeers": ["better-auth", "better-call", "convex"] }, "sha512-CVyPWwsKMEOWxsa9GiySvTG2Q5+vbhLsS7+JBmsQvkwqZvuaiavlUE/OqTdujsxEUYsyy4CklmSq5h08Hav8BA=="],
"@autumn/server/ink": ["ink@6.7.0", "", { "dependencies": { "@alcalzone/ansi-tokenize": "^0.2.4", "ansi-escapes": "^7.3.0", "ansi-styles": "^6.2.1", "auto-bind": "^5.0.1", "chalk": "^5.6.0", "cli-boxes": "^3.0.0", "cli-cursor": "^4.0.0", "cli-truncate": "^5.1.1", "code-excerpt": "^4.0.0", "es-toolkit": "^1.39.10", "indent-string": "^5.0.0", "is-in-ci": "^2.0.0", "patch-console": "^2.0.0", "react-reconciler": "^0.33.0", "scheduler": "^0.27.0", "signal-exit": "^3.0.7", "slice-ansi": "^7.1.0", "stack-utils": "^2.0.6", "string-width": "^8.1.1", "terminal-size": "^4.0.1", "type-fest": "^5.4.1", "widest-line": "^6.0.0", "wrap-ansi": "^9.0.0", "ws": "^8.18.0", "yoga-layout": "~3.2.1" }, "peerDependencies": { "@types/react": ">=19.0.0", "react": ">=19.0.0", "react-devtools-core": "^6.1.2" }, "optionalPeers": ["@types/react", "react-devtools-core"] }, "sha512-dhB16KfdTO8yYwF2K0E4wPXpL88tdrjjB6w44AZ0ljSktYoUQQcxccq9KL1vpRhk8JIa0A7B7zvjajHqI42teA=="],
"@autumn/shared/@date-fns/utc": ["@date-fns/utc@2.1.0", "", {}, "sha512-176grgAgU2U303rD2/vcOmNg0kGPbhzckuH1TEP2al7n0AQipZIy9P15usd2TKQCG1g+E1jX/ZVQSzs4sUDwgA=="],
@@ -5455,10 +5386,6 @@
"@reduxjs/toolkit/immer": ["immer@11.1.4", "", {}, "sha512-XREFCPo6ksxVzP4E0ekD5aMdf8WMwmdNaz6vuvxgI40UaEiu6q3p8X52aU6GdyvLY3XXX/8R7JOTXStz/nBbRw=="],
"@remix-run/node/cookie-signature": ["cookie-signature@1.2.2", "", {}, "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg=="],
"@remix-run/web-stream/web-streams-polyfill": ["web-streams-polyfill@3.3.3", "", {}, "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw=="],
"@sentry-internal/browser-utils/@sentry/core": ["@sentry/core@10.39.0", "", {}, "sha512-xCLip2mBwCdRrvXHtVEULX0NffUTYZZBhEUGht0WFL+GNdNQ7gmBOGOczhZlrf2hgFFtDO0fs1xiP9bqq5orEQ=="],
"@sentry-internal/feedback/@sentry/core": ["@sentry/core@10.39.0", "", {}, "sha512-xCLip2mBwCdRrvXHtVEULX0NffUTYZZBhEUGht0WFL+GNdNQ7gmBOGOczhZlrf2hgFFtDO0fs1xiP9bqq5orEQ=="],
@@ -5553,8 +5480,6 @@
"@stoplight/yaml/@stoplight/types": ["@stoplight/types@14.1.1", "", { "dependencies": { "@types/json-schema": "^7.0.4", "utility-types": "^3.10.0" } }, "sha512-/kjtr+0t0tjKr+heVfviO9FrU/uGLc+QNX3fHJc19xsCNYqU7lVhaXxDmEID9BZTjG+/r9pK9xP/xU02XGg65g=="],
"@supabase/ssr/cookie": ["cookie@1.1.1", "", {}, "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ=="],
"@tailwindcss/node/magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="],
"@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.8.1", "", { "dependencies": { "@emnapi/wasi-threads": "1.1.0", "tslib": "^2.4.0" }, "bundled": true }, "sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg=="],
@@ -5643,12 +5568,8 @@
"autumn-js/@types/react": ["@types/react@19.2.14", "", { "dependencies": { "csstype": "^3.2.2" } }, "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w=="],
"autumn-js/express": ["express@5.2.1", "", { "dependencies": { "accepts": "^2.0.0", "body-parser": "^2.2.1", "content-disposition": "^1.0.0", "content-type": "^1.0.5", "cookie": "^0.7.1", "cookie-signature": "^1.2.1", "debug": "^4.4.0", "depd": "^2.0.0", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "finalhandler": "^2.1.0", "fresh": "^2.0.0", "http-errors": "^2.0.0", "merge-descriptors": "^2.0.0", "mime-types": "^3.0.0", "on-finished": "^2.4.1", "once": "^1.4.0", "parseurl": "^1.3.3", "proxy-addr": "^2.0.7", "qs": "^6.14.0", "range-parser": "^1.2.1", "router": "^2.2.0", "send": "^1.1.0", "serve-static": "^2.2.0", "statuses": "^2.0.1", "type-is": "^2.0.1", "vary": "^1.1.2" } }, "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw=="],
"autumn-js/react-dom": ["react-dom@19.2.4", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.4" } }, "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ=="],
"autumn-js/stripe": ["stripe@18.5.0", "", { "dependencies": { "qs": "^6.11.0" }, "peerDependencies": { "@types/node": ">=12.x.x" }, "optionalPeers": ["@types/node"] }, "sha512-Hp+wFiEQtCB0LlNgcFh5uVyKznpDjzyUZ+CNVEf+I3fhlYvh7rZruIg+jOwzJRCpy0ZTPMjlzm7J2/M2N6d+DA=="],
"autumn-js/zod": ["zod@4.3.6", "", {}, "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg=="],
"better-auth/@better-auth/telemetry": ["@better-auth/telemetry@1.4.12", "", { "dependencies": { "@better-auth/utils": "0.3.0", "@better-fetch/fetch": "1.1.21" }, "peerDependencies": { "@better-auth/core": "1.4.12" } }, "sha512-4q504Og42PzkUbZjXDt+FyeYaS0WZmAlEOC3nbBCZDObTVCRUnGgJW52B2maJ7BCVvAQgBGLEeQmQzU5+63J0A=="],
@@ -5697,8 +5618,6 @@
"cheerio/htmlparser2": ["htmlparser2@10.1.0", "", { "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.3", "domutils": "^3.2.2", "entities": "^7.0.1" } }, "sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ=="],
"cheerio/undici": ["undici@7.22.0", "", {}, "sha512-RqslV2Us5BrllB+JeiZnK4peryVTndy9Dnqq62S3yYRRTj0tFQCwEniUy2167skdGOy3vqRzEvl1Dm4sV2ReDg=="],
"chevrotain-allstar/chevrotain": ["chevrotain@11.0.3", "", { "dependencies": { "@chevrotain/cst-dts-gen": "11.0.3", "@chevrotain/gast": "11.0.3", "@chevrotain/regexp-to-ast": "11.0.3", "@chevrotain/types": "11.0.3", "@chevrotain/utils": "11.0.3", "lodash-es": "4.17.21" } }, "sha512-ci2iJH6LeIkvP9eJW6gpueU8cnZhv85ELY8w8WiFtNjMHA5ad6pQLaJo9mEly/9qUyCpvqX8/POVUTf18/HFdw=="],
"clean-stack/escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="],
@@ -5731,8 +5650,6 @@
"eciesjs/@noble/hashes": ["@noble/hashes@1.8.0", "", {}, "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A=="],
"elysia/cookie": ["cookie@1.1.1", "", {}, "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ=="],
"encoding-sniffer/iconv-lite": ["iconv-lite@0.6.3", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw=="],
"engine.io/@types/node": ["@types/node@25.2.3", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-m0jEgYlYz+mDJZ2+F4v8D1AyQb+QzsNqRuI7xg1VQX/KlKS0qT9r1Mo16yo5F/MtifXFgaofIFsdFMox2SxIbQ=="],
@@ -6041,6 +5958,8 @@
"@asyncapi/parser/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="],
"@autumn/server/autumn-js/zod": ["zod@4.3.6", "", {}, "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg=="],
"@autumn/server/ink/@alcalzone/ansi-tokenize": ["@alcalzone/ansi-tokenize@0.2.5", "", { "dependencies": { "ansi-styles": "^6.2.1", "is-fullwidth-code-point": "^5.0.0" } }, "sha512-3NX/MpTdroi0aKz134A6RC2Gb2iXVECN4QaAXnvCIxxIm3C3AVB1mkUe8NaaiyvOpDfsrqWhYtj+Q6a62RrTsw=="],
"@autumn/server/ink/cli-truncate": ["cli-truncate@5.1.1", "", { "dependencies": { "slice-ansi": "^7.1.0", "string-width": "^8.0.0" } }, "sha512-SroPvNHxUnk+vIW/dOSfNqdy1sPEFkrTk6TUtqLCnBlo3N7TNYYkzzN7uSD6+jVjrdO4+p8nH7JzH6cIvUem6A=="],
@@ -6351,8 +6270,6 @@
"@langchain/langgraph-sdk/p-queue/p-timeout": ["p-timeout@7.0.1", "", {}, "sha512-AxTM2wDGORHGEkPCt8yqxOTMgpfbEHqF51f/5fJCmwFC3C/zNcGT63SymH2ttOAaiIws2zVg4+izQCjrakcwHg=="],
"@libsql/hrana-client/node-fetch/data-uri-to-buffer": ["data-uri-to-buffer@4.0.1", "", {}, "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A=="],
"@mintlify/cli/ink/@alcalzone/ansi-tokenize": ["@alcalzone/ansi-tokenize@0.2.5", "", { "dependencies": { "ansi-styles": "^6.2.1", "is-fullwidth-code-point": "^5.0.0" } }, "sha512-3NX/MpTdroi0aKz134A6RC2Gb2iXVECN4QaAXnvCIxxIm3C3AVB1mkUe8NaaiyvOpDfsrqWhYtj+Q6a62RrTsw=="],
"@mintlify/cli/ink/chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="],
@@ -6607,26 +6524,6 @@
"autumn-js/@types/node/undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="],
"autumn-js/express/accepts": ["accepts@2.0.0", "", { "dependencies": { "mime-types": "^3.0.0", "negotiator": "^1.0.0" } }, "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng=="],
"autumn-js/express/body-parser": ["body-parser@2.2.2", "", { "dependencies": { "bytes": "^3.1.2", "content-type": "^1.0.5", "debug": "^4.4.3", "http-errors": "^2.0.0", "iconv-lite": "^0.7.0", "on-finished": "^2.4.1", "qs": "^6.14.1", "raw-body": "^3.0.1", "type-is": "^2.0.1" } }, "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA=="],
"autumn-js/express/content-disposition": ["content-disposition@1.0.1", "", {}, "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q=="],
"autumn-js/express/cookie-signature": ["cookie-signature@1.2.2", "", {}, "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg=="],
"autumn-js/express/finalhandler": ["finalhandler@2.1.1", "", { "dependencies": { "debug": "^4.4.0", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "on-finished": "^2.4.1", "parseurl": "^1.3.3", "statuses": "^2.0.1" } }, "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA=="],
"autumn-js/express/fresh": ["fresh@2.0.0", "", {}, "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A=="],
"autumn-js/express/merge-descriptors": ["merge-descriptors@2.0.0", "", {}, "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g=="],
"autumn-js/express/send": ["send@1.2.1", "", { "dependencies": { "debug": "^4.4.3", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "fresh": "^2.0.0", "http-errors": "^2.0.1", "mime-types": "^3.0.2", "ms": "^2.1.3", "on-finished": "^2.4.1", "range-parser": "^1.2.1", "statuses": "^2.0.2" } }, "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ=="],
"autumn-js/express/serve-static": ["serve-static@2.2.1", "", { "dependencies": { "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "parseurl": "^1.3.3", "send": "^1.2.0" } }, "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw=="],
"autumn-js/express/type-is": ["type-is@2.0.1", "", { "dependencies": { "content-type": "^1.0.5", "media-typer": "^1.1.0", "mime-types": "^3.0.0" } }, "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw=="],
"autumn-js/react-dom/react": ["react@19.2.4", "", {}, "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ=="],
"autumn-js/react-dom/scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="],
@@ -6853,8 +6750,6 @@
"send/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="],
"shadcn/node-fetch/data-uri-to-buffer": ["data-uri-to-buffer@4.0.1", "", {}, "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A=="],
"shadcn/open/wsl-utils": ["wsl-utils@0.3.1", "", { "dependencies": { "is-wsl": "^3.1.0", "powershell-utils": "^0.1.0" } }, "sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg=="],
"string-width-cjs/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
@@ -7085,8 +6980,6 @@
"@mintlify/previewing/ink/react-reconciler/scheduler": ["scheduler@0.26.0", "", {}, "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA=="],
"@mintlify/previewing/socket.io/engine.io/@types/cookie": ["@types/cookie@0.4.1", "", {}, "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q=="],
"@mintlify/previewing/socket.io/engine.io/@types/node": ["@types/node@25.2.3", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-m0jEgYlYz+mDJZ2+F4v8D1AyQb+QzsNqRuI7xg1VQX/KlKS0qT9r1Mo16yo5F/MtifXFgaofIFsdFMox2SxIbQ=="],
"@mintlify/previewing/socket.io/engine.io/cookie": ["cookie@0.4.2", "", {}, "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA=="],
@@ -7143,18 +7036,6 @@
"@ts-morph/common/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.2", "", { "dependencies": { "jackspeak": "^4.2.3" } }, "sha512-x0K50QvKQ97fdEz2kPehIerj+YTeptKF9hyYkKf6egnwmMWAkADiO0QCzSp0R5xN8FTZgYaBfSaue46Ej62nMg=="],
"autumn-js/express/accepts/negotiator": ["negotiator@1.0.0", "", {}, "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg=="],
"autumn-js/express/body-parser/iconv-lite": ["iconv-lite@0.7.2", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw=="],
"autumn-js/express/body-parser/raw-body": ["raw-body@3.0.2", "", { "dependencies": { "bytes": "~3.1.2", "http-errors": "~2.0.1", "iconv-lite": "~0.7.0", "unpipe": "~1.0.0" } }, "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA=="],
"autumn-js/express/type-is/media-typer": ["media-typer@1.1.0", "", {}, "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw=="],
"google-auth-library/gaxios/node-fetch/data-uri-to-buffer": ["data-uri-to-buffer@4.0.1", "", {}, "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A=="],
"gtoken/gaxios/node-fetch/data-uri-to-buffer": ["data-uri-to-buffer@4.0.1", "", {}, "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A=="],
"log-update/cli-cursor/restore-cursor/onetime": ["onetime@7.0.0", "", { "dependencies": { "mimic-function": "^5.0.0" } }, "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ=="],
"log-update/cli-cursor/restore-cursor/signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="],

View File

@@ -1,16 +1,16 @@
lockVersion: 2.0.0
id: 05940b80-1ef8-40f4-9878-822fb2792070
management:
docChecksum: 83e7719406bc862f49ed389237003f2d
docChecksum: 496841b4a90d1a69cc9da5b759f85137
docVersion: 2.1.0
speakeasyVersion: 1.719.0
generationVersion: 2.824.1
releaseVersion: 0.4.15
configChecksum: 149bd5a3b8d85cc19ba9f44c89c8199c
releaseVersion: 0.4.16
configChecksum: 211b7870a80557cf24e27f54f43eaca2
persistentEdits:
generation_id: cd600ce0-3c71-4cd6-acd6-a00b5ff53e58
pristine_commit_hash: 788671e0c9c187d2659e6e3272dd0540455ec8ac
pristine_tree_hash: f35aa49e205305de977c182f12035559a2cb1419
generation_id: 8230bcef-cdfb-4dd0-b30f-4d655a695c5a
pristine_commit_hash: 204e2568a0f2581995a26c7fa8e67f12a54c7a9d
pristine_tree_hash: cd3bf981c9b772589240122e0a0be99572395a80
features:
python:
additionalDependencies: 1.0.0
@@ -1885,8 +1885,8 @@ trackedFiles:
pristine_git_object: 5650f49e06066f8a1338afdbc0e155f5277152df
pyproject.toml:
id: 5d07e7d72637
last_write_checksum: sha1:830fd3b1f4f990f8bee5e6cb47d551f1b2121fc3
pristine_git_object: 7edc2f3dcefaf2aa8e7ef11eb3e3ebefe181924c
last_write_checksum: sha1:38bae71ae83e0aac07f8d22e581c5b862521f8ec
pristine_git_object: 8788d172ee07d9252f679daf43bf0ff6deb770da
scripts/publish.sh:
id: fe273b08f514
last_write_checksum: sha1:adc9b741c12ad1591ab4870eabe20f0d0a86cd1a
@@ -1909,8 +1909,8 @@ trackedFiles:
pristine_git_object: 3e604651c1eae73d815b276806e73b2f1334bb79
src/autumn_sdk/_version.py:
id: a98babfdf4fc
last_write_checksum: sha1:599827328cb4ef279014cf22c02c0ee217a5f9d0
pristine_git_object: 9687a698fad72ee9e39c53c834dc11edcd6d1108
last_write_checksum: sha1:830a760d87a75f10a5ecd1b11cf50dc944ee2236
pristine_git_object: cd8aa447fd525660f52fe04b608134cb18f607c3
src/autumn_sdk/balances.py:
id: 0a15be654dad
last_write_checksum: sha1:bcef18a651842ffe96a5a72f608c4c37e2443bf7
@@ -2141,8 +2141,8 @@ trackedFiles:
pristine_git_object: fad6e0b0279e58ee1a55fd5a813daef574e70ccb
src/autumn_sdk/sdkconfiguration.py:
id: e65df2e44fc0
last_write_checksum: sha1:9cd4e2b7d75cbc01d6c7d1c9e676a48ea85c5c22
pristine_git_object: 1c6017c3d909b9e3f4d9a7e53d571bc4557da0d1
last_write_checksum: sha1:233b710dff940202f00e389e0c8fa6a33f6ae7b4
pristine_git_object: b76dee0b6f0c3cccc33d30e02699340d8a98ba9d
src/autumn_sdk/types/__init__.py:
id: 5be951fe5e8d
last_write_checksum: sha1:140ebdd01a46f92ffc710c52c958c4eba3cf68ed

View File

@@ -30,7 +30,7 @@ generation:
generateNewTests: true
skipResponseBodyAssertions: false
python:
version: 0.4.15
version: 0.4.16
additionalDependencies:
dev: {}
main: {}

View File

@@ -405,7 +405,7 @@ from autumn_sdk import Autumn
with Autumn(
server_url="http://localhost:8080",
server_url="https://api.useautumn.com",
x_api_version="2.1",
secret_key="<YOUR_BEARER_TOKEN_HERE>",
) as autumn:

View File

@@ -1,6 +1,6 @@
[project]
name = "autumn-sdk"
version = "0.4.15"
version = "0.4.16"
description = "Python SDK for the Autumn billing API"
authors = [{ name = "Autumn" },]
readme = "README.md"

View File

@@ -3,10 +3,10 @@
import importlib.metadata
__title__: str = "autumn-sdk"
__version__: str = "0.4.15"
__version__: str = "0.4.16"
__openapi_doc_version__: str = "2.1.0"
__gen_version__: str = "2.824.1"
__user_agent__: str = "speakeasy-sdk/python 0.4.15 2.824.1 2.1.0 autumn-sdk"
__user_agent__: str = "speakeasy-sdk/python 0.4.16 2.824.1 2.1.0 autumn-sdk"
try:
if __package__ is not None:

View File

@@ -17,7 +17,7 @@ from typing import Callable, Dict, Optional, Tuple, Union
SERVERS = [
"http://localhost:8080",
"https://api.useautumn.com",
# Production server
]
"""Contains the list of servers available to the SDK"""

View File

@@ -44,7 +44,7 @@ wheels = [
[[package]]
name = "autumn-sdk"
version = "0.4.15"
version = "0.4.16"
source = { editable = "." }
dependencies = [
{ name = "httpcore" },

7
others/python-test/.gitignore vendored Normal file
View File

@@ -0,0 +1,7 @@
.venv/
__pycache__/
*.pyc
.env
.env.*
!.env.example
.mypy_cache/

View File

@@ -80,7 +80,13 @@
"api": "cd packages/openapi && bun generate",
"docs:pull": "bun -F @autumn/docs pull",
"docs:dev": "bun -F @autumn/docs dev",
"docs:build": "bun -F @autumn/docs build"
"docs:build": "bun -F @autumn/docs build",
"ts": "bun -F @autumn/server ts && bun -F autumn-js ts",
"js:ts": "bun -F autumn-js ts",
"js:build": "bun -F @useautumn/sdk build && bun -F autumn-js build",
"js:publish": "bun js:build && cd packages/autumn-js && npm publish",
"js:publish-beta": "bun js:build && cd packages/autumn-js && npm publish --tag beta",
"js:publish-dry": "bun js:build && cd packages/autumn-js && npm publish --dry-run"
},
"dependencies": {
"@aws-sdk/client-sqs": "^3.985.0",

View File

@@ -1,63 +1,71 @@
{
"name": "autumn-js",
"description": "Autumn JS Library",
"version": "0.1.40",
"version": "1.0.0-beta.1",
"repository": "github:useautumn/autumn-js",
"homepage": "https://docs.useautumn.com",
"main": "./dist/sdk/index.js",
"module": "./dist/sdk/index.mjs",
"types": "./dist/sdk/index.d.ts",
"files": [
"dist",
"README.md",
"LICENSE.md",
"tsup.config.ts"
"LICENSE.md"
],
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"ts": "bunx tsgo --noEmit --skipLibCheck",
"build": "rm -rf dist && tsup",
"build:backend": "tsup \"src/libraries/backend/**/*.ts\" --format cjs,esm --clean=false --outDir=\"./dist/libraries/backend\"",
"build:cli": "tsup src/cli/index.ts --format cjs --outDir dist/cli",
"publish-beta": "pnpm publish --tag beta",
"dev": "nodemon --watch src --ext ts,tsx --exec \"tsup --config tsup.dev.config.ts\"",
"cli": "tsx src/cli/index.ts",
"test-cli": "node ./dist/cli/cli.mjs"
"prepublishOnly": "bun run build"
},
"module": "./dist/sdk/index.mjs",
"types": "./dist/sdk/index.d.ts",
"exports": {
".": {
"types": "./dist/sdk/index.d.ts",
"require": "./dist/sdk/index.js",
"import": "./dist/sdk/index.mjs"
},
"./react": {
"types": "./dist/react/index.d.ts",
"require": "./dist/react/index.js",
"import": "./dist/react/index.mjs"
},
"./backend": {
"types": "./dist/backend/index.d.ts",
"require": "./dist/backend/index.js",
"import": "./dist/backend/index.mjs"
},
"./backend/next": {
"types": "./dist/backend/adapters/next.d.ts",
"require": "./dist/backend/adapters/next.js",
"import": "./dist/backend/adapters/next.mjs"
},
"./backend/hono": {
"types": "./dist/backend/adapters/hono.d.ts",
"require": "./dist/backend/adapters/hono.js",
"import": "./dist/backend/adapters/hono.mjs"
},
"./react": {
"types": "./dist/react/index.d.ts",
"require": "./dist/react/index.js",
"import": "./dist/react/index.mjs"
"./backend/next": {
"types": "./dist/backend/adapters/next.d.ts",
"require": "./dist/backend/adapters/next.js",
"import": "./dist/backend/adapters/next.mjs"
},
"./better-auth": {
"types": "./dist/better-auth/index.d.ts",
"require": "./dist/better-auth/index.js",
"import": "./dist/better-auth/index.mjs"
},
"./better-auth/client": {
"types": "./dist/better-auth/client.d.ts",
"require": "./dist/better-auth/client.js",
"import": "./dist/better-auth/client.mjs"
}
},
"typesVersions": {
"*": {
"react": [
"./dist/react/index.d.ts"
],
"backend": [
"./dist/backend/index.d.ts"
],
"backend/hono": [
"./dist/backend/adapters/hono.d.ts"
],
"backend/next": [
"./dist/backend/adapters/next.d.ts"
],
"better-auth": [
"./dist/better-auth/index.d.ts"
]
}
},
"keywords": [
@@ -67,34 +75,28 @@
],
"author": "John Yeo",
"license": "MIT",
"dependencies": {
"query-string": "^9.2.2",
"rou3": "^0.6.1",
"zod": "^4.0.0"
},
"devDependencies": {
"@useautumn/sdk": "workspace:*",
"@tanstack/react-query": "catalog:",
"@remix-run/node": "^2.16.6",
"@supabase/ssr": "^0.6.1",
"@tanstack/react-start": "^1.120.5",
"@types/express": "^5.0.1",
"@types/node": "^22.15.32",
"@types/react": "^19",
"convex": "^1.25.4",
"elysia": "^1.3.5",
"esbuild-plugin-path-alias": "^1.0.7",
"express": "^5.1.0",
"fastify": "^5.3.3",
"hono": "^4.7.9",
"next": "^15.2.3",
"nodemon": "^3.1.10",
"react-dom": "^19.1.0",
"stripe": "^18.3.0",
"tsup": "^8.4.0",
"tsgo": "catalog:",
"tsx": "^4.19.3",
"typescript": "^5.8.3"
},
"peerDependencies": {
"@tanstack/react-query": "^5.0.0",
"better-auth": "^1.3.17",
"better-call": "^1.0.12",
"convex": "^1.25.4",
"react": "^18.0.0 || ^19.0.0"
},
"peerDependenciesMeta": {
@@ -110,58 +112,5 @@
"better-call": {
"optional": true
}
},
"dependencies": {
"@useautumn/sdk": "workspace:*",
"query-string": "^9.2.2",
"rou3": "^0.6.1",
"swr": "^2.3.3",
"zod": "^4.0.0"
},
"typesVersions": {
"*": {
"backend": [
"./dist/backend/index.d.ts"
],
"backend/next": [
"./dist/backend/adapters/next.d.ts"
],
"backend/hono": [
"./dist/backend/adapters/hono.d.ts"
],
"backend/elysia": [
"./dist/backend/adapters/elysia.d.ts"
],
"next": [
"./dist/libraries/backend/next.d.ts"
],
"hono": [
"./dist/libraries/backend/hono.d.ts"
],
"express": [
"./dist/libraries/backend/express.d.ts"
],
"fastify": [
"./dist/libraries/backend/fastify.d.ts"
],
"tanstack": [
"./dist/libraries/backend/tanstack.d.ts"
],
"react": [
"./dist/react/index.d.ts"
],
"better-auth": [
"./dist/better-auth/index.d.ts"
],
"better-auth/client": [
"./dist/better-auth/client.d.ts"
],
"elysia": [
"./dist/libraries/backend/elysia.d.ts"
],
"supabase": [
"./dist/libraries/backend/supabase.d.ts"
]
}
}
}

View File

@@ -57,6 +57,18 @@ export const routeConfigs: RouteDefinition<RouteName>[] = [
sdkMethod: (autumn, args) => autumn.billing.attach(args),
bodySchema: attachParamsSchema,
},
{
route: "previewAttach",
sdkMethod: (autumn, args) => autumn.billing.previewAttach(args),
},
{
route: "updateSubscription",
sdkMethod: (autumn, args) => autumn.billing.update(args),
},
{
route: "previewUpdateSubscription",
sdkMethod: (autumn, args) => autumn.billing.previewUpdate(args),
},
{
route: "openCustomerPortal",
sdkMethod: (autumn, args) => autumn.billing.openCustomerPortal(args),

View File

@@ -7,6 +7,9 @@ import type { BackendResult } from "./responseTypes";
export const ROUTE_NAMES = {
getOrCreateCustomer: "getOrCreateCustomer",
attach: "attach",
previewAttach: "previewAttach",
updateSubscription: "updateSubscription",
previewUpdateSubscription: "previewUpdateSubscription",
openCustomerPortal: "openCustomerPortal",
createReferralCode: "createReferralCode",
redeemReferralCode: "redeemReferralCode",

View File

@@ -47,7 +47,7 @@ export async function autumnHandler(
customerData,
}),
secretKey: clientOptions?.secretKey,
baseURL: clientOptions?.baseURL,
autumnURL: clientOptions?.baseURL,
pathPrefix,
routes,
});

View File

@@ -35,6 +35,12 @@ export function autumn(options: AutumnOptions = {}): AutumnPlugin {
handleRoute,
),
attach: createAutumnEndpoint("attach", handleRoute),
previewAttach: createAutumnEndpoint("previewAttach", handleRoute),
updateSubscription: createAutumnEndpoint("updateSubscription", handleRoute),
previewUpdateSubscription: createAutumnEndpoint(
"previewUpdateSubscription",
handleRoute,
),
openCustomerPortal: createAutumnEndpoint("openCustomerPortal", handleRoute),
createReferralCode: createAutumnEndpoint("createReferralCode", handleRoute),
redeemReferralCode: createAutumnEndpoint("redeemReferralCode", handleRoute),

View File

@@ -65,7 +65,7 @@ export const createHandleBetterAuthRoute = ({
identify,
}),
secretKey,
baseURL,
autumnURL: baseURL,
});
};
};

View File

@@ -1,11 +1,14 @@
import type {
AggregateEventsResponse,
BillingAttachResponse,
BillingUpdateResponse,
CreateReferralCodeResponse,
Customer,
ListEventsResponse,
ListPlansResponse,
OpenCustomerPortalResponse,
PreviewAttachResponse,
PreviewUpdateResponse,
RedeemReferralCodeResponse,
} from "@useautumn/sdk";
import type { IAutumnClient } from "./IAutumnClient";
@@ -38,6 +41,21 @@ export const createAutumnClient = (
route: "attach",
body: params,
}),
previewAttach: (params) =>
http.request<PreviewAttachResponse>({
route: "previewAttach",
body: params,
}),
updateSubscription: (params) =>
http.request<BillingUpdateResponse>({
route: "updateSubscription",
body: params,
}),
previewUpdateSubscription: (params) =>
http.request<PreviewUpdateResponse>({
route: "previewUpdateSubscription",
body: params,
}),
openCustomerPortal: (params) =>
http.request<OpenCustomerPortalResponse>({
route: "openCustomerPortal",

View File

@@ -1,11 +1,14 @@
import type {
AggregateEventsResponse,
BillingAttachResponse,
BillingUpdateResponse,
CreateReferralCodeResponse,
Customer,
ListEventsResponse,
ListPlansResponse,
OpenCustomerPortalResponse,
PreviewAttachResponse,
PreviewUpdateResponse,
RedeemReferralCodeResponse,
} from "@useautumn/sdk";
import type {
@@ -15,7 +18,10 @@ import type {
GetOrCreateCustomerClientParams,
ListEventsParams,
OpenCustomerPortalParams,
PreviewAttachParams,
PreviewUpdateSubscriptionParams,
RedeemReferralCodeParams,
UpdateSubscriptionParams,
} from "../../types";
/** Client interface matching backend RPC routes */
@@ -24,6 +30,15 @@ export interface IAutumnClient {
params?: GetOrCreateCustomerClientParams,
) => Promise<Customer | null>;
attach: (params: AttachParams) => Promise<BillingAttachResponse>;
previewAttach: (
params: PreviewAttachParams,
) => Promise<PreviewAttachResponse>;
updateSubscription: (
params: UpdateSubscriptionParams,
) => Promise<BillingUpdateResponse>;
previewUpdateSubscription: (
params: PreviewUpdateSubscriptionParams,
) => Promise<PreviewUpdateResponse>;
openCustomerPortal: (
params: OpenCustomerPortalParams,
) => Promise<OpenCustomerPortalResponse>;

View File

@@ -1,4 +1,4 @@
import type { BalancesCheckResponse, Customer } from "@useautumn/sdk";
import type { CheckResponse, Customer } from "@useautumn/sdk";
import type { ClientCheckParams } from "../../../types/params";
import { balanceToAllowed } from "./check/balanceToAllowed";
import { customerToFeatures } from "./check/customerToFeatures";
@@ -70,7 +70,7 @@ const getFeatureCheckResponse = ({
}: {
customer: Customer;
params: ClientCheckParams;
}): BalancesCheckResponse => {
}): CheckResponse => {
const { featureId, requiredBalance = 1 } = params;
const features = customerToFeatures({ customer });
@@ -118,7 +118,7 @@ const getFeatureCheckResponse = ({
customerId: customer.id ?? "",
entityId: params.entityId ?? null,
requiredBalance: requiredBalanceToUse,
balance: balanceToUse as BalancesCheckResponse["balance"],
balance: balanceToUse as CheckResponse["balance"],
};
};
@@ -128,7 +128,7 @@ export const getLocalCheckResponse = ({
}: {
customer: Customer | null;
params: ClientCheckParams;
}): BalancesCheckResponse => {
}): CheckResponse => {
if (!customer) {
return {
allowed: false,

View File

@@ -2,15 +2,21 @@
import type {
BillingAttachResponse,
BillingUpdateResponse,
CheckResponse,
Customer,
OpenCustomerPortalResponse,
PreviewAttachResponse,
PreviewUpdateResponse,
} from "@useautumn/sdk";
import { useCallback } from "react";
import type {
AttachParams,
CheckParams,
OpenCustomerPortalParams,
PreviewAttachParams,
PreviewUpdateSubscriptionParams,
UpdateSubscriptionParams,
} from "../../../types";
import type { IAutumnClient } from "../../client/IAutumnClient";
import { getLocalCheckResponse } from "./getLocalCheckResponse";
@@ -43,14 +49,10 @@ export const useCustomerActions = ({
}) => {
const attach = useCallback(
async (params: AttachParams): Promise<BillingAttachResponse> => {
const response = await client
.attach({
...params,
successUrl: window.location.href,
})
.then((response) => {
return response;
});
const response = await client.attach({
...params,
successUrl: params.successUrl ?? window.location.href,
});
if (response.paymentUrl) {
redirectToUrl({
@@ -63,6 +65,39 @@ export const useCustomerActions = ({
[client],
);
const previewAttach = useCallback(
async (params: PreviewAttachParams): Promise<PreviewAttachResponse> => {
return client.previewAttach(params);
},
[client],
);
const updateSubscription = useCallback(
async (
params: UpdateSubscriptionParams,
): Promise<BillingUpdateResponse> => {
const response = await client.updateSubscription(params);
if (response.paymentUrl) {
redirectToUrl({
url: response.paymentUrl,
openInNewTab: params.openInNewTab,
});
}
return response;
},
[client],
);
const previewUpdateSubscription = useCallback(
async (
params: PreviewUpdateSubscriptionParams,
): Promise<PreviewUpdateResponse> => {
return client.previewUpdateSubscription(params);
},
[client],
);
const check = useCallback(
(params: CheckParams): CheckResponse => {
return getLocalCheckResponse({
@@ -120,6 +155,9 @@ export const useCustomerActions = ({
return {
attach,
previewAttach,
updateSubscription,
previewUpdateSubscription,
check,
openCustomerPortal,
setupPayment,
@@ -130,5 +168,8 @@ export type {
AttachParams,
CheckParams,
OpenCustomerPortalParams,
PreviewAttachParams,
PreviewUpdateSubscriptionParams,
SetupPaymentParams,
UpdateSubscriptionParams,
};

View File

@@ -3,15 +3,21 @@
import { useQuery } from "@tanstack/react-query";
import type {
BillingAttachResponse,
BillingUpdateResponse,
CheckResponse,
Customer,
OpenCustomerPortalResponse,
PreviewAttachResponse,
PreviewUpdateResponse,
} from "@useautumn/sdk";
import type {
AttachParams,
CheckParams,
GetOrCreateCustomerClientParams,
OpenCustomerPortalParams,
PreviewAttachParams,
PreviewUpdateSubscriptionParams,
UpdateSubscriptionParams,
} from "../../types";
import { useAutumnClient } from "../AutumnContext";
import type { AutumnClientError } from "../client/AutumnClientError";
@@ -31,13 +37,56 @@ export type UseCustomerResult = HookResultWithMethods<
/** The customer object. */
data?: Customer;
/** Attaches a plan to the customer. Handles new subscriptions, upgrades and downgrades. */
/**
* Attaches a plan to the customer. Handles new subscriptions, upgrades and downgrades.
* Automatically redirects to checkout if payment is required.
* @param params - Plan ID and optional configuration (free trial, custom pricing, discounts).
* @returns Billing response with customer ID, invoice details, and payment URL if checkout required.
*/
attach: (params: AttachParams) => Promise<BillingAttachResponse>;
/** Checks feature access and balance for the customer locally (no API call). */
/**
* Previews the billing changes that would occur when attaching a plan, without making any changes.
* Use this to show customers what they will be charged before confirming a subscription change.
* @param params - Plan ID and optional configuration to preview.
* @returns Preview with line items, totals, and effective dates for the proposed changes.
*/
previewAttach: (
params: PreviewAttachParams,
) => Promise<PreviewAttachResponse>;
/**
* Updates an existing subscription. Use to modify feature quantities, cancel, or change plan configuration.
* Automatically redirects to checkout if payment is required.
* @param params - Plan ID, feature quantities, and optional cancel action.
* @returns Billing response with customer ID, invoice details, and payment URL if next action required.
*/
updateSubscription: (
params: UpdateSubscriptionParams,
) => Promise<BillingUpdateResponse>;
/**
* Previews the billing changes that would occur when updating a subscription, without making any changes.
* Use this to show customers prorated charges or refunds before confirming subscription modifications.
* @param params - Plan ID, feature quantities, and optional cancel action to preview.
* @returns Preview with line items showing prorated charges or credits for the proposed changes.
*/
previewUpdateSubscription: (
params: PreviewUpdateSubscriptionParams,
) => Promise<PreviewUpdateResponse>;
/**
* Checks feature access and balance for the customer locally (no API call).
* @param params - Feature ID to check access for.
* @returns Check response with access status and remaining balance.
*/
check: (params: UseCustomerCheckParams) => CheckResponse;
/** Opens the Stripe customer billing portal for this customer and returns the portal session response. */
/**
* Opens the Stripe customer billing portal for this customer.
* @param params - Optional return URL and configuration.
* @returns Portal session response with URL to redirect the customer.
*/
openCustomerPortal: (
params?: OpenCustomerPortalParams,
) => Promise<OpenCustomerPortalResponse>;
@@ -47,7 +96,7 @@ export type UseCustomerResult = HookResultWithMethods<
/**
* Fetches or creates an Autumn customer and provides billing actions.
*
* @returns Customer data along with `attach`, `check`, and `openCustomerPortal` methods for billing operations.
* @returns Customer data along with billing methods: `attach`, `previewAttach`, `updateSubscription`, `previewUpdateSubscription`, `check`, and `openCustomerPortal`.
*/
export const useCustomer = (
params: UseCustomerParams = {},

View File

@@ -2,14 +2,16 @@
// Types
export type {
CheckParams,
ClientAggregateEventsParams,
ClientAttachParams,
ClientCreateReferralCodeParams,
ClientGetOrCreateCustomerParams,
ClientListEventsParams,
ClientOpenCustomerPortalParams,
ClientPreviewAttachParams,
ClientPreviewUpdateSubscriptionParams,
ClientRedeemReferralCodeParams,
ClientUpdateSubscriptionParams,
ProtectedFields,
} from "../types/params";
// Context

View File

@@ -1,11 +1,14 @@
export type {
CheckParams,
ClientAggregateEventsParams as AggregateEventsParams,
ClientAttachParams as AttachParams,
ClientCheckParams as CheckParams,
ClientCreateReferralCodeParams as CreateReferralCodeParams,
ClientGetOrCreateCustomerParams as GetOrCreateCustomerClientParams,
ClientListEventsParams as ListEventsParams,
ClientOpenCustomerPortalParams as OpenCustomerPortalParams,
ClientPreviewAttachParams as PreviewAttachParams,
ClientPreviewUpdateSubscriptionParams as PreviewUpdateSubscriptionParams,
ClientRedeemReferralCodeParams as RedeemReferralCodeParams,
ClientUpdateSubscriptionParams as UpdateSubscriptionParams,
ProtectedFields,
} from "./params";

View File

@@ -1,12 +1,15 @@
import type {
BalancesCheckRequest,
BillingAttachRequest,
AttachParams,
CheckParams,
CreateReferralCodeParams,
CustomerExpand,
EventsAggregateParams,
EventsListParams,
OpenCustomerPortalParams,
PreviewAttachParams,
PreviewUpdateParams,
RedeemReferralCodeParams,
UpdateSubscriptionParams,
} from "@useautumn/sdk";
/** Fields injected by backend - stripped from frontend params */
@@ -19,11 +22,11 @@ export type ClientGetOrCreateCustomerParams = {
};
/** Check params for local balance check */
export type ClientCheckParams = Omit<BalancesCheckRequest, ProtectedFields>;
export type ClientCheckParams = Omit<CheckParams, ProtectedFields>;
/** Attach params without protected fields (for frontend use) */
export type ClientAttachParams = Omit<
BillingAttachRequest,
AttachParams,
ProtectedFields | "sendEvent" | "properties" | "withPreview"
> & {
openInNewTab?: boolean;
@@ -57,3 +60,23 @@ export type ClientAggregateEventsParams = Omit<
EventsAggregateParams,
ProtectedFields
>;
/** Preview attach params without protected fields (for frontend use) */
export type ClientPreviewAttachParams = Omit<
PreviewAttachParams,
ProtectedFields
>;
/** Update subscription params without protected fields (for frontend use) */
export type ClientUpdateSubscriptionParams = Omit<
UpdateSubscriptionParams,
ProtectedFields
> & {
openInNewTab?: boolean;
};
/** Preview update subscription params without protected fields (for frontend use) */
export type ClientPreviewUpdateSubscriptionParams = Omit<
PreviewUpdateParams,
ProtectedFields
>;

View File

@@ -16,8 +16,6 @@
"skipLibCheck": true,
"paths": {
"@/*": ["./src/libraries/react/*"],
"@/hooks/*": ["./src/libraries/react/hooks/*"],
"@useautumn/sdk": ["../sdk/dist/esm/index.d.ts"],
"@useautumn/sdk/*": ["../sdk/dist/esm/*"],
"@utils/*": ["./src/utils/*"]

View File

@@ -7,8 +7,12 @@ import { defineConfig, type Options } from "tsup";
const pathAliases = {
"@": path.resolve("./src/libraries/react"),
"@sdk": path.resolve("./src/sdk"),
"@useautumn/sdk": path.resolve("../sdk/src"),
};
// Packages to bundle (not external) - workspace packages that should be inlined
const noExternal = ["@useautumn/sdk"];
const reactConfigs: Options[] = [
// New Backend (src/backend)
{
@@ -18,6 +22,7 @@ const reactConfigs: Options[] = [
clean: false,
outDir: "./dist/backend",
external: ["react", "react/jsx-runtime", "react-dom", "next", "hono"],
noExternal,
bundle: true,
skipNodeModulesBundle: true,
esbuildOptions(options) {
@@ -37,6 +42,7 @@ const reactConfigs: Options[] = [
clean: false,
outDir: "./dist/better-auth",
external: ["better-auth", "better-call"],
noExternal,
bundle: true,
skipNodeModulesBundle: true,
esbuildOptions(options) {
@@ -61,6 +67,7 @@ const reactConfigs: Options[] = [
"react-dom",
"@tanstack/react-query",
],
noExternal,
bundle: true,
skipNodeModulesBundle: true,
banner: {
@@ -76,45 +83,22 @@ const reactConfigs: Options[] = [
};
},
},
// Legacy React (src/libraries/react) - SWR based (deprecated)
{
entry: ["src/libraries/react/**/*.{ts,tsx}"],
format: ["cjs", "esm"],
dts: true,
clean: false,
outDir: "./dist/libraries/react",
external: ["react", "react/jsx-runtime", "react-dom"],
bundle: true,
banner: {
js: '"use client";',
},
esbuildOptions(options) {
options.plugins = options.plugins || [];
options.plugins.push(alias(pathAliases));
options.define = {
...options.define,
__dirname: "import.meta.dirname",
__filename: "import.meta.filename",
};
},
},
];
export default defineConfig([
// Main SDK entry point (re-exports @useautumn/sdk)
{
format: ["cjs", "esm"],
entry: ["./src/sdk/index.ts"],
skipNodeModulesBundle: true,
noExternal,
dts: true,
shims: true,
clean: false,
outDir: "./dist/sdk",
splitting: false,
treeshake: true,
target: "es2020",
esbuildOptions(options) {
options.plugins = options.plugins || [];
options.plugins.push(alias(pathAliases));
@@ -127,44 +111,5 @@ export default defineConfig([
},
},
// GLOBAL
{
entry: ["src/utils/*.{ts,tsx}"],
format: ["cjs", "esm"],
dts: true,
clean: true,
bundle: true,
outDir: "./dist/utils", // Fixed wildcard path to specific directory
external: ["react", "react/jsx-runtime", "react-dom"],
esbuildOptions(options) {
options.plugins = options.plugins || [];
options.plugins.push(alias(pathAliases));
options.define = {
...options.define,
__dirname: "import.meta.dirname",
__filename: "import.meta.filename",
};
},
},
// SDK
// {
// entry: ["src/next/*.{ts,tsx}"],
// format: ["cjs", "esm"],
// dts: true,
// clean: false, // Don't clean on subsequent builds
// outDir: "./dist/next",
// external: ["react", "react/jsx-runtime", "react-dom"],
// bundle: false,
// esbuildOptions(options) {
// options.plugins = options.plugins || [];
// options.plugins.push(alias(pathAliases));
// options.define = {
// ...options.define,
// __dirname: "import.meta.dirname",
// __filename: "import.meta.filename",
// };
// },
// },
...reactConfigs,
]);

View File

@@ -2,7 +2,7 @@ info:
title: Autumn API
version: 2.1.0
servers:
- url: http://localhost:8080
- url: https://api.useautumn.com
description: Production server
openapi: 3.1.1
components:

View File

@@ -2,7 +2,7 @@ info:
title: Autumn API
version: 2.1.0
servers:
- url: http://localhost:8080
- url: https://api.useautumn.com
description: Production server
openapi: 3.1.1
components:

View File

@@ -101,8 +101,8 @@ async function generateOpenApiDocument(): Promise<Record<string, unknown>> {
},
servers: [
{
// url: "https://api.useautumn.com/v1",
url: "http://localhost:8080",
// url: "http://localhost:8080",
url: "https://api.useautumn.com",
description: "Production server",
},
],

View File

@@ -1,16 +1,16 @@
lockVersion: 2.0.0
id: 7b300647-cd76-49e9-bf77-7d1bf5446d66
management:
docChecksum: a79812bb91c354d45a3a47104de16c0f
docChecksum: 728e593776c0f14b63fd391fb223e079
docVersion: 2.1.0
speakeasyVersion: 1.719.0
generationVersion: 2.824.1
releaseVersion: 0.10.15
configChecksum: 00ac515822ea809846782b6ed12d9c07
releaseVersion: 0.10.16
configChecksum: ee830af0c6c545ecb6d1ae928ed35f3c
persistentEdits:
generation_id: 12abcc41-7f80-471f-9a1f-2a4553fda509
pristine_commit_hash: eb97f61473ee6dcfe732a64ea2b8d14a9f99dc5c
pristine_tree_hash: 1fe7bcc3b3d53e90d08f09c2a3c7cee26c59fdb4
generation_id: 21189aad-0241-4da1-8290-f578d27eb2f9
pristine_commit_hash: bc3fbbf951471d5b8b44b5e0dc387a4d2a37eca7
pristine_tree_hash: 69ee26ed3d67c98203f2a974eea58d5ad844af5d
features:
typescript:
additionalDependencies: 0.1.0
@@ -1912,12 +1912,12 @@ trackedFiles:
pristine_git_object: 900d545ed58929951e2208e1bec791cb264429a4
jsr.json:
id: 7f6ab7767282
last_write_checksum: sha1:b8fbee7b8701740466a06f155d40c1314751c7f3
pristine_git_object: 13504f125f055138b67addee717e17e646990d99
last_write_checksum: sha1:182aebceba2b68f8150866413e2a55501acef211
pristine_git_object: 3de4707b6302e048c32ad734b6ac48e7bc1cb583
package.json:
id: 7030d0b2f71b
last_write_checksum: sha1:b43309bf91d42f1b90c58c6a6d99e88ae32cf29b
pristine_git_object: 483f45638e291af37c19cdcead31dfcd5733a229
last_write_checksum: sha1:8a7beb2f79aaaa323ba36863961662687b924221
pristine_git_object: dc9d6585288c1089ed72f6cfc634549ca2390799
src/core.ts:
id: f431fdbcd144
last_write_checksum: sha1:f8f24a3ca09c1efb285d7a75ad3697d0128f47e2
@@ -2068,8 +2068,8 @@ trackedFiles:
pristine_git_object: 44be0eae8246521b230e8e711a88eff738fc015d
src/lib/config.ts:
id: 320761608fb3
last_write_checksum: sha1:e089fe0dd70123f1e953214e92435db3ffa8f1e8
pristine_git_object: c7ade4f8cbb6dd4a06541063fb1f5e710e60ded7
last_write_checksum: sha1:0ab3765168c2830b9c4deb8724cecb6f036d9fb2
pristine_git_object: 0c35c6ebe2ac12f5ea748cd7c505d58c310ae4cd
src/lib/dlv.ts:
id: b1988214835a
last_write_checksum: sha1:1dd3e3fbb4550c4bf31f5ef997faff355d6f3250

View File

@@ -33,7 +33,7 @@ generation:
generateNewTests: true
skipResponseBodyAssertions: false
typescript:
version: 0.10.15
version: 0.10.16
acceptHeaderEnum: false
additionalDependencies:
dependencies: {}

View File

@@ -2,7 +2,7 @@ info:
title: Autumn API
version: 2.1.0
servers:
- url: http://localhost:8080
- url: https://api.useautumn.com
description: Production server
openapi: 3.1.1
components:

View File

@@ -9,8 +9,8 @@ sources:
- 2.1.0
Autumn API Stripped:
sourceNamespace: autumn-api-stripped
sourceRevisionDigest: sha256:b8255e040f0927a81289f8b2cb29c15a532c9fa9cf556ace5635db15d1d5e3d3
sourceBlobDigest: sha256:1a567917ebff7879f182db728eb6fa3ff6270bbb46c5e546b30e758a52aa8509
sourceRevisionDigest: sha256:1ba23ac0091b999dc6c9e794a75ac9c008fb937037cfc00ee7a6e5f875f547fe
sourceBlobDigest: sha256:8b4ebac21e57944966d95f11ea03411ab45d52bd21865f11259d6da37d462db6
tags:
- latest
- 2.1.0
@@ -25,8 +25,8 @@ targets:
autumn-python:
source: Autumn API Stripped
sourceNamespace: autumn-api-stripped
sourceRevisionDigest: sha256:b8255e040f0927a81289f8b2cb29c15a532c9fa9cf556ace5635db15d1d5e3d3
sourceBlobDigest: sha256:1a567917ebff7879f182db728eb6fa3ff6270bbb46c5e546b30e758a52aa8509
sourceRevisionDigest: sha256:1ba23ac0091b999dc6c9e794a75ac9c008fb937037cfc00ee7a6e5f875f547fe
sourceBlobDigest: sha256:8b4ebac21e57944966d95f11ea03411ab45d52bd21865f11259d6da37d462db6
codeSamplesNamespace: autumn-api-python-code-samples
codeSamplesRevisionDigest: sha256:ce4215f239e65976dbfffcd7e5d76f506dc0ba33a3046a99f846502ff192fe71
workflow:

View File

@@ -1044,7 +1044,7 @@ The default server can be overridden globally by passing a URL to the `serverURL
import { Autumn } from "@useautumn/sdk";
const autumn = new Autumn({
serverURL: "http://localhost:8080",
serverURL: "https://api.useautumn.com",
xApiVersion: "2.1",
secretKey: process.env["AUTUMN_SECRET_KEY"] ?? "",
});

View File

@@ -2,7 +2,7 @@
{
"name": "@useautumn/sdk",
"version": "0.10.15",
"version": "0.10.16",
"exports": {
".": "./src/index.ts",
"./models": "./src/models/index.ts",

View File

@@ -1,6 +1,6 @@
{
"name": "@useautumn/sdk",
"version": "0.10.15",
"version": "0.10.16",
"author": "Speakeasy",
"main": "./dist/commonjs/index.js",
"module": "./dist/esm/index.js",

View File

@@ -14,7 +14,7 @@ export const ServerList = [
/**
* Production server
*/
"http://localhost:8080",
"https://api.useautumn.com",
] as const;
export type SDKOptions = {
@@ -66,7 +66,7 @@ export function serverURLFromOptions(options: SDKOptions): URL | null {
export const SDK_METADATA = {
language: "typescript",
openapiDocVersion: "2.1.0",
sdkVersion: "0.10.15",
sdkVersion: "0.10.16",
genVersion: "2.824.1",
userAgent: "speakeasy-sdk/typescript 0.10.15 2.824.1 2.1.0 @useautumn/sdk",
userAgent: "speakeasy-sdk/typescript 0.10.16 2.824.1 2.1.0 @useautumn/sdk",
} as const;