finished sdk
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -1,8 +0,0 @@
|
||||
{
|
||||
"mcpServers": {
|
||||
"mintlify": {
|
||||
"type": "http",
|
||||
"url": "https://mintlify.com/docs/mcp"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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/`.
|
||||
|
||||
281
apps/docs/SDK_DOCS_UPDATE_PLAN.md
Normal file
281
apps/docs/SDK_DOCS_UPDATE_PLAN.md
Normal 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
|
||||
@@ -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:
|
||||
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
]
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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="() => Promise<string | null>" 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<string, string>" 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>
|
||||
|
||||
|
||||
|
||||
|
||||
32
apps/docs/mintlify/react/hooks/introduction.mdx
Normal file
32
apps/docs/mintlify/react/hooks/introduction.mdx
Normal 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.
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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>
|
||||
);
|
||||
}
|
||||
```
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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`
|
||||
|
||||
|
||||
88
apps/docs/mintlify/react/hooks/useListPlans.mdx
Normal file
88
apps/docs/mintlify/react/hooks/useListPlans.mdx
Normal 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.
|
||||
100
apps/docs/mintlify/react/hooks/useReferrals.mdx
Normal file
100
apps/docs/mintlify/react/hooks/useReferrals.mdx
Normal 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`.
|
||||
@@ -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>
|
||||
|
||||
@@ -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
139
bun.lock
@@ -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=="],
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -30,7 +30,7 @@ generation:
|
||||
generateNewTests: true
|
||||
skipResponseBodyAssertions: false
|
||||
python:
|
||||
version: 0.4.15
|
||||
version: 0.4.16
|
||||
additionalDependencies:
|
||||
dev: {}
|
||||
main: {}
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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"""
|
||||
|
||||
2
others/python-sdk/uv.lock
generated
2
others/python-sdk/uv.lock
generated
@@ -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
7
others/python-test/.gitignore
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
.venv/
|
||||
__pycache__/
|
||||
*.pyc
|
||||
.env
|
||||
.env.*
|
||||
!.env.example
|
||||
.mypy_cache/
|
||||
@@ -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",
|
||||
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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),
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -47,7 +47,7 @@ export async function autumnHandler(
|
||||
customerData,
|
||||
}),
|
||||
secretKey: clientOptions?.secretKey,
|
||||
baseURL: clientOptions?.baseURL,
|
||||
autumnURL: clientOptions?.baseURL,
|
||||
pathPrefix,
|
||||
routes,
|
||||
});
|
||||
|
||||
@@ -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),
|
||||
|
||||
@@ -65,7 +65,7 @@ export const createHandleBetterAuthRoute = ({
|
||||
identify,
|
||||
}),
|
||||
secretKey,
|
||||
baseURL,
|
||||
autumnURL: baseURL,
|
||||
});
|
||||
};
|
||||
};
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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>;
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
};
|
||||
|
||||
@@ -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 = {},
|
||||
|
||||
@@ -2,14 +2,16 @@
|
||||
|
||||
// Types
|
||||
export type {
|
||||
CheckParams,
|
||||
ClientAggregateEventsParams,
|
||||
ClientAttachParams,
|
||||
ClientCreateReferralCodeParams,
|
||||
ClientGetOrCreateCustomerParams,
|
||||
ClientListEventsParams,
|
||||
ClientOpenCustomerPortalParams,
|
||||
ClientPreviewAttachParams,
|
||||
ClientPreviewUpdateSubscriptionParams,
|
||||
ClientRedeemReferralCodeParams,
|
||||
ClientUpdateSubscriptionParams,
|
||||
ProtectedFields,
|
||||
} from "../types/params";
|
||||
// Context
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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
|
||||
>;
|
||||
|
||||
@@ -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/*"]
|
||||
|
||||
@@ -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,
|
||||
]);
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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:
|
||||
|
||||
4
packages/openapi/v2.1/openapi2.1.ts
vendored
4
packages/openapi/v2.1/openapi2.1.ts
vendored
@@ -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",
|
||||
},
|
||||
],
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -33,7 +33,7 @@ generation:
|
||||
generateNewTests: true
|
||||
skipResponseBodyAssertions: false
|
||||
typescript:
|
||||
version: 0.10.15
|
||||
version: 0.10.16
|
||||
acceptHeaderEnum: false
|
||||
additionalDependencies:
|
||||
dependencies: {}
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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"] ?? "",
|
||||
});
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
{
|
||||
"name": "@useautumn/sdk",
|
||||
"version": "0.10.15",
|
||||
"version": "0.10.16",
|
||||
"exports": {
|
||||
".": "./src/index.ts",
|
||||
"./models": "./src/models/index.ts",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user