From 2a0afd979874265b423113ef20bcdff6451ac038 Mon Sep 17 00:00:00 2001 From: John Yeo Date: Thu, 19 Feb 2026 17:02:18 +0000 Subject: [PATCH] finished sdk --- .claude/rules/sdk.mdc | 12 + .mcp.json | 8 - apps/docs/CLAUDE.md | 11 + apps/docs/SDK_DOCS_UPDATE_PLAN.md | 281 ++++++++++ apps/docs/mintlify/api/openapi.yml | 2 +- apps/docs/mintlify/docs.json | 13 +- .../mintlify/react/hooks/autumn-handler.mdx | 54 +- .../mintlify/react/hooks/autumn-provider.mdx | 50 +- .../mintlify/react/hooks/introduction.mdx | 32 ++ .../react/hooks/useAggregateEvents.mdx | 4 +- .../docs/mintlify/react/hooks/useCustomer.mdx | 505 +++++------------- apps/docs/mintlify/react/hooks/useEntity.mdx | 114 ++-- .../mintlify/react/hooks/useListEvents.mdx | 18 +- .../mintlify/react/hooks/useListPlans.mdx | 88 +++ .../mintlify/react/hooks/useReferrals.mdx | 100 ++++ .../mintlify/snippets/swr-config-param.mdx | 6 +- apps/sdk-test/sdk.ts | 4 +- bun.lock | 139 +---- others/python-sdk/.speakeasy/gen.lock | 24 +- others/python-sdk/.speakeasy/gen.yaml | 2 +- others/python-sdk/README.md | 2 +- others/python-sdk/pyproject.toml | 2 +- others/python-sdk/src/autumn_sdk/_version.py | 4 +- .../src/autumn_sdk/sdkconfiguration.py | 2 +- others/python-sdk/uv.lock | 2 +- others/python-test/.gitignore | 7 + package.json | 8 +- packages/autumn-js/package.json | 131 ++--- .../src/backend/core/routes/routeConfigs.ts | 12 + .../src/backend/core/types/routeTypes.ts | 3 + packages/autumn-js/src/backend/index.ts | 2 +- packages/autumn-js/src/better-auth/index.ts | 6 + .../utils/handleBetterAuthRoute.ts | 2 +- .../src/react/client/AutumnClient.ts | 18 + .../src/react/client/IAutumnClient.ts | 15 + .../hooks/internal/getLocalCheckResponse.ts | 8 +- .../hooks/internal/useCustomerActions.ts | 57 +- .../autumn-js/src/react/hooks/useCustomer.ts | 57 +- packages/autumn-js/src/react/index.ts | 4 +- packages/autumn-js/src/types/index.ts | 5 +- packages/autumn-js/src/types/params.ts | 31 +- packages/autumn-js/tsconfig.json | 2 - packages/autumn-js/tsup.config.ts | 73 +-- packages/openapi/openapi-stripped.yml | 2 +- packages/openapi/openapi.yml | 2 +- packages/openapi/v2.1/openapi2.1.ts | 4 +- packages/sdk/.speakeasy/gen.lock | 24 +- packages/sdk/.speakeasy/gen.yaml | 2 +- packages/sdk/.speakeasy/out.openapi.yaml | 2 +- packages/sdk/.speakeasy/workflow.lock | 8 +- packages/sdk/README.md | 2 +- packages/sdk/jsr.json | 2 +- packages/sdk/package.json | 2 +- packages/sdk/src/lib/config.ts | 6 +- 54 files changed, 1104 insertions(+), 872 deletions(-) delete mode 100644 .mcp.json create mode 100644 apps/docs/SDK_DOCS_UPDATE_PLAN.md create mode 100644 apps/docs/mintlify/react/hooks/introduction.mdx create mode 100644 apps/docs/mintlify/react/hooks/useListPlans.mdx create mode 100644 apps/docs/mintlify/react/hooks/useReferrals.mdx create mode 100644 others/python-test/.gitignore diff --git a/.claude/rules/sdk.mdc b/.claude/rules/sdk.mdc index d41827bb4..bb1422178 100644 --- a/.claude/rules/sdk.mdc +++ b/.claude/rules/sdk.mdc @@ -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) diff --git a/.mcp.json b/.mcp.json deleted file mode 100644 index 6c5ed5dd2..000000000 --- a/.mcp.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "mcpServers": { - "mintlify": { - "type": "http", - "url": "https://mintlify.com/docs/mcp" - } - } -} diff --git a/apps/docs/CLAUDE.md b/apps/docs/CLAUDE.md index 662145f1c..081429a3c 100644 --- a/apps/docs/CLAUDE.md +++ b/apps/docs/CLAUDE.md @@ -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/.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/`. diff --git a/apps/docs/SDK_DOCS_UPDATE_PLAN.md b/apps/docs/SDK_DOCS_UPDATE_PLAN.md new file mode 100644 index 000000000..a58fa4c04 --- /dev/null +++ b/apps/docs/SDK_DOCS_UPDATE_PLAN.md @@ -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/.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 `` 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 diff --git a/apps/docs/mintlify/api/openapi.yml b/apps/docs/mintlify/api/openapi.yml index b446d5857..1fb95ad9f 100644 --- a/apps/docs/mintlify/api/openapi.yml +++ b/apps/docs/mintlify/api/openapi.yml @@ -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: diff --git a/apps/docs/mintlify/docs.json b/apps/docs/mintlify/docs.json index 297a5ac0f..98b4bdd2b 100644 --- a/apps/docs/mintlify/docs.json +++ b/apps/docs/mintlify/docs.json @@ -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" ] } ] diff --git a/apps/docs/mintlify/react/hooks/autumn-handler.mdx b/apps/docs/mintlify/react/hooks/autumn-handler.mdx index 7fca808ee..7ceb1804c 100644 --- a/apps/docs/mintlify/react/hooks/autumn-handler.mdx +++ b/apps/docs/mintlify/react/hooks/autumn-handler.mdx @@ -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. +## 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 - - 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. + + Function that receives the incoming request and returns customer identification data. - + - 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. - - Additional metadata about the customer that will be stored in Autumn. - - - - The customer's display name - - - - The customer's email address - - + + Additional metadata about the customer (e.g., `name`, `email`). - - 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. + + Autumn API secret key. Defaults to `AUTUMN_SECRET_KEY` environment variable. - - Override the Autumn secret key. If not provided, the handler will use the `AUTUMN_SECRET_KEY` environment variable. + + Override the Autumn API URL. Use when self-hosting. - - If true, suppresses console warnings and logs from the Autumn handler. Useful for reducing noise in production environments. + + Path prefix for routes. Defaults to `/api/autumn`. + + If true, suppresses console warnings and logs. + diff --git a/apps/docs/mintlify/react/hooks/autumn-provider.mdx b/apps/docs/mintlify/react/hooks/autumn-provider.mdx index 0ec7b4a9e..b054c8610 100644 --- a/apps/docs/mintlify/react/hooks/autumn-provider.mdx +++ b/apps/docs/mintlify/react/hooks/autumn-provider.mdx @@ -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. +## Usage + +```tsx +// app/layout.tsx +import { AutumnProvider } from "autumn-js/react"; + +export default function RootLayout({ children }) { + return ( + + + {children} + + + ); +} +``` + ## Parameters - - If true, suppresses all console warnings and logs from Autumn hooks and provider. Useful for reducing noise in production environments. + + 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. - - Optional function that returns a bearer token for authenticated requests. Use this when you need to pass the user's auth token in the Authorization header to your backend (e.g., Clerk, Supabase). + + Path prefix for Autumn routes. Defaults to `/api/autumn`, or `/api/auth/autumn` if `useBetterAuth` is true. - - Additional HTTP headers to send with each request, which can be accessed in the `autumnHandler` (e.g., for custom authentication flows). + + Use [better-auth](https://www.better-auth.com/docs/plugins/autumn) integration. Sets `pathPrefix` to `/api/auth/autumn` and `includeCredentials` to true. - - 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). + + Include credentials (cookies) in cross-origin requests. Defaults to true if `useBetterAuth` is true. - - Optional object containing additional metadata about the current customer, such as email or name. + + Custom TanStack Query client. Uses a default client if not provided. - - 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. + + If true, suppresses console warnings and logs. - - - URL for use with the [better-auth plugin](https://www.better-auth.com/docs/plugins/autumn). - - - - diff --git a/apps/docs/mintlify/react/hooks/introduction.mdx b/apps/docs/mintlify/react/hooks/introduction.mdx new file mode 100644 index 000000000..dd8bdc887 --- /dev/null +++ b/apps/docs/mintlify/react/hooks/introduction.mdx @@ -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. diff --git a/apps/docs/mintlify/react/hooks/useAggregateEvents.mdx b/apps/docs/mintlify/react/hooks/useAggregateEvents.mdx index e77c6170f..963b7f91f 100644 --- a/apps/docs/mintlify/react/hooks/useAggregateEvents.mdx +++ b/apps/docs/mintlify/react/hooks/useAggregateEvents.mdx @@ -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 - + ## Returns diff --git a/apps/docs/mintlify/react/hooks/useCustomer.mdx b/apps/docs/mintlify/react/hooks/useCustomer.mdx index 83c5f2264..f8952d158 100644 --- a/apps/docs/mintlify/react/hooks/useCustomer.mdx +++ b/apps/docs/mintlify/react/hooks/useCustomer.mdx @@ -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. ## Parameters - - Array of additional data to include in the customer response. Options include - `invoices`, `rewards`, `trials_used`, `entities`, `referrals`, `payment_method`. - - Whether to throw an error if the customer is not found. Defaults to `false`. - + + Array of additional data to include in the response. Options: `invoices`, `trials_used`, `rewards`, `entities`, `referrals`, `payment_method`, `subscriptions.plan`, `purchases.plan`, `balances.feature`. + + + + Optional [TanStack Query options](https://tanstack.com/query/latest/docs/framework/react/reference/useQuery) to customize caching and refetching behavior. + ## 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
Loading...
; return (
-

Customer Profile

-

Name: {customer?.name}

-

Email: {customer?.email}

-

Balance: {customer?.features.chat_messages?.balance}

+

Name: {data?.name}

+

Email: {data?.email}

+

Messages remaining: {data?.balances?.messages?.remaining}

); } ``` -### `checkout()` + -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. + -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 ( - ); @@ -79,151 +114,46 @@ export default function PurchaseButton() { **Parameters** - - The ID of the product being enabled. - - - A dialog that pops up to confirm the purchase (eg, for upgrades/downgrades). - See the [\](/react/components/checkout-dialog) page. - - - - The ID of the entity (eg, user seat) to attach the product to. - - - - Array of feature options to configure for the attachment. Each option contains - `featureId` (string) and `quantity` (number). - - - - Array of additional product IDs to attach simultaneously. - - - - Whether to disable free trials for this product. Only applicable if the - product has a free trial. + + The ID of the plan to attach. - URL to redirect to after successful attachment/checkout. + URL to redirect to after successful checkout. - - Additional metadata to pass onto Stripe. + + Open checkout URL in a new tab instead of redirecting. - - Pass in Stripe checkout session fields and they will be forwarded on. - - - - Whether to force the checkout flow even if the payment method already exists. - Not available for upgrades/downgrades. - - - - Whether to open the checkout URL in a new tab. - - -### `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 ( -
- Click to confirm your upgrade. Your card will be charged. - -
- ); -} -``` - -**Parameters** - - - The ID of the product to attach. - - - - The ID of the entity (eg, user seat) to attach the product to. - - - - Array of feature options to configure for the attachment. Each option contains - `featureId` (string) and `quantity` (number). - - - - Array of additional product IDs to attach simultaneously. - - - - Whether to disable free trials for this product. Only applicable if the - product has a free trial. - - - - URL to redirect to after successful attachment/checkout. - - - - Additional metadata to pass onto Stripe. - - - - Whether to force the checkout flow even if the payment method already exists. - Not available for upgrades/downgrades. - - - - Whether to open the checkout URL in a new tab. - +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). - 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. -```jsx +```tsx import { useCustomer } from "autumn-js/react"; -export default function FeatureGate({ children }) { +export default function SendMessageButton() { const { check } = useCustomer(); - return ( - - ); + const handleSend = () => { + const result = check({ featureId: "messages" }); + + if (!result.allowed) { + alert("You've run out of messages!"); + return; + } + + // Send the message... + }; + + return ; } ``` @@ -233,101 +163,29 @@ export default function FeatureGate({ children }) { The ID of the feature to check access for.
- - The ID of the product to check access for. - - - - A dialog that pops up to act as a paywall (eg, when a feature runs out). See - the [\](/react/components/paywall-dialog) page. - - - The ID of the entity (customer/user) to check access for. + The ID of the entity to check access for. - The required balance/usage amount to check against. + The required balance amount to check against. - - Whether to send an event when checking access. - +### `openCustomerPortal()` - - 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. - +Opens the Stripe customer billing portal for managing subscriptions and payment methods. -### `track()` - -Track usage events for features or analytics. - - - Tracking usage client-side is not recommended, as a user in theory could stop - script execution and mess with your tracking data. - - -```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 ; -} -``` - -**Parameters** - - - The ID of the feature to track usage for. - - - - Custom event name for tracking. - - - - The ID of the entity (customer/user) to track usage for. - - - - The value/quantity to track (e.g., number of API calls, storage used). - - - - Unique key to prevent duplicate tracking events. - - -### `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 ( - ); -} -``` - -**Parameters** - - - The ID of the product to cancel. - - - - Whether to cancel the product immediately. If false, the product will be - cancelled at the end of the billing cycle. - - - - The ID of the entity (customer/user) to cancel the product for. - - -### `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 ; -} -``` - -### `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 ; -``` - -**Parameters** - - - The ID of the entity to create. - - - - Display name for the entity. - - - - The feature ID for the entity being created. Must be a `continuous_use` - feature. + Open portal in a new tab instead of redirecting. ### `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
Loading customer data...
; - } + if (isLoading) return
Loading...
; - return
Welcome, {customer?.name}!
; + return
Welcome, {data?.name}!
; } ``` @@ -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
Error loading customer: {error.message}
; - } + if (error) return
Error: {error.message}
; + if (isLoading) return
Loading...
; - if (isLoading) { - return
Loading...
; - } - - return
Customer: {customer?.name}
; + return
Customer: {data?.name}
; +} +``` + +### `refetch()` + +Function to manually refetch the customer data. + +```tsx +import { useCustomer } from "autumn-js/react"; + +export default function CustomerWithRefresh() { + const { data, refetch } = useCustomer(); + + return ( +
+

