@86d-store/memberships 0.1.0

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.
Files changed (110) hide show
  1. package/README.md +193 -0
  2. package/dist/admin/components/_shared.d.ts +13 -0
  3. package/dist/admin/components/_shared.d.ts.map +1 -0
  4. package/dist/admin/components/_shared.js +17 -0
  5. package/dist/admin/components/membership-admin.d.ts +2 -0
  6. package/dist/admin/components/membership-admin.d.ts.map +1 -0
  7. package/dist/admin/components/membership-admin.js +47 -0
  8. package/dist/admin/components/membership-plans.d.ts +2 -0
  9. package/dist/admin/components/membership-plans.d.ts.map +1 -0
  10. package/dist/admin/components/membership-plans.js +153 -0
  11. package/dist/admin/endpoints/add-benefit.d.ts +28 -0
  12. package/dist/admin/endpoints/add-benefit.d.ts.map +1 -0
  13. package/dist/admin/endpoints/add-benefit.js +37 -0
  14. package/dist/admin/endpoints/cancel-membership.d.ts +16 -0
  15. package/dist/admin/endpoints/cancel-membership.d.ts.map +1 -0
  16. package/dist/admin/endpoints/cancel-membership.js +19 -0
  17. package/dist/admin/endpoints/create-plan.d.ts +29 -0
  18. package/dist/admin/endpoints/create-plan.d.ts.map +1 -0
  19. package/dist/admin/endpoints/create-plan.js +48 -0
  20. package/dist/admin/endpoints/delete-plan.d.ts +16 -0
  21. package/dist/admin/endpoints/delete-plan.d.ts.map +1 -0
  22. package/dist/admin/endpoints/delete-plan.js +14 -0
  23. package/dist/admin/endpoints/gate-product.d.ts +19 -0
  24. package/dist/admin/endpoints/gate-product.d.ts.map +1 -0
  25. package/dist/admin/endpoints/gate-product.js +25 -0
  26. package/dist/admin/endpoints/get-membership.d.ts +18 -0
  27. package/dist/admin/endpoints/get-membership.d.ts.map +1 -0
  28. package/dist/admin/endpoints/get-membership.js +15 -0
  29. package/dist/admin/endpoints/get-stats.d.ts +6 -0
  30. package/dist/admin/endpoints/get-stats.d.ts.map +1 -0
  31. package/dist/admin/endpoints/get-stats.js +7 -0
  32. package/dist/admin/endpoints/list-memberships.d.ts +20 -0
  33. package/dist/admin/endpoints/list-memberships.d.ts.map +1 -0
  34. package/dist/admin/endpoints/list-memberships.js +32 -0
  35. package/dist/admin/endpoints/list-plans.d.ts +16 -0
  36. package/dist/admin/endpoints/list-plans.d.ts.map +1 -0
  37. package/dist/admin/endpoints/list-plans.js +29 -0
  38. package/dist/admin/endpoints/pause-membership.d.ts +16 -0
  39. package/dist/admin/endpoints/pause-membership.d.ts.map +1 -0
  40. package/dist/admin/endpoints/pause-membership.js +19 -0
  41. package/dist/admin/endpoints/remove-benefit.d.ts +16 -0
  42. package/dist/admin/endpoints/remove-benefit.d.ts.map +1 -0
  43. package/dist/admin/endpoints/remove-benefit.js +14 -0
  44. package/dist/admin/endpoints/resume-membership.d.ts +16 -0
  45. package/dist/admin/endpoints/resume-membership.d.ts.map +1 -0
  46. package/dist/admin/endpoints/resume-membership.js +19 -0
  47. package/dist/admin/endpoints/routes.d.ts +237 -0
  48. package/dist/admin/endpoints/routes.d.ts.map +1 -0
  49. package/dist/admin/endpoints/routes.js +30 -0
  50. package/dist/admin/endpoints/ungate-product.d.ts +13 -0
  51. package/dist/admin/endpoints/ungate-product.d.ts.map +1 -0
  52. package/dist/admin/endpoints/ungate-product.js +22 -0
  53. package/dist/admin/endpoints/update-plan.d.ts +32 -0
  54. package/dist/admin/endpoints/update-plan.d.ts.map +1 -0
  55. package/dist/admin/endpoints/update-plan.js +62 -0
  56. package/dist/index.d.ts +10 -0
  57. package/dist/index.d.ts.map +1 -0
  58. package/dist/index.js +75 -0
  59. package/dist/schema.d.ts +102 -0
  60. package/dist/schema.d.ts.map +1 -0
  61. package/dist/schema.js +63 -0
  62. package/dist/service-impl.d.ts +4 -0
  63. package/dist/service-impl.d.ts.map +1 -0
  64. package/dist/service-impl.js +414 -0
  65. package/dist/service.d.ts +145 -0
  66. package/dist/service.d.ts.map +1 -0
  67. package/dist/service.js +1 -0
  68. package/dist/store/components/_hooks.d.ts +9 -0
  69. package/dist/store/components/_hooks.d.ts.map +1 -0
  70. package/dist/store/components/_hooks.js +13 -0
  71. package/dist/store/components/_utils.d.ts +11 -0
  72. package/dist/store/components/_utils.d.ts.map +1 -0
  73. package/dist/store/components/_utils.js +98 -0
  74. package/dist/store/components/mdx.d.ts +10 -0
  75. package/dist/store/components/mdx.d.ts.map +1 -0
  76. package/dist/store/components/mdx.js +9 -0
  77. package/dist/store/components/my-membership.d.ts +2 -0
  78. package/dist/store/components/my-membership.d.ts.map +1 -0
  79. package/dist/store/components/my-membership.js +42 -0
  80. package/dist/store/components/my-membership.mdx +13 -0
  81. package/dist/store/components/plan-detail.d.ts +5 -0
  82. package/dist/store/components/plan-detail.d.ts.map +1 -0
  83. package/dist/store/components/plan-detail.js +50 -0
  84. package/dist/store/components/plan-detail.mdx +15 -0
  85. package/dist/store/components/plan-listing.d.ts +2 -0
  86. package/dist/store/components/plan-listing.d.ts.map +1 -0
  87. package/dist/store/components/plan-listing.js +21 -0
  88. package/dist/store/components/plan-listing.mdx +13 -0
  89. package/dist/store/endpoints/cancel.d.ts +16 -0
  90. package/dist/store/endpoints/cancel.d.ts.map +1 -0
  91. package/dist/store/endpoints/cancel.js +25 -0
  92. package/dist/store/endpoints/check-access.d.ts +10 -0
  93. package/dist/store/endpoints/check-access.d.ts.map +1 -0
  94. package/dist/store/endpoints/check-access.js +20 -0
  95. package/dist/store/endpoints/get-membership.d.ts +19 -0
  96. package/dist/store/endpoints/get-membership.d.ts.map +1 -0
  97. package/dist/store/endpoints/get-membership.js +18 -0
  98. package/dist/store/endpoints/get-plan.d.ts +18 -0
  99. package/dist/store/endpoints/get-plan.d.ts.map +1 -0
  100. package/dist/store/endpoints/get-plan.js +17 -0
  101. package/dist/store/endpoints/list-plans.d.ts +11 -0
  102. package/dist/store/endpoints/list-plans.d.ts.map +1 -0
  103. package/dist/store/endpoints/list-plans.js +18 -0
  104. package/dist/store/endpoints/routes.d.ts +82 -0
  105. package/dist/store/endpoints/routes.d.ts.map +1 -0
  106. package/dist/store/endpoints/routes.js +14 -0
  107. package/dist/store/endpoints/subscribe.d.ts +16 -0
  108. package/dist/store/endpoints/subscribe.d.ts.map +1 -0
  109. package/dist/store/endpoints/subscribe.js +30 -0
  110. package/package.json +93 -0
