@happyvertical/smrt-subscriptions 0.57.2 → 0.57.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +46 -2
- package/dist/collections/SubscriptionPlanCollection.d.ts +3 -1
- package/dist/collections/SubscriptionPlanCollection.d.ts.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +86 -12
- package/dist/index.js.map +1 -1
- package/dist/manifest.json +151 -35
- package/dist/models/SubscriptionPlan.d.ts +13 -4
- package/dist/models/SubscriptionPlan.d.ts.map +1 -1
- package/dist/models/TenantSubscription.d.ts +3 -1
- package/dist/models/TenantSubscription.d.ts.map +1 -1
- package/dist/services/subscription-resolver.d.ts.map +1 -1
- package/dist/smrt-knowledge.json +76 -11
- package/dist/svelte/PlanPicker.svelte +21 -4
- package/dist/svelte/PlanPicker.svelte.d.ts +3 -0
- package/dist/svelte/PlanPicker.svelte.d.ts.map +1 -1
- package/dist/svelte/i18n.d.ts +4 -0
- package/dist/svelte/i18n.d.ts.map +1 -1
- package/dist/svelte/i18n.js +4 -0
- package/dist/types.d.ts +14 -4
- package/dist/types.d.ts.map +1 -1
- package/package.json +5 -5
- package/scripts/migrate-3829-drop-legacy-plan-key-index.ts +39 -0
- package/scripts/plan-key.ts +10 -0
|
@@ -1,4 +1,8 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
+
import { useI18n } from '@happyvertical/smrt-ui/i18n';
|
|
3
|
+
import { M } from './i18n.js';
|
|
4
|
+
|
|
5
|
+
const { t } = useI18n();
|
|
2
6
|
/**
|
|
3
7
|
* Serializable plan shape accepted by PlanPicker. `SubscriptionPlan` model
|
|
4
8
|
* instances satisfy it structurally, but it can also be plain data returned
|
|
@@ -18,6 +22,9 @@ export interface PlanPickerPlan {
|
|
|
18
22
|
description?: string | null;
|
|
19
23
|
/** Integer minor units of `currency` — `$19.99` is `1999` (#2401). */
|
|
20
24
|
priceAmount: number;
|
|
25
|
+
pricingMode?: 'free' | 'fixed' | 'pay_what_you_can';
|
|
26
|
+
minimumAmount?: number;
|
|
27
|
+
suggestedAmount?: number;
|
|
21
28
|
currency: string;
|
|
22
29
|
billingInterval: string;
|
|
23
30
|
featureKeys?: string[];
|
|
@@ -35,13 +42,13 @@ export interface PlanPickerPlan {
|
|
|
35
42
|
* Uses the currency's own minor-unit exponent rather than a hard-coded 100, so
|
|
36
43
|
* zero-decimal currencies (JPY, KRW) are not divided by anything.
|
|
37
44
|
*/
|
|
38
|
-
function formatPrice(plan: PlanPickerPlan): string {
|
|
45
|
+
function formatPrice(plan: PlanPickerPlan, amount = plan.priceAmount): string {
|
|
39
46
|
const format = new Intl.NumberFormat(undefined, {
|
|
40
47
|
style: 'currency',
|
|
41
48
|
currency: plan.currency,
|
|
42
49
|
});
|
|
43
50
|
const digits = format.resolvedOptions().maximumFractionDigits ?? 2;
|
|
44
|
-
return format.format(
|
|
51
|
+
return format.format(amount / 10 ** digits);
|
|
45
52
|
}
|
|
46
53
|
|
|
47
54
|
function featureCount(plan: PlanPickerPlan): number {
|
|
@@ -91,8 +98,18 @@ let {
|
|
|
91
98
|
>
|
|
92
99
|
<span class="smrt-plan-picker__name">{plan.name}</span>
|
|
93
100
|
<span class="smrt-plan-picker__price">
|
|
94
|
-
{
|
|
95
|
-
|
|
101
|
+
{#if plan.pricingMode === 'free'}
|
|
102
|
+
{t(M['subscriptions.picker.free'])}
|
|
103
|
+
{:else if plan.pricingMode === 'pay_what_you_can'}
|
|
104
|
+
{t(M['subscriptions.picker.pay_what_you_can'])}
|
|
105
|
+
<small>{t(M['subscriptions.picker.minimum'], { amount: formatPrice(plan, plan.minimumAmount ?? 0), interval: plan.billingInterval })}</small>
|
|
106
|
+
{#if plan.suggestedAmount}
|
|
107
|
+
<small>{t(M['subscriptions.picker.suggested'], { amount: formatPrice(plan, plan.suggestedAmount), interval: plan.billingInterval })}</small>
|
|
108
|
+
{/if}
|
|
109
|
+
{:else}
|
|
110
|
+
{formatPrice(plan)}
|
|
111
|
+
<small>/ {plan.billingInterval}</small>
|
|
112
|
+
{/if}
|
|
96
113
|
</span>
|
|
97
114
|
{#if plan.description}
|
|
98
115
|
<span class="smrt-plan-picker__description">{plan.description}</span>
|
|
@@ -17,6 +17,9 @@ export interface PlanPickerPlan {
|
|
|
17
17
|
description?: string | null;
|
|
18
18
|
/** Integer minor units of `currency` — `$19.99` is `1999` (#2401). */
|
|
19
19
|
priceAmount: number;
|
|
20
|
+
pricingMode?: 'free' | 'fixed' | 'pay_what_you_can';
|
|
21
|
+
minimumAmount?: number;
|
|
22
|
+
suggestedAmount?: number;
|
|
20
23
|
currency: string;
|
|
21
24
|
billingInterval: string;
|
|
22
25
|
featureKeys?: string[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PlanPicker.svelte.d.ts","sourceRoot":"","sources":["../../src/svelte/PlanPicker.svelte.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"PlanPicker.svelte.d.ts","sourceRoot":"","sources":["../../src/svelte/PlanPicker.svelte.ts"],"names":[],"mappings":"AAMA;;;;;;;GAOG;AACH,KAAK,sBAAsB,GACvB,MAAM,GACN;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAE/C,MAAM,WAAW,cAAc;IAC7B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,sEAAsE;IACtE,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,kBAAkB,CAAC;IACpD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,GAAG,sBAAsB,EAAE,CAAC;IAC7C,cAAc,CAAC,EAAE,MAAM,MAAM,EAAE,CAAC;CACjC;AACA,KAAK,gBAAgB,GAAI;IACxB,KAAK,CAAC,EAAE,cAAc,EAAE,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,IAAI,CAAC;CAC3C,CAAC;AA4FF,QAAA,MAAM,UAAU,sDAAwC,CAAC;AACzD,KAAK,UAAU,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC;AAChD,eAAe,UAAU,CAAC"}
|
package/dist/svelte/i18n.d.ts
CHANGED
|
@@ -1,4 +1,8 @@
|
|
|
1
1
|
export declare const M: {
|
|
2
|
+
readonly 'subscriptions.picker.free': "subscriptions.picker.free";
|
|
3
|
+
readonly 'subscriptions.picker.pay_what_you_can': "subscriptions.picker.pay_what_you_can";
|
|
4
|
+
readonly 'subscriptions.picker.minimum': "subscriptions.picker.minimum";
|
|
5
|
+
readonly 'subscriptions.picker.suggested': "subscriptions.picker.suggested";
|
|
2
6
|
readonly 'subscriptions.commercial.overview_label': "subscriptions.commercial.overview_label";
|
|
3
7
|
readonly 'subscriptions.summary.current_plan': "subscriptions.summary.current_plan";
|
|
4
8
|
readonly 'subscriptions.summary.ends': "subscriptions.summary.ends";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"i18n.d.ts","sourceRoot":"","sources":["../../src/svelte/i18n.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,CAAC
|
|
1
|
+
{"version":3,"file":"i18n.d.ts","sourceRoot":"","sources":["../../src/svelte/i18n.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,CAAC;;;;;;;;;;;;CAYZ,CAAC"}
|
package/dist/svelte/i18n.js
CHANGED
|
@@ -4,6 +4,10 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { defineMessages } from '@happyvertical/smrt-ui/i18n';
|
|
6
6
|
export const M = defineMessages({
|
|
7
|
+
'subscriptions.picker.free': 'Free',
|
|
8
|
+
'subscriptions.picker.pay_what_you_can': 'Pay what you can',
|
|
9
|
+
'subscriptions.picker.minimum': 'Minimum {amount} / {interval}',
|
|
10
|
+
'subscriptions.picker.suggested': 'Suggested {amount} / {interval}',
|
|
7
11
|
'subscriptions.commercial.overview_label': 'Commercial usage overview',
|
|
8
12
|
'subscriptions.summary.current_plan': 'Current plan',
|
|
9
13
|
'subscriptions.summary.ends': 'Ends',
|
package/dist/types.d.ts
CHANGED
|
@@ -4,6 +4,8 @@ import type { TenantSubscription } from './models/TenantSubscription.js';
|
|
|
4
4
|
export type SubscriptionStatus = 'active' | 'canceled' | 'incomplete' | 'past_due' | 'trialing' | 'unpaid';
|
|
5
5
|
export type SubscriptionPlanStatus = 'active' | 'archived' | 'draft';
|
|
6
6
|
export type BillingInterval = 'day' | 'week' | 'month' | 'year';
|
|
7
|
+
/** How a subscriber agrees to pay for a plan. Amounts are integer minor units. */
|
|
8
|
+
export type PricingMode = 'free' | 'fixed' | 'pay_what_you_can';
|
|
7
9
|
export type ThresholdEnforcement = 'observe' | 'warn' | 'block';
|
|
8
10
|
export type ThresholdWindow = 'day' | 'week' | 'month' | 'year' | 'rolling';
|
|
9
11
|
export type SubscriberKind = 'tenant' | 'external';
|
|
@@ -190,9 +192,16 @@ export interface SubscriptionPlanOptions extends SmrtObjectOptions {
|
|
|
190
192
|
priceAmount?: number;
|
|
191
193
|
currency?: string;
|
|
192
194
|
billingInterval?: BillingInterval;
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
195
|
+
pricingMode?: PricingMode;
|
|
196
|
+
minimumAmount?: number;
|
|
197
|
+
suggestedAmount?: number;
|
|
198
|
+
externalProvider?: string | null;
|
|
199
|
+
providerProductId?: string | null;
|
|
200
|
+
providerPriceId?: string | null;
|
|
201
|
+
/** @deprecated Use providerProductId. Retained to read existing Stripe bindings. */
|
|
202
|
+
stripeProductId?: string | null;
|
|
203
|
+
/** @deprecated Use providerPriceId. Retained to read existing Stripe bindings. */
|
|
204
|
+
stripePriceId?: string | null;
|
|
196
205
|
features?: string;
|
|
197
206
|
thresholds?: string;
|
|
198
207
|
metadata?: string;
|
|
@@ -214,7 +223,8 @@ export interface TenantSubscriptionOptions extends SmrtObjectOptions {
|
|
|
214
223
|
trialEndsAt?: Date | null;
|
|
215
224
|
cancelAtPeriodEnd?: boolean;
|
|
216
225
|
canceledAt?: Date | null;
|
|
217
|
-
|
|
226
|
+
agreedAmount?: number | null;
|
|
227
|
+
externalProvider?: string | null;
|
|
218
228
|
stripeCustomerId?: string;
|
|
219
229
|
stripeSubscriptionId?: string;
|
|
220
230
|
stripeCheckoutSessionId?: string;
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@happyvertical/smrt-subscriptions",
|
|
3
|
-
"version": "0.57.
|
|
3
|
+
"version": "0.57.3",
|
|
4
4
|
"description": "Tenant subscriptions, entitlement resolution, usage thresholds, and subscription UI for SMRT",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"smrtRawPrimitives": "strict",
|
|
@@ -26,9 +26,9 @@
|
|
|
26
26
|
}
|
|
27
27
|
},
|
|
28
28
|
"dependencies": {
|
|
29
|
-
"@happyvertical/smrt-core": "0.57.
|
|
30
|
-
"@happyvertical/smrt-tenancy": "0.57.
|
|
31
|
-
"@happyvertical/smrt-ui": "0.57.
|
|
29
|
+
"@happyvertical/smrt-core": "0.57.3",
|
|
30
|
+
"@happyvertical/smrt-tenancy": "0.57.3",
|
|
31
|
+
"@happyvertical/smrt-ui": "0.57.3",
|
|
32
32
|
"@happyvertical/sql": "^0.103.7"
|
|
33
33
|
},
|
|
34
34
|
"peerDependencies": {
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
}
|
|
41
41
|
},
|
|
42
42
|
"devDependencies": {
|
|
43
|
-
"@happyvertical/smrt-vitest": "0.57.
|
|
43
|
+
"@happyvertical/smrt-vitest": "0.57.3",
|
|
44
44
|
"@sveltejs/package": "^2.5.8",
|
|
45
45
|
"@types/node": "24.13.6",
|
|
46
46
|
"svelte": "^5.57.1",
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/** Remove the pre-#3829 global subscription-plan key index after manifest migration. */
|
|
4
|
+
import { getDatabase } from '@happyvertical/sql';
|
|
5
|
+
|
|
6
|
+
import { dropLegacyPlanKeyIndex } from './plan-key.ts';
|
|
7
|
+
|
|
8
|
+
function typeFor(input: string): 'postgres' | 'duckdb' | 'sqlite' {
|
|
9
|
+
if (/^postgres(?:ql)?:/i.test(input)) return 'postgres';
|
|
10
|
+
if (/^duckdb:/i.test(input) || /\.duckdb($|\?)/i.test(input)) return 'duckdb';
|
|
11
|
+
return 'sqlite';
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
async function main(): Promise<void> {
|
|
15
|
+
const url = process.argv[2];
|
|
16
|
+
if (!url)
|
|
17
|
+
throw new Error(
|
|
18
|
+
'Usage: migrate-3829-drop-legacy-plan-key-index.ts <database-url>',
|
|
19
|
+
);
|
|
20
|
+
const type = typeFor(url);
|
|
21
|
+
if (type === 'duckdb') {
|
|
22
|
+
throw new Error(
|
|
23
|
+
'DuckDB stores the legacy UNIQUE(plan_key) as an inline constraint. Rebuild _smrt_subscription_plans in a reviewed transaction with UNIQUE(tenant_id, plan_key).',
|
|
24
|
+
);
|
|
25
|
+
}
|
|
26
|
+
const db = await getDatabase({ type, url });
|
|
27
|
+
try {
|
|
28
|
+
await dropLegacyPlanKeyIndex(db);
|
|
29
|
+
} finally {
|
|
30
|
+
await db.close?.();
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
main().catch((error) => {
|
|
35
|
+
process.stderr.write(
|
|
36
|
+
`${error instanceof Error ? error.message : String(error)}\n`,
|
|
37
|
+
);
|
|
38
|
+
process.exitCode = 1;
|
|
39
|
+
});
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { DatabaseInterface } from '@happyvertical/sql';
|
|
2
|
+
|
|
3
|
+
/** Run after manifest migration installs the tenant-scoped natural key. */
|
|
4
|
+
export async function dropLegacyPlanKeyIndex(
|
|
5
|
+
db: DatabaseInterface,
|
|
6
|
+
): Promise<void> {
|
|
7
|
+
await db.query(
|
|
8
|
+
'DROP INDEX IF EXISTS "_smrt_subscription_plans_plan_key_idx"',
|
|
9
|
+
);
|
|
10
|
+
}
|