lemonsqueezy-license-manager
v1.0.1
Published
Lightweight TypeScript client for activating and validating Lemon Squeezy license keys across frontend frameworks.
Maintainers
Readme
Lemon Squeezy License Manager
📘 Overview
Lemon Squeezy License Manager is a lightweight TypeScript client for managing LemonSqueezy licenses. It provides simple methods for:
- Activating a license
- Validating a license
- Deactivating a license
This package is perfect for use in Next.js (App or Pages Router), Astro, or any Node-based frontend/backend app.
🚀 Getting Started
Installation
To get started, install the package via npm:
npm install lemonsqueezy-license-manager🧠 Core Functions
1. activateLicense(licenseKey, instanceName)
Description: Activates a license for a specific app instance.
Parameters:
licenseKey(string): Your LemonSqueezy license keyinstanceName(string): The name of the device or app instance
Usage:
import { activateLicense } from 'lemonsqueezy-license-manager';
const response = await activateLicense('YOUR-LICENSE-KEY', 'MyApp');
console.log(response);2. validateLicense(licenseKey, instanceId?)
Description: Validates whether a license is still active/valid.
Parameters:
licenseKey(string): The license key to checkinstanceId(optional string): A unique identifier for the instance
Usage:
import { validateLicense } from 'lemonsqueezy-license-manager';
const response = await validateLicense('YOUR-LICENSE-KEY', 'INSTANCE-ID');
console.log(response);3. deactivateLicense(licenseKey, instanceId)
Description: Deactivates a license from a specific instance.
Parameters:
licenseKey(string): The license key to checkinstanceId(string): A unique identifier for the instance
Usage:
import { deactivateLicense } from 'lemonsqueezy-license-manager';
const response = await deactivateLicense('YOUR-LICENSE-KEY', 'INSTANCE-ID');
console.log(response);🌐 Using in Next.js API Route (App Router)
You can integrate the functions into your Next.js API route like so:
// app/api/license/route.ts
import { NextRequest } from 'next/server';
import { activateLicense, validateLicense, deactivateLicense } from 'lemonsqueezy-license-manager';
export async function POST(req: NextRequest) {
const { action, licenseKey, instanceName, instanceId } = await req.json();
try {
switch (action) {
case 'activate':
return Response.json(await activateLicense(licenseKey, instanceName));
case 'validate':
return Response.json(await validateLicense(licenseKey, instanceId));
case 'deactivate':
return Response.json(await deactivateLicense(licenseKey, instanceId));
default:
return Response.json({ error: 'Invalid action' }, { status: 400 });
}
} catch (err: any) {
return Response.json({ error: err.message }, { status: 500 });
}
}🧪 Testing in Frontend
You can test the API by sending requests from the frontend:
const res = await fetch('/api/license', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
action: 'activate', // or 'validate' or 'deactivate'
licenseKey: 'YOUR-LICENSE-KEY',
instanceName: 'MyApp',
instanceId: 'INSTANCE-ID',
}),
});
const data = await res.json();
console.log(data);🔄 Error Handling
All functions throw clear messages if something goes wrong (e.g., invalid key, failed network request, etc).
Example:
try {
const data = await activateLicense('INVALID', 'MyApp');
} catch (error) {
console.error('Activation failed:', error);
}