@@ -0,0 +1,237 @@
1
+ export declare const adminEndpoints: {
2
+ "/admin/memberships": import("better-call").StrictEndpoint<"/admin/memberships", {
3
+ method: "GET";
4
+ query: import("zod").ZodObject<{
5
+ planId: import("zod").ZodOptional<import("zod").ZodString>;
6
+ status: import("zod").ZodOptional<import("zod").ZodEnum<{
7
+ active: "active";
8
+ trial: "trial";
9
+ expired: "expired";
10
+ cancelled: "cancelled";
11
+ paused: "paused";
12
+ }>>;
13
+ take: import("zod").ZodOptional<import("zod").ZodCoercedNumber<unknown>>;
14
+ skip: import("zod").ZodOptional<import("zod").ZodCoercedNumber<unknown>>;
15
+ }, import("zod/v4/core").$strip>;
16
+ }, {
17
+ memberships: import("../..").Membership[];
18
+ total: number;
19
+ }>;
20
+ "/admin/memberships/stats": import("better-call").StrictEndpoint<"/admin/memberships/stats", {
21
+ method: "GET";
22
+ }, {
23
+ stats: import("../..").MembershipStats;
24
+ }>;
25
+ "/admin/memberships/plans": import("better-call").StrictEndpoint<"/admin/memberships/plans", {
26
+ method: "GET";
27
+ query: import("zod").ZodObject<{
28
+ active: import("zod").ZodOptional<import("zod").ZodEnum<{
29
+ true: "true";
30
+ false: "false";
31
+ }>>;
32
+ take: import("zod").ZodOptional<import("zod").ZodCoercedNumber<unknown>>;
33
+ skip: import("zod").ZodOptional<import("zod").ZodCoercedNumber<unknown>>;
34
+ }, import("zod/v4/core").$strip>;
35
+ }, {
36
+ plans: import("../..").MembershipPlan[];
37
+ total: number;
38
+ }>;
39
+ "/admin/memberships/plans/create": import("better-call").StrictEndpoint<"/admin/memberships/plans/create", {
40
+ method: "POST";
41
+ body: import("zod").ZodObject<{
42
+ name: import("zod").ZodPipe<import("zod").ZodString, import("zod").ZodTransform<string, string>>;
43
+ slug: import("zod").ZodString;
44
+ description: import("zod").ZodOptional<import("zod").ZodPipe<import("zod").ZodString, import("zod").ZodTransform<string, string>>>;
45
+ price: import("zod").ZodNumber;
46
+ billingInterval: import("zod").ZodEnum<{
47
+ monthly: "monthly";
48
+ yearly: "yearly";
49
+ lifetime: "lifetime";
50
+ }>;
51
+ trialDays: import("zod").ZodOptional<import("zod").ZodNumber>;
52
+ features: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>;
53
+ isActive: import("zod").ZodOptional<import("zod").ZodBoolean>;
54
+ maxMembers: import("zod").ZodOptional<import("zod").ZodNumber>;
55
+ sortOrder: import("zod").ZodOptional<import("zod").ZodNumber>;
56
+ }, import("zod/v4/core").$strip>;
57
+ }, {
58
+ error: string;
59
+ status: number;
60
+ plan?: never;
61
+ } | {
62
+ plan: import("../..").MembershipPlan;
63
+ error?: never;
64
+ status?: never;
65
+ }>;
66
+ "/admin/memberships/plans/:id/update": import("better-call").StrictEndpoint<"/admin/memberships/plans/:id/update", {
67
+ method: "POST";
68
+ params: import("zod").ZodObject<{
69
+ id: import("zod").ZodString;
70
+ }, import("zod/v4/core").$strip>;
71
+ body: import("zod").ZodObject<{
72
+ name: import("zod").ZodOptional<import("zod").ZodPipe<import("zod").ZodString, import("zod").ZodTransform<string, string>>>;
73
+ slug: import("zod").ZodOptional<import("zod").ZodString>;
74
+ description: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodPipe<import("zod").ZodString, import("zod").ZodTransform<string, string>>>>;
75
+ price: import("zod").ZodOptional<import("zod").ZodNumber>;
76
+ billingInterval: import("zod").ZodOptional<import("zod").ZodEnum<{
77
+ monthly: "monthly";
78
+ yearly: "yearly";
79
+ lifetime: "lifetime";
80
+ }>>;
81
+ trialDays: import("zod").ZodOptional<import("zod").ZodNumber>;
82
+ features: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodArray<import("zod").ZodString>>>;
83
+ isActive: import("zod").ZodOptional<import("zod").ZodBoolean>;
84
+ maxMembers: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodNumber>>;
85
+ sortOrder: import("zod").ZodOptional<import("zod").ZodNumber>;
86
+ }, import("zod/v4/core").$strip>;
87
+ }, {
88
+ error: string;
89
+ status: number;
90
+ plan?: never;
91
+ } | {
92
+ plan: import("../..").MembershipPlan;
93
+ error?: never;
94
+ status?: never;
95
+ }>;
96
+ "/admin/memberships/plans/:id/delete": import("better-call").StrictEndpoint<"/admin/memberships/plans/:id/delete", {
97
+ method: "POST";
98
+ params: import("zod").ZodObject<{
99
+ id: import("zod").ZodString;
100
+ }, import("zod/v4/core").$strip>;
101
+ }, {
102
+ error: string;
103
+ status: number;
104
+ success?: never;
105
+ } | {
106
+ success: boolean;
107
+ error?: never;
108
+ status?: never;
109
+ }>;
110
+ "/admin/memberships/plans/:planId/benefits/add": import("better-call").StrictEndpoint<"/admin/memberships/plans/:planId/benefits/add", {
111
+ method: "POST";
112
+ params: import("zod").ZodObject<{
113
+ planId: import("zod").ZodString;
114
+ }, import("zod/v4/core").$strip>;
115
+ body: import("zod").ZodObject<{
116
+ type: import("zod").ZodEnum<{
117
+ discount_percentage: "discount_percentage";
118
+ free_shipping: "free_shipping";
119
+ early_access: "early_access";
120
+ exclusive_products: "exclusive_products";
121
+ priority_support: "priority_support";
122
+ }>;
123
+ value: import("zod").ZodString;
124
+ description: import("zod").ZodOptional<import("zod").ZodPipe<import("zod").ZodString, import("zod").ZodTransform<string, string>>>;
125
+ isActive: import("zod").ZodOptional<import("zod").ZodBoolean>;
126
+ }, import("zod/v4/core").$strip>;
127
+ }, {
128
+ error: string;
129
+ status: number;
130
+ benefit?: never;
131
+ } | {
132
+ benefit: import("../..").MembershipBenefit;
133
+ error?: never;
134
+ status?: never;
135
+ }>;
136
+ "/admin/memberships/plans/:planId/products/gate": import("better-call").StrictEndpoint<"/admin/memberships/plans/:planId/products/gate", {
137
+ method: "POST";
138
+ params: import("zod").ZodObject<{
139
+ planId: import("zod").ZodString;
140
+ }, import("zod/v4/core").$strip>;
141
+ body: import("zod").ZodObject<{
142
+ productIds: import("zod").ZodArray<import("zod").ZodString>;
143
+ }, import("zod/v4/core").$strip>;
144
+ }, {
145
+ error: string;
146
+ status: number;
147
+ gated?: never;
148
+ } | {
149
+ gated: number;
150
+ error?: never;
151
+ status?: never;
152
+ }>;
153
+ "/admin/memberships/plans/:planId/products/ungate": import("better-call").StrictEndpoint<"/admin/memberships/plans/:planId/products/ungate", {
154
+ method: "POST";
155
+ params: import("zod").ZodObject<{
156
+ planId: import("zod").ZodString;
157
+ }, import("zod/v4/core").$strip>;
158
+ body: import("zod").ZodObject<{
159
+ productIds: import("zod").ZodArray<import("zod").ZodString>;
160
+ }, import("zod/v4/core").$strip>;
161
+ }, {
162
+ ungated: number;
163
+ }>;
164
+ "/admin/memberships/benefits/:id/remove": import("better-call").StrictEndpoint<"/admin/memberships/benefits/:id/remove", {
165
+ method: "POST";
166
+ params: import("zod").ZodObject<{
167
+ id: import("zod").ZodString;
168
+ }, import("zod/v4/core").$strip>;
169
+ }, {
170
+ error: string;
171
+ status: number;
172
+ success?: never;
173
+ } | {
174
+ success: boolean;
175
+ error?: never;
176
+ status?: never;
177
+ }>;
178
+ "/admin/memberships/:id": import("better-call").StrictEndpoint<"/admin/memberships/:id", {
179
+ method: "GET";
180
+ params: import("zod").ZodObject<{
181
+ id: import("zod").ZodString;
182
+ }, import("zod/v4/core").$strip>;
183
+ }, {
184
+ error: string;
185
+ status: number;
186
+ membership?: never;
187
+ plan?: never;
188
+ } | {
189
+ membership: import("../..").Membership;
190
+ plan: import("../..").MembershipPlan | null;
191
+ error?: never;
192
+ status?: never;
193
+ }>;
194
+ "/admin/memberships/:id/cancel": import("better-call").StrictEndpoint<"/admin/memberships/:id/cancel", {
195
+ method: "POST";
196
+ params: import("zod").ZodObject<{
197
+ id: import("zod").ZodString;
198
+ }, import("zod/v4/core").$strip>;
199
+ }, {
200
+ error: string;
201
+ status: number;
202
+ membership?: never;
203
+ } | {
204
+ membership: import("../..").Membership;
205
+ error?: never;
206
+ status?: never;
207
+ }>;
208
+ "/admin/memberships/:id/pause": import("better-call").StrictEndpoint<"/admin/memberships/:id/pause", {
209
+ method: "POST";
210
+ params: import("zod").ZodObject<{
211
+ id: import("zod").ZodString;
212
+ }, import("zod/v4/core").$strip>;
213
+ }, {
214
+ error: string;
215
+ status: number;
216
+ membership?: never;
217
+ } | {
218
+ membership: import("../..").Membership;
219
+ error?: never;
220
+ status?: never;
221
+ }>;
222
+ "/admin/memberships/:id/resume": import("better-call").StrictEndpoint<"/admin/memberships/:id/resume", {
223
+ method: "POST";
224
+ params: import("zod").ZodObject<{
225
+ id: import("zod").ZodString;
226
+ }, import("zod/v4/core").$strip>;
227
+ }, {
228
+ error: string;
229
+ status: number;
230
+ membership?: never;
231
+ } | {
232
+ membership: import("../..").Membership;
233
+ error?: never;
234
+ status?: never;
235
+ }>;
236
+ };
237
+ //# sourceMappingURL=routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../../src/admin/endpoints/routes.ts"],"names":[],"mappings":"AAeA,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAe1B,CAAC"}
@@ -0,0 +1,30 @@
1
+ import { addBenefit } from "./add-benefit";
2
+ import { cancelMembership } from "./cancel-membership";
3
+ import { createPlan } from "./create-plan";
4
+ import { deletePlan } from "./delete-plan";
5
+ import { gateProduct } from "./gate-product";
6
+ import { getMembership } from "./get-membership";
7
+ import { getStats } from "./get-stats";
8
+ import { listMemberships } from "./list-memberships";
9
+ import { listPlans } from "./list-plans";
10
+ import { pauseMembership } from "./pause-membership";
11
+ import { removeBenefit } from "./remove-benefit";
12
+ import { resumeMembership } from "./resume-membership";
13
+ import { ungateProduct } from "./ungate-product";
14
+ import { updatePlan } from "./update-plan";
15
+ export const adminEndpoints = {
16
+ "/admin/memberships": listMemberships,
17
+ "/admin/memberships/stats": getStats,
18
+ "/admin/memberships/plans": listPlans,
19
+ "/admin/memberships/plans/create": createPlan,
20
+ "/admin/memberships/plans/:id/update": updatePlan,
21
+ "/admin/memberships/plans/:id/delete": deletePlan,
22
+ "/admin/memberships/plans/:planId/benefits/add": addBenefit,
23
+ "/admin/memberships/plans/:planId/products/gate": gateProduct,
24
+ "/admin/memberships/plans/:planId/products/ungate": ungateProduct,
25
+ "/admin/memberships/benefits/:id/remove": removeBenefit,
26
+ "/admin/memberships/:id": getMembership,
27
+ "/admin/memberships/:id/cancel": cancelMembership,
28
+ "/admin/memberships/:id/pause": pauseMembership,
29
+ "/admin/memberships/:id/resume": resumeMembership,
30
+ };
@@ -0,0 +1,13 @@
1
+ import { z } from "zod";
2
+ export declare const ungateProduct: import("better-call").StrictEndpoint<"/admin/memberships/plans/:planId/products/ungate", {
3
+ method: "POST";
4
+ params: z.ZodObject<{
5
+ planId: z.ZodString;
6
+ }, z.core.$strip>;
7
+ body: z.ZodObject<{
8
+ productIds: z.ZodArray<z.ZodString>;
9
+ }, z.core.$strip>;
10
+ }, {
11
+ ungated: number;
12
+ }>;
13
+ //# sourceMappingURL=ungate-product.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ungate-product.d.ts","sourceRoot":"","sources":["../../../src/admin/endpoints/ungate-product.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,aAAa;;;;;;;;;;EAwBzB,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { createAdminEndpoint } from "@86d-store/core/api";
2
+ import { z } from "zod";
3
+ export const ungateProduct = createAdminEndpoint("/admin/memberships/plans/:planId/products/ungate", {
4
+ method: "POST",
5
+ params: z.object({ planId: z.string().min(1) }),
6
+ body: z.object({
7
+ productIds: z.array(z.string().min(1)).min(1).max(100),
8
+ }),
9
+ }, async (ctx) => {
10
+ const controller = ctx.context.controllers
11
+ .memberships;
12
+ let ungated = 0;
13
+ for (const productId of ctx.body.productIds) {
14
+ const removed = await controller.ungateProduct({
15
+ planId: ctx.params.planId,
16
+ productId,
17
+ });
18
+ if (removed)
19
+ ungated++;
20
+ }
21
+ return { ungated };
22
+ });
@@ -0,0 +1,32 @@
1
+ import { z } from "zod";
2
+ export declare const updatePlan: import("better-call").StrictEndpoint<"/admin/memberships/plans/:id/update", {
3
+ method: "POST";
4
+ params: z.ZodObject<{
5
+ id: z.ZodString;
6
+ }, z.core.$strip>;
7
+ body: z.ZodObject<{
8
+ name: z.ZodOptional<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>>;
9
+ slug: z.ZodOptional<z.ZodString>;
10
+ description: z.ZodOptional<z.ZodNullable<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>>>;
11
+ price: z.ZodOptional<z.ZodNumber>;
12
+ billingInterval: z.ZodOptional<z.ZodEnum<{
13
+ monthly: "monthly";
14
+ yearly: "yearly";
15
+ lifetime: "lifetime";
16
+ }>>;
17
+ trialDays: z.ZodOptional<z.ZodNumber>;
18
+ features: z.ZodOptional<z.ZodNullable<z.ZodArray<z.ZodString>>>;
19
+ isActive: z.ZodOptional<z.ZodBoolean>;
20
+ maxMembers: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
21
+ sortOrder: z.ZodOptional<z.ZodNumber>;
22
+ }, z.core.$strip>;
23
+ }, {
24
+ error: string;
25
+ status: number;
26
+ plan?: never;
27
+ } | {
28
+ plan: import("../..").MembershipPlan;
29
+ error?: never;
30
+ status?: never;
31
+ }>;
32
+ //# sourceMappingURL=update-plan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-plan.d.ts","sourceRoot":"","sources":["../../../src/admin/endpoints/update-plan.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4DtB,CAAC"}
@@ -0,0 +1,62 @@
1
+ import { createAdminEndpoint } from "@86d-store/core/api";
2
+ import { sanitizeText } from "@86d-store/core/sanitize";
3
+ import { z } from "zod";
4
+ export const updatePlan = createAdminEndpoint("/admin/memberships/plans/:id/update", {
5
+ method: "POST",
6
+ params: z.object({ id: z.string().min(1) }),
7
+ body: z.object({
8
+ name: z.string().min(1).max(200).transform(sanitizeText).optional(),
9
+ slug: z.string().min(1).max(200).optional(),
10
+ description: z
11
+ .string()
12
+ .max(5000)
13
+ .transform(sanitizeText)
14
+ .nullable()
15
+ .optional(),
16
+ price: z.number().min(0).optional(),
17
+ billingInterval: z.enum(["monthly", "yearly", "lifetime"]).optional(),
18
+ trialDays: z.number().int().min(0).max(365).optional(),
19
+ features: z.array(z.string().max(500)).max(50).nullable().optional(),
20
+ isActive: z.boolean().optional(),
21
+ maxMembers: z.number().int().min(1).nullable().optional(),
22
+ sortOrder: z.number().int().min(0).max(10000).optional(),
23
+ }),
24
+ }, async (ctx) => {
25
+ const controller = ctx.context.controllers
26
+ .memberships;
27
+ if (ctx.body.slug != null) {
28
+ const existing = await controller.getPlanBySlug(ctx.body.slug);
29
+ if (existing && existing.id !== ctx.params.id) {
30
+ return {
31
+ error: "A plan with this slug already exists",
32
+ status: 400,
33
+ };
34
+ }
35
+ }
36
+ const updateParams = {};
37
+ if (ctx.body.name != null)
38
+ updateParams.name = ctx.body.name;
39
+ if (ctx.body.slug != null)
40
+ updateParams.slug = ctx.body.slug;
41
+ if (ctx.body.description !== undefined)
42
+ updateParams.description = ctx.body.description;
43
+ if (ctx.body.price != null)
44
+ updateParams.price = ctx.body.price;
45
+ if (ctx.body.billingInterval != null)
46
+ updateParams.billingInterval = ctx.body.billingInterval;
47
+ if (ctx.body.trialDays != null)
48
+ updateParams.trialDays = ctx.body.trialDays;
49
+ if (ctx.body.features !== undefined)
50
+ updateParams.features = ctx.body.features;
51
+ if (ctx.body.isActive != null)
52
+ updateParams.isActive = ctx.body.isActive;
53
+ if (ctx.body.maxMembers !== undefined)
54
+ updateParams.maxMembers = ctx.body.maxMembers;
55
+ if (ctx.body.sortOrder != null)
56
+ updateParams.sortOrder = ctx.body.sortOrder;
57
+ const plan = await controller.updatePlan(ctx.params.id, updateParams);
58
+ if (!plan) {
59
+ return { error: "Plan not found", status: 404 };
60
+ }
61
+ return { plan };
62
+ });
@@ -0,0 +1,10 @@
1
+ import type { Module, ModuleConfig } from "@86d-store/core/types/module";
2
+ export type { BenefitType, BillingInterval, Membership, MembershipBenefit, MembershipController, MembershipPlan, MembershipProduct, MembershipStats, MembershipStatus, MembershipWithPlan, } from "./service";
3
+ export interface MembershipsOptions extends ModuleConfig {
4
+ /** Default trial days for new plans when not specified. Default: "0". */
5
+ defaultTrialDays?: string;
6
+ /** Maximum members allowed per plan when not specified. No default (unlimited). */
7
+ defaultMaxMembers?: string;
8
+ }
9
+ export default function memberships(options?: MembershipsOptions): Module;
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,MAAM,EACN,YAAY,EAEZ,MAAM,8BAA8B,CAAC;AAMtC,YAAY,EACX,WAAW,EACX,eAAe,EACf,UAAU,EACV,iBAAiB,EACjB,oBAAoB,EACpB,cAAc,EACd,iBAAiB,EACjB,eAAe,EACf,gBAAgB,EAChB,kBAAkB,GAClB,MAAM,WAAW,CAAC;AAEnB,MAAM,WAAW,kBAAmB,SAAQ,YAAY;IACvD,yEAAyE;IACzE,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,mFAAmF;IACnF,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,CAAC,OAAO,UAAU,WAAW,CAAC,OAAO,CAAC,EAAE,kBAAkB,GAAG,MAAM,CAsExE"}
package/dist/index.js ADDED
@@ -0,0 +1,75 @@
1
+ import { adminEndpoints } from "./admin/endpoints/routes";
2
+ import { membershipsStorage } from "./schema";
3
+ import { createMembershipController } from "./service-impl";
4
+ import { storeEndpoints } from "./store/endpoints/routes";
5
+ export default function memberships(options) {
6
+ return {
7
+ id: "memberships",
8
+ version: "0.0.1",
9
+ storage: membershipsStorage,
10
+ exports: {
11
+ read: [
12
+ "activePlans",
13
+ "customerMembership",
14
+ "customerBenefits",
15
+ "productAccess",
16
+ ],
17
+ },
18
+ requires: ["customers"],
19
+ events: {
20
+ emits: [
21
+ "membership.subscribed",
22
+ "membership.cancelled",
23
+ "membership.paused",
24
+ "membership.resumed",
25
+ "membership.expired",
26
+ "membership.plan.created",
27
+ "membership.plan.updated",
28
+ "membership.plan.deleted",
29
+ "membership.benefit.added",
30
+ "membership.benefit.removed",
31
+ "membership.product.gated",
32
+ "membership.product.ungated",
33
+ ],
34
+ },
35
+ init: async (ctx) => {
36
+ const controller = createMembershipController(ctx.data);
37
+ return { controllers: { memberships: controller } };
38
+ },
39
+ endpoints: {
40
+ store: storeEndpoints,
41
+ admin: adminEndpoints,
42
+ },
43
+ admin: {
44
+ pages: [
45
+ {
46
+ path: "/admin/memberships",
47
+ component: "MembershipAdmin",
48
+ label: "Memberships",
49
+ icon: "Crown",
50
+ group: "Customers",
51
+ },
52
+ {
53
+ path: "/admin/memberships/plans",
54
+ component: "MembershipPlans",
55
+ label: "Plans",
56
+ icon: "Layers",
57
+ group: "Customers",
58
+ },
59
+ ],
60
+ },
61
+ store: {
62
+ pages: [
63
+ {
64
+ path: "/memberships",
65
+ component: "PlanListing",
66
+ },
67
+ {
68
+ path: "/memberships/:slug",
69
+ component: "PlanDetail",
70
+ },
71
+ ],
72
+ },
73
+ options,
74
+ };
75
+ }
@@ -0,0 +1,102 @@
1
+ import { z } from "zod";
2
+ export declare const membershipsMembershipPlanShape: z.ZodObject<{
3
+ id: z.ZodString;
4
+ name: z.ZodString;
5
+ slug: z.ZodString;
6
+ description: z.ZodOptional<z.ZodString>;
7
+ price: z.ZodNumber;
8
+ billingInterval: z.ZodString;
9
+ trialDays: z.ZodNumber;
10
+ features: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
11
+ isActive: z.ZodBoolean;
12
+ maxMembers: z.ZodOptional<z.ZodNumber>;
13
+ sortOrder: z.ZodNumber;
14
+ createdAt: z.ZodDefault<z.ZodCoercedDate<unknown>>;
15
+ updatedAt: z.ZodDefault<z.ZodCoercedDate<unknown>>;
16
+ }, z.core.$strip>;
17
+ export declare const membershipsMembershipShape: z.ZodObject<{
18
+ id: z.ZodString;
19
+ customerId: z.ZodString;
20
+ planId: z.ZodString;
21
+ status: z.ZodString;
22
+ startDate: z.ZodCoercedDate<unknown>;
23
+ endDate: z.ZodOptional<z.ZodCoercedDate<unknown>>;
24
+ trialEndDate: z.ZodOptional<z.ZodCoercedDate<unknown>>;
25
+ cancelledAt: z.ZodOptional<z.ZodCoercedDate<unknown>>;
26
+ pausedAt: z.ZodOptional<z.ZodCoercedDate<unknown>>;
27
+ createdAt: z.ZodDefault<z.ZodCoercedDate<unknown>>;
28
+ updatedAt: z.ZodDefault<z.ZodCoercedDate<unknown>>;
29
+ }, z.core.$strip>;
30
+ export declare const membershipsMembershipBenefitShape: z.ZodObject<{
31
+ id: z.ZodString;
32
+ planId: z.ZodString;
33
+ type: z.ZodString;
34
+ value: z.ZodString;
35
+ description: z.ZodOptional<z.ZodString>;
36
+ isActive: z.ZodBoolean;
37
+ createdAt: z.ZodDefault<z.ZodCoercedDate<unknown>>;
38
+ }, z.core.$strip>;
39
+ export declare const membershipsMembershipProductShape: z.ZodObject<{
40
+ id: z.ZodString;
41
+ planId: z.ZodString;
42
+ productId: z.ZodString;
43
+ assignedAt: z.ZodDefault<z.ZodCoercedDate<unknown>>;
44
+ }, z.core.$strip>;
45
+ /** Native Relational storage for memberships. */
46
+ export declare const membershipsStorage: {
47
+ readonly kind: "relational";
48
+ readonly tables: {
49
+ readonly membershipPlan: {
50
+ readonly shape: z.ZodObject<{
51
+ id: z.ZodString;
52
+ name: z.ZodString;
53
+ slug: z.ZodString;
54
+ description: z.ZodOptional<z.ZodString>;
55
+ price: z.ZodNumber;
56
+ billingInterval: z.ZodString;
57
+ trialDays: z.ZodNumber;
58
+ features: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
59
+ isActive: z.ZodBoolean;
60
+ maxMembers: z.ZodOptional<z.ZodNumber>;
61
+ sortOrder: z.ZodNumber;
62
+ createdAt: z.ZodDefault<z.ZodCoercedDate<unknown>>;
63
+ updatedAt: z.ZodDefault<z.ZodCoercedDate<unknown>>;
64
+ }, z.core.$strip>;
65
+ };
66
+ readonly membership: {
67
+ readonly shape: z.ZodObject<{
68
+ id: z.ZodString;
69
+ customerId: z.ZodString;
70
+ planId: z.ZodString;
71
+ status: z.ZodString;
72
+ startDate: z.ZodCoercedDate<unknown>;
73
+ endDate: z.ZodOptional<z.ZodCoercedDate<unknown>>;
74
+ trialEndDate: z.ZodOptional<z.ZodCoercedDate<unknown>>;
75
+ cancelledAt: z.ZodOptional<z.ZodCoercedDate<unknown>>;
76
+ pausedAt: z.ZodOptional<z.ZodCoercedDate<unknown>>;
77
+ createdAt: z.ZodDefault<z.ZodCoercedDate<unknown>>;
78
+ updatedAt: z.ZodDefault<z.ZodCoercedDate<unknown>>;
79
+ }, z.core.$strip>;
80
+ };
81
+ readonly membershipBenefit: {
82
+ readonly shape: z.ZodObject<{
83
+ id: z.ZodString;
84
+ planId: z.ZodString;
85
+ type: z.ZodString;
86
+ value: z.ZodString;
87
+ description: z.ZodOptional<z.ZodString>;
88
+ isActive: z.ZodBoolean;
89
+ createdAt: z.ZodDefault<z.ZodCoercedDate<unknown>>;
90
+ }, z.core.$strip>;
91
+ };
92
+ readonly membershipProduct: {
93
+ readonly shape: z.ZodObject<{
94
+ id: z.ZodString;
95
+ planId: z.ZodString;
96
+ productId: z.ZodString;
97
+ assignedAt: z.ZodDefault<z.ZodCoercedDate<unknown>>;
98
+ }, z.core.$strip>;
99
+ };
100
+ };
101
+ };
102
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,8BAA8B;;;;;;;;;;;;;;iBAczC,CAAC;AAEH,eAAO,MAAM,0BAA0B;;;;;;;;;;;;iBAYrC,CAAC;AAEH,eAAO,MAAM,iCAAiC;;;;;;;;iBAQ5C,CAAC;AAEH,eAAO,MAAM,iCAAiC;;;;;iBAK5C,CAAC;AAEH,iDAAiD;AACjD,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgBc,CAAC"}