Add Lemon Squeezy Billing System
This commit is contained in:
@@ -28,6 +28,7 @@
|
|||||||
"apps/*",
|
"apps/*",
|
||||||
"packages/*",
|
"packages/*",
|
||||||
"packages/features/*",
|
"packages/features/*",
|
||||||
|
"packages/billing/*",
|
||||||
"packages/cms/*",
|
"packages/cms/*",
|
||||||
"tooling/*",
|
"tooling/*",
|
||||||
"supabase"
|
"supabase"
|
||||||
|
|||||||
@@ -176,7 +176,23 @@ const BillingSchema = z
|
|||||||
message: 'Line item IDs must be unique',
|
message: 'Line item IDs must be unique',
|
||||||
path: ['products'],
|
path: ['products'],
|
||||||
},
|
},
|
||||||
);
|
)
|
||||||
|
.refine((schema) => {
|
||||||
|
if (schema.provider === 'lemon-squeezy') {
|
||||||
|
for (const product of schema.products) {
|
||||||
|
for (const plan of product.plans) {
|
||||||
|
if (plan.lineItems.length > 1) {
|
||||||
|
return {
|
||||||
|
message: 'Only one line item is allowed for Lemon Squeezy',
|
||||||
|
path: ['products', 'plans'],
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
|
||||||
export function createBillingSchema(config: z.infer<typeof BillingSchema>) {
|
export function createBillingSchema(config: z.infer<typeof BillingSchema>) {
|
||||||
return BillingSchema.parse(config);
|
return BillingSchema.parse(config);
|
||||||
@@ -29,6 +29,7 @@
|
|||||||
"@kit/prettier-config": "workspace:*",
|
"@kit/prettier-config": "workspace:*",
|
||||||
"@kit/shared": "workspace:^",
|
"@kit/shared": "workspace:^",
|
||||||
"@kit/stripe": "workspace:^",
|
"@kit/stripe": "workspace:^",
|
||||||
|
"@kit/lemon-squeezy": "workspace:^",
|
||||||
"@kit/supabase": "workspace:^",
|
"@kit/supabase": "workspace:^",
|
||||||
"@kit/tailwind-config": "workspace:*",
|
"@kit/tailwind-config": "workspace:*",
|
||||||
"@kit/tsconfig": "workspace:*",
|
"@kit/tsconfig": "workspace:*",
|
||||||
@@ -16,12 +16,16 @@ export class BillingGatewayFactoryService {
|
|||||||
return new StripeBillingStrategyService();
|
return new StripeBillingStrategyService();
|
||||||
}
|
}
|
||||||
|
|
||||||
case 'paddle': {
|
case 'lemon-squeezy': {
|
||||||
throw new Error('Paddle is not supported yet');
|
const { LemonSqueezyBillingStrategyService } = await import(
|
||||||
|
'@kit/lemon-squeezy'
|
||||||
|
);
|
||||||
|
|
||||||
|
return new LemonSqueezyBillingStrategyService();
|
||||||
}
|
}
|
||||||
|
|
||||||
case 'lemon-squeezy': {
|
case 'paddle': {
|
||||||
throw new Error('Lemon Squeezy is not supported yet');
|
throw new Error('Paddle is not supported yet');
|
||||||
}
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
50
packages/billing/lemon-squeezy/package.json
Normal file
50
packages/billing/lemon-squeezy/package.json
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
{
|
||||||
|
"name": "@kit/lemon-squeezy",
|
||||||
|
"private": true,
|
||||||
|
"version": "0.1.0",
|
||||||
|
"scripts": {
|
||||||
|
"clean": "git clean -xdf .turbo node_modules",
|
||||||
|
"format": "prettier --check \"**/*.{ts,tsx}\"",
|
||||||
|
"lint": "eslint .",
|
||||||
|
"typecheck": "tsc --noEmit",
|
||||||
|
"start": "docker run --rm -it --name=stripe -v ~/.config/stripe:/root/.config/stripe stripe/stripe-cli:latest listen --forward-to http://host.docker.internal:3000/api/billing/webhook"
|
||||||
|
},
|
||||||
|
"prettier": "@kit/prettier-config",
|
||||||
|
"exports": {
|
||||||
|
".": "./src/index.ts",
|
||||||
|
"./components": "./src/components/index.ts"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"@kit/billing": "0.1.0",
|
||||||
|
"@kit/shared": "0.1.0",
|
||||||
|
"@kit/supabase": "0.1.0",
|
||||||
|
"@kit/ui": "0.1.0"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"@lemonsqueezy/lemonsqueezy.js": "2.2.0"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@kit/billing": "workspace:^",
|
||||||
|
"@kit/eslint-config": "workspace:*",
|
||||||
|
"@kit/prettier-config": "workspace:*",
|
||||||
|
"@kit/shared": "workspace:^",
|
||||||
|
"@kit/supabase": "workspace:^",
|
||||||
|
"@kit/tailwind-config": "workspace:*",
|
||||||
|
"@kit/tsconfig": "workspace:*",
|
||||||
|
"@kit/ui": "workspace:^"
|
||||||
|
},
|
||||||
|
"eslintConfig": {
|
||||||
|
"root": true,
|
||||||
|
"extends": [
|
||||||
|
"@kit/eslint-config/base",
|
||||||
|
"@kit/eslint-config/react"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"typesVersions": {
|
||||||
|
"*": {
|
||||||
|
"*": [
|
||||||
|
"src/*"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
1
packages/billing/lemon-squeezy/src/index.ts
Normal file
1
packages/billing/lemon-squeezy/src/index.ts
Normal file
@@ -0,0 +1 @@
|
|||||||
|
export * from './services/lemon-squeezy-billing-strategy.service';
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
import { z } from 'zod';
|
||||||
|
|
||||||
|
export const getLemonSqueezyEnv = () =>
|
||||||
|
z
|
||||||
|
.object({
|
||||||
|
secretKey: z.string().min(1),
|
||||||
|
webhooksSecret: z.string().min(1),
|
||||||
|
storeId: z.number().positive(),
|
||||||
|
})
|
||||||
|
.parse({
|
||||||
|
secretKey: process.env.LEMON_SQUEEZY_SECRET_KEY,
|
||||||
|
webhooksSecret: process.env.LEMON_SQUEEZY_WEBHOOK_SECRET,
|
||||||
|
storeId: process.env.LEMON_SQUEEZY_STORE_ID,
|
||||||
|
});
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
import { getCustomer } from '@lemonsqueezy/lemonsqueezy.js';
|
||||||
|
import { z } from 'zod';
|
||||||
|
|
||||||
|
import { CreateBillingPortalSessionSchema } from '@kit/billing/schema';
|
||||||
|
|
||||||
|
import { initializeLemonSqueezyClient } from './lemon-squeezy-sdk';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a LemonSqueezy billing portal session for the given parameters.
|
||||||
|
*
|
||||||
|
* @param {object} params - The parameters required to create the billing portal session.
|
||||||
|
* @return {Promise<string>} - A promise that resolves to the URL of the customer portal.
|
||||||
|
* @throws {Error} - If no customer is found with the given customerId.
|
||||||
|
*/
|
||||||
|
export async function createLemonSqueezyBillingPortalSession(
|
||||||
|
params: z.infer<typeof CreateBillingPortalSessionSchema>,
|
||||||
|
) {
|
||||||
|
await initializeLemonSqueezyClient();
|
||||||
|
|
||||||
|
const customer = await getCustomer(params.customerId);
|
||||||
|
|
||||||
|
if (!customer?.data) {
|
||||||
|
throw new Error('No customer found');
|
||||||
|
}
|
||||||
|
|
||||||
|
return customer.data.data.attributes.urls.customer_portal;
|
||||||
|
}
|
||||||
@@ -0,0 +1,82 @@
|
|||||||
|
import {
|
||||||
|
NewCheckout,
|
||||||
|
createCheckout,
|
||||||
|
getCustomer,
|
||||||
|
} from '@lemonsqueezy/lemonsqueezy.js';
|
||||||
|
import { z } from 'zod';
|
||||||
|
|
||||||
|
import { CreateBillingCheckoutSchema } from '@kit/billing/schema';
|
||||||
|
|
||||||
|
import { getLemonSqueezyEnv } from '../schema/lemon-squeezy-server-env.schema';
|
||||||
|
import { initializeLemonSqueezyClient } from './lemon-squeezy-sdk';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a checkout for a Lemon Squeezy product.
|
||||||
|
*
|
||||||
|
* @param {object} params - The parameters for creating the checkout.
|
||||||
|
* @return {Promise<object>} - A promise that resolves to the created Lemon Squeezy checkout.
|
||||||
|
* @throws {Error} - If no line items are found in the subscription.
|
||||||
|
*/
|
||||||
|
export async function createLemonSqueezyCheckout(
|
||||||
|
params: z.infer<typeof CreateBillingCheckoutSchema>,
|
||||||
|
) {
|
||||||
|
await initializeLemonSqueezyClient();
|
||||||
|
|
||||||
|
const lineItem = params.plan.lineItems[0];
|
||||||
|
|
||||||
|
if (!lineItem) {
|
||||||
|
throw new Error('No line items found in subscription');
|
||||||
|
}
|
||||||
|
|
||||||
|
const env = getLemonSqueezyEnv();
|
||||||
|
const storeId = env.storeId;
|
||||||
|
const variantId = lineItem.id;
|
||||||
|
|
||||||
|
const urls = getUrls({
|
||||||
|
returnUrl: params.returnUrl,
|
||||||
|
});
|
||||||
|
|
||||||
|
const customer = params.customerId
|
||||||
|
? await getCustomer(params.customerId)
|
||||||
|
: null;
|
||||||
|
|
||||||
|
let customerEmail = params.customerEmail;
|
||||||
|
|
||||||
|
// if we can find an existing customer using the ID,
|
||||||
|
// we use the email from the customer object so that we can
|
||||||
|
// link the previous subscription to this one
|
||||||
|
// otherwise it will create a new customer if another email is provided (ex. a different team member)
|
||||||
|
if (customer?.data) {
|
||||||
|
customerEmail = customer.data.data.attributes.email;
|
||||||
|
}
|
||||||
|
|
||||||
|
const newCheckout: NewCheckout = {
|
||||||
|
checkoutOptions: {
|
||||||
|
embed: true,
|
||||||
|
media: true,
|
||||||
|
logo: true,
|
||||||
|
},
|
||||||
|
checkoutData: {
|
||||||
|
email: customerEmail,
|
||||||
|
custom: {
|
||||||
|
account_id: params.accountId,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
productOptions: {
|
||||||
|
redirectUrl: urls.return_url,
|
||||||
|
},
|
||||||
|
expiresAt: null,
|
||||||
|
preview: true,
|
||||||
|
testMode: process.env.NODE_ENV !== 'production',
|
||||||
|
};
|
||||||
|
|
||||||
|
return createCheckout(storeId, variantId, newCheckout);
|
||||||
|
}
|
||||||
|
|
||||||
|
function getUrls(params: { returnUrl: string }) {
|
||||||
|
const returnUrl = `${params.returnUrl}?session_id={CHECKOUT_SESSION_ID}`;
|
||||||
|
|
||||||
|
return {
|
||||||
|
return_url: returnUrl,
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -0,0 +1,89 @@
|
|||||||
|
import {
|
||||||
|
cancelSubscription,
|
||||||
|
createUsageRecord,
|
||||||
|
getCheckout,
|
||||||
|
} from '@lemonsqueezy/lemonsqueezy.js';
|
||||||
|
import 'server-only';
|
||||||
|
import { z } from 'zod';
|
||||||
|
|
||||||
|
import { BillingStrategyProviderService } from '@kit/billing';
|
||||||
|
import {
|
||||||
|
CancelSubscriptionParamsSchema,
|
||||||
|
CreateBillingCheckoutSchema,
|
||||||
|
CreateBillingPortalSessionSchema,
|
||||||
|
ReportBillingUsageSchema,
|
||||||
|
RetrieveCheckoutSessionSchema,
|
||||||
|
} from '@kit/billing/schema';
|
||||||
|
|
||||||
|
import { createLemonSqueezyBillingPortalSession } from './create-lemon-squeezy-billing-portal-session';
|
||||||
|
import { createLemonSqueezyCheckout } from './create-lemon-squeezy-checkout';
|
||||||
|
|
||||||
|
export class LemonSqueezyBillingStrategyService
|
||||||
|
implements BillingStrategyProviderService
|
||||||
|
{
|
||||||
|
async createCheckoutSession(
|
||||||
|
params: z.infer<typeof CreateBillingCheckoutSchema>,
|
||||||
|
) {
|
||||||
|
const { data: response } = await createLemonSqueezyCheckout(params);
|
||||||
|
|
||||||
|
if (!response?.data.id) {
|
||||||
|
throw new Error('Failed to create checkout session');
|
||||||
|
}
|
||||||
|
|
||||||
|
return { checkoutToken: response.data.id };
|
||||||
|
}
|
||||||
|
|
||||||
|
async createBillingPortalSession(
|
||||||
|
params: z.infer<typeof CreateBillingPortalSessionSchema>,
|
||||||
|
) {
|
||||||
|
const url = await createLemonSqueezyBillingPortalSession(params);
|
||||||
|
|
||||||
|
if (!url) {
|
||||||
|
throw new Error('Failed to create billing portal session');
|
||||||
|
}
|
||||||
|
|
||||||
|
return { url };
|
||||||
|
}
|
||||||
|
|
||||||
|
async cancelSubscription(
|
||||||
|
params: z.infer<typeof CancelSubscriptionParamsSchema>,
|
||||||
|
) {
|
||||||
|
await cancelSubscription(params.subscriptionId);
|
||||||
|
|
||||||
|
return { success: true };
|
||||||
|
}
|
||||||
|
|
||||||
|
async retrieveCheckoutSession(
|
||||||
|
params: z.infer<typeof RetrieveCheckoutSessionSchema>,
|
||||||
|
) {
|
||||||
|
const session = await getCheckout(params.sessionId);
|
||||||
|
|
||||||
|
if (!session.data) {
|
||||||
|
throw new Error('Failed to retrieve checkout session');
|
||||||
|
}
|
||||||
|
|
||||||
|
const data = session.data.data;
|
||||||
|
|
||||||
|
return {
|
||||||
|
checkoutToken: data.id,
|
||||||
|
isSessionOpen: false,
|
||||||
|
status: 'complete' as const,
|
||||||
|
customer: {
|
||||||
|
email: data.attributes.checkout_data.email,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
async reportUsage(params: z.infer<typeof ReportBillingUsageSchema>) {
|
||||||
|
const { error } = await createUsageRecord({
|
||||||
|
quantity: params.usage.quantity,
|
||||||
|
subscriptionItemId: params.subscriptionId,
|
||||||
|
});
|
||||||
|
|
||||||
|
if (error) {
|
||||||
|
throw new Error('Failed to report usage');
|
||||||
|
}
|
||||||
|
|
||||||
|
return { success: true };
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
import 'server-only';
|
||||||
|
|
||||||
|
import { Logger } from '@kit/shared/logger';
|
||||||
|
|
||||||
|
import { getLemonSqueezyEnv } from '../schema/lemon-squeezy-server-env.schema';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @description Initialize the Lemon Squeezy client
|
||||||
|
*/
|
||||||
|
export async function initializeLemonSqueezyClient() {
|
||||||
|
const { lemonSqueezySetup } = await import('@lemonsqueezy/lemonsqueezy.js');
|
||||||
|
const env = getLemonSqueezyEnv();
|
||||||
|
|
||||||
|
lemonSqueezySetup({
|
||||||
|
apiKey: env.secretKey,
|
||||||
|
onError(error) {
|
||||||
|
Logger.error(
|
||||||
|
{
|
||||||
|
name: `billing.lemon-squeezy`,
|
||||||
|
error: error.message,
|
||||||
|
},
|
||||||
|
'Error in Lemon Squeezy SDK',
|
||||||
|
);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
8
packages/billing/stripe/tsconfig.json
Normal file
8
packages/billing/stripe/tsconfig.json
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"extends": "@kit/tsconfig/base.json",
|
||||||
|
"compilerOptions": {
|
||||||
|
"tsBuildInfoFile": "node_modules/.cache/tsbuildinfo.json"
|
||||||
|
},
|
||||||
|
"include": ["*.ts", "src"],
|
||||||
|
"exclude": ["node_modules"]
|
||||||
|
}
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
enum StripeWebhooks {
|
|
||||||
AsyncPaymentSuccess = 'checkout.session.async_payment_succeeded',
|
|
||||||
Completed = 'checkout.session.completed',
|
|
||||||
AsyncPaymentFailed = 'checkout.session.async_payment_failed',
|
|
||||||
SubscriptionDeleted = 'customer.subscription.deleted',
|
|
||||||
SubscriptionUpdated = 'customer.subscription.updated',
|
|
||||||
}
|
|
||||||
|
|
||||||
export default StripeWebhooks;
|
|
||||||
159
pnpm-lock.yaml
generated
159
pnpm-lock.yaml
generated
@@ -49,10 +49,10 @@ importers:
|
|||||||
version: link:../../packages/features/auth
|
version: link:../../packages/features/auth
|
||||||
'@kit/billing':
|
'@kit/billing':
|
||||||
specifier: workspace:^
|
specifier: workspace:^
|
||||||
version: link:../../packages/billing
|
version: link:../../packages/billing/core
|
||||||
'@kit/billing-gateway':
|
'@kit/billing-gateway':
|
||||||
specifier: workspace:^
|
specifier: workspace:^
|
||||||
version: link:../../packages/billing-gateway
|
version: link:../../packages/billing/gateway
|
||||||
'@kit/cms':
|
'@kit/cms':
|
||||||
specifier: workspace:^
|
specifier: workspace:^
|
||||||
version: link:../../packages/cms/core
|
version: link:../../packages/cms/core
|
||||||
@@ -193,26 +193,26 @@ importers:
|
|||||||
specifier: ^5.4.3
|
specifier: ^5.4.3
|
||||||
version: 5.4.3
|
version: 5.4.3
|
||||||
|
|
||||||
packages/billing:
|
packages/billing/core:
|
||||||
devDependencies:
|
devDependencies:
|
||||||
'@kit/eslint-config':
|
'@kit/eslint-config':
|
||||||
specifier: workspace:*
|
specifier: workspace:*
|
||||||
version: link:../../tooling/eslint
|
version: link:../../../tooling/eslint
|
||||||
'@kit/prettier-config':
|
'@kit/prettier-config':
|
||||||
specifier: workspace:*
|
specifier: workspace:*
|
||||||
version: link:../../tooling/prettier
|
version: link:../../../tooling/prettier
|
||||||
'@kit/supabase':
|
'@kit/supabase':
|
||||||
specifier: workspace:*
|
specifier: workspace:*
|
||||||
version: link:../supabase
|
version: link:../../supabase
|
||||||
'@kit/tailwind-config':
|
'@kit/tailwind-config':
|
||||||
specifier: workspace:*
|
specifier: workspace:*
|
||||||
version: link:../../tooling/tailwind
|
version: link:../../../tooling/tailwind
|
||||||
'@kit/tsconfig':
|
'@kit/tsconfig':
|
||||||
specifier: workspace:*
|
specifier: workspace:*
|
||||||
version: link:../../tooling/typescript
|
version: link:../../../tooling/typescript
|
||||||
'@kit/ui':
|
'@kit/ui':
|
||||||
specifier: workspace:*
|
specifier: workspace:*
|
||||||
version: link:../ui
|
version: link:../../ui
|
||||||
lucide-react:
|
lucide-react:
|
||||||
specifier: ^0.363.0
|
specifier: ^0.363.0
|
||||||
version: 0.363.0(react@18.2.0)
|
version: 0.363.0(react@18.2.0)
|
||||||
@@ -220,35 +220,38 @@ importers:
|
|||||||
specifier: ^3.22.4
|
specifier: ^3.22.4
|
||||||
version: 3.22.4
|
version: 3.22.4
|
||||||
|
|
||||||
packages/billing-gateway:
|
packages/billing/gateway:
|
||||||
devDependencies:
|
devDependencies:
|
||||||
'@kit/billing':
|
'@kit/billing':
|
||||||
specifier: workspace:^
|
specifier: workspace:^
|
||||||
version: link:../billing
|
version: link:../core
|
||||||
'@kit/eslint-config':
|
'@kit/eslint-config':
|
||||||
specifier: workspace:*
|
specifier: workspace:*
|
||||||
version: link:../../tooling/eslint
|
version: link:../../../tooling/eslint
|
||||||
|
'@kit/lemon-squeezy':
|
||||||
|
specifier: workspace:^
|
||||||
|
version: link:../lemon-squeezy
|
||||||
'@kit/prettier-config':
|
'@kit/prettier-config':
|
||||||
specifier: workspace:*
|
specifier: workspace:*
|
||||||
version: link:../../tooling/prettier
|
version: link:../../../tooling/prettier
|
||||||
'@kit/shared':
|
'@kit/shared':
|
||||||
specifier: workspace:^
|
specifier: workspace:^
|
||||||
version: link:../shared
|
version: link:../../shared
|
||||||
'@kit/stripe':
|
'@kit/stripe':
|
||||||
specifier: workspace:^
|
specifier: workspace:^
|
||||||
version: link:../stripe
|
version: link:../stripe
|
||||||
'@kit/supabase':
|
'@kit/supabase':
|
||||||
specifier: workspace:^
|
specifier: workspace:^
|
||||||
version: link:../supabase
|
version: link:../../supabase
|
||||||
'@kit/tailwind-config':
|
'@kit/tailwind-config':
|
||||||
specifier: workspace:*
|
specifier: workspace:*
|
||||||
version: link:../../tooling/tailwind
|
version: link:../../../tooling/tailwind
|
||||||
'@kit/tsconfig':
|
'@kit/tsconfig':
|
||||||
specifier: workspace:*
|
specifier: workspace:*
|
||||||
version: link:../../tooling/typescript
|
version: link:../../../tooling/typescript
|
||||||
'@kit/ui':
|
'@kit/ui':
|
||||||
specifier: workspace:^
|
specifier: workspace:^
|
||||||
version: link:../ui
|
version: link:../../ui
|
||||||
'@supabase/supabase-js':
|
'@supabase/supabase-js':
|
||||||
specifier: ^2.41.1
|
specifier: ^2.41.1
|
||||||
version: 2.41.1
|
version: 2.41.1
|
||||||
@@ -259,6 +262,74 @@ importers:
|
|||||||
specifier: ^3.22.4
|
specifier: ^3.22.4
|
||||||
version: 3.22.4
|
version: 3.22.4
|
||||||
|
|
||||||
|
packages/billing/lemon-squeezy:
|
||||||
|
dependencies:
|
||||||
|
'@lemonsqueezy/lemonsqueezy.js':
|
||||||
|
specifier: 2.2.0
|
||||||
|
version: 2.2.0
|
||||||
|
devDependencies:
|
||||||
|
'@kit/billing':
|
||||||
|
specifier: workspace:^
|
||||||
|
version: link:../core
|
||||||
|
'@kit/eslint-config':
|
||||||
|
specifier: workspace:*
|
||||||
|
version: link:../../../tooling/eslint
|
||||||
|
'@kit/prettier-config':
|
||||||
|
specifier: workspace:*
|
||||||
|
version: link:../../../tooling/prettier
|
||||||
|
'@kit/shared':
|
||||||
|
specifier: workspace:^
|
||||||
|
version: link:../../shared
|
||||||
|
'@kit/supabase':
|
||||||
|
specifier: workspace:^
|
||||||
|
version: link:../../supabase
|
||||||
|
'@kit/tailwind-config':
|
||||||
|
specifier: workspace:*
|
||||||
|
version: link:../../../tooling/tailwind
|
||||||
|
'@kit/tsconfig':
|
||||||
|
specifier: workspace:*
|
||||||
|
version: link:../../../tooling/typescript
|
||||||
|
'@kit/ui':
|
||||||
|
specifier: workspace:^
|
||||||
|
version: link:../../ui
|
||||||
|
|
||||||
|
packages/billing/stripe:
|
||||||
|
dependencies:
|
||||||
|
'@stripe/react-stripe-js':
|
||||||
|
specifier: ^2.6.2
|
||||||
|
version: 2.6.2(@stripe/stripe-js@3.1.0)(react-dom@18.2.0)(react@18.2.0)
|
||||||
|
'@stripe/stripe-js':
|
||||||
|
specifier: ^3.1.0
|
||||||
|
version: 3.1.0
|
||||||
|
stripe:
|
||||||
|
specifier: ^14.22.0
|
||||||
|
version: 14.22.0
|
||||||
|
devDependencies:
|
||||||
|
'@kit/billing':
|
||||||
|
specifier: workspace:^
|
||||||
|
version: link:../core
|
||||||
|
'@kit/eslint-config':
|
||||||
|
specifier: workspace:*
|
||||||
|
version: link:../../../tooling/eslint
|
||||||
|
'@kit/prettier-config':
|
||||||
|
specifier: workspace:*
|
||||||
|
version: link:../../../tooling/prettier
|
||||||
|
'@kit/shared':
|
||||||
|
specifier: workspace:^
|
||||||
|
version: link:../../shared
|
||||||
|
'@kit/supabase':
|
||||||
|
specifier: workspace:^
|
||||||
|
version: link:../../supabase
|
||||||
|
'@kit/tailwind-config':
|
||||||
|
specifier: workspace:*
|
||||||
|
version: link:../../../tooling/tailwind
|
||||||
|
'@kit/tsconfig':
|
||||||
|
specifier: workspace:*
|
||||||
|
version: link:../../../tooling/typescript
|
||||||
|
'@kit/ui':
|
||||||
|
specifier: workspace:^
|
||||||
|
version: link:../../ui
|
||||||
|
|
||||||
packages/cms/contentlayer:
|
packages/cms/contentlayer:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@kit/cms':
|
'@kit/cms':
|
||||||
@@ -335,14 +406,14 @@ importers:
|
|||||||
dependencies:
|
dependencies:
|
||||||
'@kit/billing-gateway':
|
'@kit/billing-gateway':
|
||||||
specifier: workspace:^
|
specifier: workspace:^
|
||||||
version: link:../billing-gateway
|
version: link:../billing/gateway
|
||||||
'@kit/team-accounts':
|
'@kit/team-accounts':
|
||||||
specifier: workspace:^
|
specifier: workspace:^
|
||||||
version: link:../features/team-accounts
|
version: link:../features/team-accounts
|
||||||
devDependencies:
|
devDependencies:
|
||||||
'@kit/billing':
|
'@kit/billing':
|
||||||
specifier: workspace:^
|
specifier: workspace:^
|
||||||
version: link:../billing
|
version: link:../billing/core
|
||||||
'@kit/eslint-config':
|
'@kit/eslint-config':
|
||||||
specifier: workspace:*
|
specifier: workspace:*
|
||||||
version: link:../../tooling/eslint
|
version: link:../../tooling/eslint
|
||||||
@@ -354,7 +425,7 @@ importers:
|
|||||||
version: link:../shared
|
version: link:../shared
|
||||||
'@kit/stripe':
|
'@kit/stripe':
|
||||||
specifier: workspace:^
|
specifier: workspace:^
|
||||||
version: link:../stripe
|
version: link:../billing/stripe
|
||||||
'@kit/supabase':
|
'@kit/supabase':
|
||||||
specifier: workspace:^
|
specifier: workspace:^
|
||||||
version: link:../supabase
|
version: link:../supabase
|
||||||
@@ -403,7 +474,7 @@ importers:
|
|||||||
version: 3.3.4(react-hook-form@7.51.2)
|
version: 3.3.4(react-hook-form@7.51.2)
|
||||||
'@kit/billing-gateway':
|
'@kit/billing-gateway':
|
||||||
specifier: workspace:^
|
specifier: workspace:^
|
||||||
version: link:../../billing-gateway
|
version: link:../../billing/gateway
|
||||||
'@kit/email-templates':
|
'@kit/email-templates':
|
||||||
specifier: workspace:^
|
specifier: workspace:^
|
||||||
version: link:../../email-templates
|
version: link:../../email-templates
|
||||||
@@ -535,7 +606,7 @@ importers:
|
|||||||
version: link:../accounts
|
version: link:../accounts
|
||||||
'@kit/billing-gateway':
|
'@kit/billing-gateway':
|
||||||
specifier: workspace:*
|
specifier: workspace:*
|
||||||
version: link:../../billing-gateway
|
version: link:../../billing/gateway
|
||||||
'@kit/email-templates':
|
'@kit/email-templates':
|
||||||
specifier: workspace:^
|
specifier: workspace:^
|
||||||
version: link:../../email-templates
|
version: link:../../email-templates
|
||||||
@@ -644,43 +715,6 @@ importers:
|
|||||||
specifier: workspace:*
|
specifier: workspace:*
|
||||||
version: link:../../tooling/typescript
|
version: link:../../tooling/typescript
|
||||||
|
|
||||||
packages/stripe:
|
|
||||||
dependencies:
|
|
||||||
'@stripe/react-stripe-js':
|
|
||||||
specifier: ^2.6.2
|
|
||||||
version: 2.6.2(@stripe/stripe-js@3.1.0)(react-dom@18.2.0)(react@18.2.0)
|
|
||||||
'@stripe/stripe-js':
|
|
||||||
specifier: ^3.1.0
|
|
||||||
version: 3.1.0
|
|
||||||
stripe:
|
|
||||||
specifier: ^14.22.0
|
|
||||||
version: 14.22.0
|
|
||||||
devDependencies:
|
|
||||||
'@kit/billing':
|
|
||||||
specifier: workspace:^
|
|
||||||
version: link:../billing
|
|
||||||
'@kit/eslint-config':
|
|
||||||
specifier: workspace:*
|
|
||||||
version: link:../../tooling/eslint
|
|
||||||
'@kit/prettier-config':
|
|
||||||
specifier: workspace:*
|
|
||||||
version: link:../../tooling/prettier
|
|
||||||
'@kit/shared':
|
|
||||||
specifier: workspace:^
|
|
||||||
version: link:../shared
|
|
||||||
'@kit/supabase':
|
|
||||||
specifier: workspace:^
|
|
||||||
version: link:../supabase
|
|
||||||
'@kit/tailwind-config':
|
|
||||||
specifier: workspace:*
|
|
||||||
version: link:../../tooling/tailwind
|
|
||||||
'@kit/tsconfig':
|
|
||||||
specifier: workspace:*
|
|
||||||
version: link:../../tooling/typescript
|
|
||||||
'@kit/ui':
|
|
||||||
specifier: workspace:^
|
|
||||||
version: link:../ui
|
|
||||||
|
|
||||||
packages/supabase:
|
packages/supabase:
|
||||||
devDependencies:
|
devDependencies:
|
||||||
'@epic-web/invariant':
|
'@epic-web/invariant':
|
||||||
@@ -2036,6 +2070,11 @@ packages:
|
|||||||
tslib: 2.6.2
|
tslib: 2.6.2
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/@lemonsqueezy/lemonsqueezy.js@2.2.0:
|
||||||
|
resolution: {integrity: sha512-DsZTeowehSLTESUZ6xxoYPDhoE8BYepWsj3TCqibG7FvB8X1HERPXQlc6E/IeGj22SOfIM997b7GfFkeLWY8pA==}
|
||||||
|
engines: {node: '>=18'}
|
||||||
|
dev: false
|
||||||
|
|
||||||
/@manypkg/cli@0.21.3:
|
/@manypkg/cli@0.21.3:
|
||||||
resolution: {integrity: sha512-ro6j5b+44dN2AfId23voWxdlOqUCSbCwUHrUwq0LpoN/oZy6zQFAHDwYHbw50j2nL9EgpwIA03ZjaBceuUcMrw==}
|
resolution: {integrity: sha512-ro6j5b+44dN2AfId23voWxdlOqUCSbCwUHrUwq0LpoN/oZy6zQFAHDwYHbw50j2nL9EgpwIA03ZjaBceuUcMrw==}
|
||||||
engines: {node: '>=14.18.0'}
|
engines: {node: '>=14.18.0'}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ packages:
|
|||||||
- apps/*
|
- apps/*
|
||||||
- packages/*
|
- packages/*
|
||||||
- packages/features/*
|
- packages/features/*
|
||||||
|
- packages/billing/*
|
||||||
- packages/cms/*
|
- packages/cms/*
|
||||||
- tooling/*
|
- tooling/*
|
||||||
- supabase
|
- supabase
|
||||||
Reference in New Issue
Block a user