Balance: {data?.balances?.messages?.remaining}

+ +
+ ); } ``` diff --git a/apps/docs/mintlify/react/hooks/useEntity.mdx b/apps/docs/mintlify/react/hooks/useEntity.mdx index 4af7363d7..4f143377e 100644 --- a/apps/docs/mintlify/react/hooks/useEntity.mdx +++ b/apps/docs/mintlify/react/hooks/useEntity.mdx @@ -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. @@ -15,89 +15,85 @@ The `useEntity` hook provides access to [entity data](/documentation/customers/f The ID of the entity to retrieve.
- - Array of additional data to include in the entity response. Currently supports - `invoices`. + + Optional [TanStack Query options](https://tanstack.com/query/latest/docs/framework/react/reference/useQuery) to customize caching and refetching behavior. ## 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
Loading...
; return (
-

User Profile

-

Name: {entity?.name}

-

Balance: {entity?.features.chat_messages?.balance}

+

Name: {data?.name}

+

Messages remaining: {data?.balances?.messages?.remaining}

); } ``` -### `refetch()` + -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 ; +```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 + } + } } ``` + + ### `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
Loading entity data...
; - } - - return
Entity: {entity?.name}
; -} -``` - ### `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
Error loading entity: {error.message}
; - } - - if (isLoading) { - return
Loading...
; - } - - return
Entity: {entity?.name}
; -} -``` +Function to manually refetch the entity data. diff --git a/apps/docs/mintlify/react/hooks/useListEvents.mdx b/apps/docs/mintlify/react/hooks/useListEvents.mdx index 28b581fb6..160354310 100644 --- a/apps/docs/mintlify/react/hooks/useListEvents.mdx +++ b/apps/docs/mintlify/react/hooks/useListEvents.mdx @@ -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
- + ## 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` diff --git a/apps/docs/mintlify/react/hooks/useListPlans.mdx b/apps/docs/mintlify/react/hooks/useListPlans.mdx new file mode 100644 index 000000000..022d40d4a --- /dev/null +++ b/apps/docs/mintlify/react/hooks/useListPlans.mdx @@ -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. + + + +## Parameters + + + Optional [TanStack Query options](https://tanstack.com/query/latest/docs/framework/react/reference/useQuery) to customize caching and refetching behavior. + + +## Returns + +### `data` + +Array of plan objects. + +```tsx +import { useListPlans } from "autumn-js/react"; + +export default function PlansList() { + const { data, isLoading } = useListPlans(); + + if (isLoading) return
Loading plans...
; + + return ( +
    + {data?.map((plan) => ( +
  • + {plan.name} - {plan.price ? `$${plan.price.amount}/${plan.price.interval}` : 'Free'} +
  • + ))} +
+ ); +} +``` + + + +```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 +} +``` + + + +### `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. diff --git a/apps/docs/mintlify/react/hooks/useReferrals.mdx b/apps/docs/mintlify/react/hooks/useReferrals.mdx new file mode 100644 index 000000000..cad83bce9 --- /dev/null +++ b/apps/docs/mintlify/react/hooks/useReferrals.mdx @@ -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. + + + +## Parameters + + + The ID of your referral program. + + + + Optional [TanStack Query options](https://tanstack.com/query/latest/docs/framework/react/reference/useQuery) to customize caching and refetching behavior. + + +## 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 ( +
+ + {data &&

Share this code: {data.code}

} +
+ ); +} +``` + + + +```json +{ + "code": "REF123ABC", + "customerId": "cus_123", + "createdAt": 1717000000 +} +``` + + + +### `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 ; +} +``` + +**Parameters** + + + The referral code to redeem. + + +**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`. diff --git a/apps/docs/mintlify/snippets/swr-config-param.mdx b/apps/docs/mintlify/snippets/swr-config-param.mdx index 86af58d92..3c1603cdb 100644 --- a/apps/docs/mintlify/snippets/swr-config-param.mdx +++ b/apps/docs/mintlify/snippets/swr-config-param.mdx @@ -1,3 +1,3 @@ - - Optional [SWR configuration object](https://swr.vercel.app/docs/api#options) to customize caching and revalidation behavior. Accepts a `refreshInterval` in milliseconds. - \ No newline at end of file + + 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`. + diff --git a/apps/sdk-test/sdk.ts b/apps/sdk-test/sdk.ts index 71ccde2ae..a98df4707 100644 --- a/apps/sdk-test/sdk.ts +++ b/apps/sdk-test/sdk.ts @@ -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", diff --git a/bun.lock b/bun.lock index e120136df..b30e1447f 100644 --- a/bun.lock +++ b/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=="], diff --git a/others/python-sdk/.speakeasy/gen.lock b/others/python-sdk/.speakeasy/gen.lock index 5a85a23fd..e266ddc1f 100644 --- a/others/python-sdk/.speakeasy/gen.lock +++ b/others/python-sdk/.speakeasy/gen.lock @@ -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 diff --git a/others/python-sdk/.speakeasy/gen.yaml b/others/python-sdk/.speakeasy/gen.yaml index 588772faa..b0ea85422 100644 --- a/others/python-sdk/.speakeasy/gen.yaml +++ b/others/python-sdk/.speakeasy/gen.yaml @@ -30,7 +30,7 @@ generation: generateNewTests: true skipResponseBodyAssertions: false python: - version: 0.4.15 + version: 0.4.16 additionalDependencies: dev: {} main: {} diff --git a/others/python-sdk/README.md b/others/python-sdk/README.md index 680abc477..fe9b69db3 100644 --- a/others/python-sdk/README.md +++ b/others/python-sdk/README.md @@ -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="", ) as autumn: diff --git a/others/python-sdk/pyproject.toml b/others/python-sdk/pyproject.toml index 7edc2f3dc..8788d172e 100644 --- a/others/python-sdk/pyproject.toml +++ b/others/python-sdk/pyproject.toml @@ -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" diff --git a/others/python-sdk/src/autumn_sdk/_version.py b/others/python-sdk/src/autumn_sdk/_version.py index 9687a698f..cd8aa447f 100644 --- a/others/python-sdk/src/autumn_sdk/_version.py +++ b/others/python-sdk/src/autumn_sdk/_version.py @@ -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: diff --git a/others/python-sdk/src/autumn_sdk/sdkconfiguration.py b/others/python-sdk/src/autumn_sdk/sdkconfiguration.py index 1c6017c3d..b76dee0b6 100644 --- a/others/python-sdk/src/autumn_sdk/sdkconfiguration.py +++ b/others/python-sdk/src/autumn_sdk/sdkconfiguration.py @@ -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""" diff --git a/others/python-sdk/uv.lock b/others/python-sdk/uv.lock index 3294c22de..df7ec8c62 100644 --- a/others/python-sdk/uv.lock +++ b/others/python-sdk/uv.lock @@ -44,7 +44,7 @@ wheels = [ [[package]] name = "autumn-sdk" -version = "0.4.15" +version = "0.4.16" source = { editable = "." } dependencies = [ { name = "httpcore" }, diff --git a/others/python-test/.gitignore b/others/python-test/.gitignore new file mode 100644 index 000000000..e293b901b --- /dev/null +++ b/others/python-test/.gitignore @@ -0,0 +1,7 @@ + .venv/ + __pycache__/ + *.pyc + .env + .env.* + !.env.example + .mypy_cache/ \ No newline at end of file diff --git a/package.json b/package.json index ab2aa5b7e..b67273ada 100644 --- a/package.json +++ b/package.json @@ -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", diff --git a/packages/autumn-js/package.json b/packages/autumn-js/package.json index 36a10c392..4e9453745 100644 --- a/packages/autumn-js/package.json +++ b/packages/autumn-js/package.json @@ -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" - ] - } } } diff --git a/packages/autumn-js/src/backend/core/routes/routeConfigs.ts b/packages/autumn-js/src/backend/core/routes/routeConfigs.ts index e0803d24e..d603b5245 100644 --- a/packages/autumn-js/src/backend/core/routes/routeConfigs.ts +++ b/packages/autumn-js/src/backend/core/routes/routeConfigs.ts @@ -57,6 +57,18 @@ export const routeConfigs: RouteDefinition[] = [ 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), diff --git a/packages/autumn-js/src/backend/core/types/routeTypes.ts b/packages/autumn-js/src/backend/core/types/routeTypes.ts index 0fe64622e..841517e4c 100644 --- a/packages/autumn-js/src/backend/core/types/routeTypes.ts +++ b/packages/autumn-js/src/backend/core/types/routeTypes.ts @@ -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", diff --git a/packages/autumn-js/src/backend/index.ts b/packages/autumn-js/src/backend/index.ts index f76d68ab2..d3a2879c9 100644 --- a/packages/autumn-js/src/backend/index.ts +++ b/packages/autumn-js/src/backend/index.ts @@ -47,7 +47,7 @@ export async function autumnHandler( customerData, }), secretKey: clientOptions?.secretKey, - baseURL: clientOptions?.baseURL, + autumnURL: clientOptions?.baseURL, pathPrefix, routes, }); diff --git a/packages/autumn-js/src/better-auth/index.ts b/packages/autumn-js/src/better-auth/index.ts index 63867279c..c2a7873f9 100644 --- a/packages/autumn-js/src/better-auth/index.ts +++ b/packages/autumn-js/src/better-auth/index.ts @@ -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), diff --git a/packages/autumn-js/src/better-auth/utils/handleBetterAuthRoute.ts b/packages/autumn-js/src/better-auth/utils/handleBetterAuthRoute.ts index afb75eb94..4fa2ee1b8 100644 --- a/packages/autumn-js/src/better-auth/utils/handleBetterAuthRoute.ts +++ b/packages/autumn-js/src/better-auth/utils/handleBetterAuthRoute.ts @@ -65,7 +65,7 @@ export const createHandleBetterAuthRoute = ({ identify, }), secretKey, - baseURL, + autumnURL: baseURL, }); }; }; diff --git a/packages/autumn-js/src/react/client/AutumnClient.ts b/packages/autumn-js/src/react/client/AutumnClient.ts index 2ba5b036b..aa2e8484a 100644 --- a/packages/autumn-js/src/react/client/AutumnClient.ts +++ b/packages/autumn-js/src/react/client/AutumnClient.ts @@ -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({ + route: "previewAttach", + body: params, + }), + updateSubscription: (params) => + http.request({ + route: "updateSubscription", + body: params, + }), + previewUpdateSubscription: (params) => + http.request({ + route: "previewUpdateSubscription", + body: params, + }), openCustomerPortal: (params) => http.request({ route: "openCustomerPortal", diff --git a/packages/autumn-js/src/react/client/IAutumnClient.ts b/packages/autumn-js/src/react/client/IAutumnClient.ts index 4aa2a4685..41c270bfa 100644 --- a/packages/autumn-js/src/react/client/IAutumnClient.ts +++ b/packages/autumn-js/src/react/client/IAutumnClient.ts @@ -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; attach: (params: AttachParams) => Promise; + previewAttach: ( + params: PreviewAttachParams, + ) => Promise; + updateSubscription: ( + params: UpdateSubscriptionParams, + ) => Promise; + previewUpdateSubscription: ( + params: PreviewUpdateSubscriptionParams, + ) => Promise; openCustomerPortal: ( params: OpenCustomerPortalParams, ) => Promise; diff --git a/packages/autumn-js/src/react/hooks/internal/getLocalCheckResponse.ts b/packages/autumn-js/src/react/hooks/internal/getLocalCheckResponse.ts index f16afb78f..e26a74c5b 100644 --- a/packages/autumn-js/src/react/hooks/internal/getLocalCheckResponse.ts +++ b/packages/autumn-js/src/react/hooks/internal/getLocalCheckResponse.ts @@ -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, diff --git a/packages/autumn-js/src/react/hooks/internal/useCustomerActions.ts b/packages/autumn-js/src/react/hooks/internal/useCustomerActions.ts index aedb1c1ec..73241eb34 100644 --- a/packages/autumn-js/src/react/hooks/internal/useCustomerActions.ts +++ b/packages/autumn-js/src/react/hooks/internal/useCustomerActions.ts @@ -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 => { - 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 => { + return client.previewAttach(params); + }, + [client], + ); + + const updateSubscription = useCallback( + async ( + params: UpdateSubscriptionParams, + ): Promise => { + 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 => { + 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, }; diff --git a/packages/autumn-js/src/react/hooks/useCustomer.ts b/packages/autumn-js/src/react/hooks/useCustomer.ts index 935993e11..82733a9a2 100644 --- a/packages/autumn-js/src/react/hooks/useCustomer.ts +++ b/packages/autumn-js/src/react/hooks/useCustomer.ts @@ -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; - /** 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; + + /** + * 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; + + /** + * 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; + + /** + * 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; @@ -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 = {}, diff --git a/packages/autumn-js/src/react/index.ts b/packages/autumn-js/src/react/index.ts index c5fa116ec..e87a12f3d 100644 --- a/packages/autumn-js/src/react/index.ts +++ b/packages/autumn-js/src/react/index.ts @@ -2,14 +2,16 @@ // Types export type { - CheckParams, ClientAggregateEventsParams, ClientAttachParams, ClientCreateReferralCodeParams, ClientGetOrCreateCustomerParams, ClientListEventsParams, ClientOpenCustomerPortalParams, + ClientPreviewAttachParams, + ClientPreviewUpdateSubscriptionParams, ClientRedeemReferralCodeParams, + ClientUpdateSubscriptionParams, ProtectedFields, } from "../types/params"; // Context diff --git a/packages/autumn-js/src/types/index.ts b/packages/autumn-js/src/types/index.ts index 395b3afbd..dbf3fff27 100644 --- a/packages/autumn-js/src/types/index.ts +++ b/packages/autumn-js/src/types/index.ts @@ -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"; diff --git a/packages/autumn-js/src/types/params.ts b/packages/autumn-js/src/types/params.ts index e9c82ce1b..98d9e0c40 100644 --- a/packages/autumn-js/src/types/params.ts +++ b/packages/autumn-js/src/types/params.ts @@ -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; +export type ClientCheckParams = Omit; /** 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 +>; diff --git a/packages/autumn-js/tsconfig.json b/packages/autumn-js/tsconfig.json index 6127accb3..1b301fecb 100644 --- a/packages/autumn-js/tsconfig.json +++ b/packages/autumn-js/tsconfig.json @@ -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/*"] diff --git a/packages/autumn-js/tsup.config.ts b/packages/autumn-js/tsup.config.ts index 5c569e146..d93a3b0fb 100644 --- a/packages/autumn-js/tsup.config.ts +++ b/packages/autumn-js/tsup.config.ts @@ -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, ]); diff --git a/packages/openapi/openapi-stripped.yml b/packages/openapi/openapi-stripped.yml index a4ae15485..c25a057b5 100644 --- a/packages/openapi/openapi-stripped.yml +++ b/packages/openapi/openapi-stripped.yml @@ -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: diff --git a/packages/openapi/openapi.yml b/packages/openapi/openapi.yml index 7d0e0d32c..bb3c51efb 100644 --- a/packages/openapi/openapi.yml +++ b/packages/openapi/openapi.yml @@ -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: diff --git a/packages/openapi/v2.1/openapi2.1.ts b/packages/openapi/v2.1/openapi2.1.ts index d0b0c81e2..e4d6dd1dc 100644 --- a/packages/openapi/v2.1/openapi2.1.ts +++ b/packages/openapi/v2.1/openapi2.1.ts @@ -101,8 +101,8 @@ async function generateOpenApiDocument(): Promise> { }, servers: [ { - // url: "https://api.useautumn.com/v1", - url: "http://localhost:8080", + // url: "http://localhost:8080", + url: "https://api.useautumn.com", description: "Production server", }, ], diff --git a/packages/sdk/.speakeasy/gen.lock b/packages/sdk/.speakeasy/gen.lock index a9864ff18..036df47f3 100644 --- a/packages/sdk/.speakeasy/gen.lock +++ b/packages/sdk/.speakeasy/gen.lock @@ -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 diff --git a/packages/sdk/.speakeasy/gen.yaml b/packages/sdk/.speakeasy/gen.yaml index d2475322b..3e6c9acbf 100644 --- a/packages/sdk/.speakeasy/gen.yaml +++ b/packages/sdk/.speakeasy/gen.yaml @@ -33,7 +33,7 @@ generation: generateNewTests: true skipResponseBodyAssertions: false typescript: - version: 0.10.15 + version: 0.10.16 acceptHeaderEnum: false additionalDependencies: dependencies: {} diff --git a/packages/sdk/.speakeasy/out.openapi.yaml b/packages/sdk/.speakeasy/out.openapi.yaml index 506eb7383..ce7ade0b6 100644 --- a/packages/sdk/.speakeasy/out.openapi.yaml +++ b/packages/sdk/.speakeasy/out.openapi.yaml @@ -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: diff --git a/packages/sdk/.speakeasy/workflow.lock b/packages/sdk/.speakeasy/workflow.lock index 928d749ca..d2d3d475d 100644 --- a/packages/sdk/.speakeasy/workflow.lock +++ b/packages/sdk/.speakeasy/workflow.lock @@ -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: diff --git a/packages/sdk/README.md b/packages/sdk/README.md index ef8fc66bf..3d2a28ab4 100644 --- a/packages/sdk/README.md +++ b/packages/sdk/README.md @@ -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"] ?? "", }); diff --git a/packages/sdk/jsr.json b/packages/sdk/jsr.json index 13504f125..3de4707b6 100644 --- a/packages/sdk/jsr.json +++ b/packages/sdk/jsr.json @@ -2,7 +2,7 @@ { "name": "@useautumn/sdk", - "version": "0.10.15", + "version": "0.10.16", "exports": { ".": "./src/index.ts", "./models": "./src/models/index.ts", diff --git a/packages/sdk/package.json b/packages/sdk/package.json index 2ed4b0912..490682ca9 100644 --- a/packages/sdk/package.json +++ b/packages/sdk/package.json @@ -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", diff --git a/packages/sdk/src/lib/config.ts b/packages/sdk/src/lib/config.ts index c7ade4f8c..0c35c6ebe 100644 --- a/packages/sdk/src/lib/config.ts +++ b/packages/sdk/src/lib/config.ts @@ -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;