106 lines
2.7 KiB
TypeScript
106 lines
2.7 KiB
TypeScript
import path from 'node:path'
|
|
import {
|
|
createBillingStateStore,
|
|
type BillingPlan,
|
|
type BillingRole,
|
|
} from '../src/billing-state'
|
|
|
|
type ParsedArgs = {
|
|
email: string
|
|
plan: BillingPlan
|
|
role: BillingRole
|
|
canDownload: boolean
|
|
accessStatus: string
|
|
}
|
|
|
|
function readArgValue(args: string[], flag: string) {
|
|
const index = args.indexOf(flag)
|
|
if (index === -1) {
|
|
return ''
|
|
}
|
|
|
|
return String(args[index + 1] || '').trim()
|
|
}
|
|
|
|
function readBooleanArg(rawValue: string, fallback: boolean) {
|
|
const value = rawValue.trim().toLowerCase()
|
|
if (!value) {
|
|
return fallback
|
|
}
|
|
if (value === '1' || value === 'true' || value === 'yes' || value === 'on') {
|
|
return true
|
|
}
|
|
if (value === '0' || value === 'false' || value === 'no' || value === 'off') {
|
|
return false
|
|
}
|
|
throw new Error(`Invalid boolean value '${rawValue}'. Use true/false.`)
|
|
}
|
|
|
|
function normalizePlan(value: string): BillingPlan {
|
|
const plan = value.trim().toLowerCase()
|
|
if (plan === 'free' || plan === 'operator' || plan === 'studio' || plan === 'enterprise') {
|
|
return plan
|
|
}
|
|
if (plan === 'explorer') {
|
|
return 'free'
|
|
}
|
|
throw new Error(`Unsupported plan '${value}'.`)
|
|
}
|
|
|
|
function normalizeRole(value: string): BillingRole {
|
|
const role = value.trim().toLowerCase()
|
|
if (role === 'viewer' || role === 'operator' || role === 'reviewer' || role === 'admin') {
|
|
return role
|
|
}
|
|
throw new Error(`Unsupported role '${value}'.`)
|
|
}
|
|
|
|
function parseArgs(argv: string[]): ParsedArgs {
|
|
const email = readArgValue(argv, '--email').toLowerCase()
|
|
if (!email) {
|
|
throw new Error('Provide --email user@example.com')
|
|
}
|
|
|
|
const plan = normalizePlan(readArgValue(argv, '--plan') || 'enterprise')
|
|
const role = normalizeRole(readArgValue(argv, '--role') || 'admin')
|
|
const canDownload = readBooleanArg(readArgValue(argv, '--can-download'), plan !== 'free')
|
|
const accessStatus = readArgValue(argv, '--access-status') || (canDownload ? 'active' : 'manual-review')
|
|
|
|
return {
|
|
email,
|
|
plan,
|
|
role,
|
|
canDownload,
|
|
accessStatus,
|
|
}
|
|
}
|
|
|
|
function resolveBillingStatePath() {
|
|
return process.env.BILLING_STATE_PATH
|
|
|| path.join(process.cwd(), 'data', 'hypertwist-billing-state.json')
|
|
}
|
|
|
|
function main() {
|
|
const parsed = parseArgs(process.argv.slice(2))
|
|
const statePath = resolveBillingStatePath()
|
|
const store = createBillingStateStore({
|
|
statePath,
|
|
defaultPlan: 'free',
|
|
defaultRole: 'operator',
|
|
})
|
|
|
|
const entitlement = store.setManualEntitlement({
|
|
email: parsed.email,
|
|
plan: parsed.plan,
|
|
role: parsed.role,
|
|
canDownload: parsed.canDownload,
|
|
accessStatus: parsed.accessStatus,
|
|
})
|
|
|
|
console.log(JSON.stringify({
|
|
statePath,
|
|
entitlement,
|
|
}, null, 2))
|
|
}
|
|
|
|
main()
|