@coursebuilder/server 0.1.0-canary.0.0c9beb2ae

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 (156) hide show
  1. package/LICENSE +21 -0
  2. package/dist/actions/checkout.d.ts +6 -0
  3. package/dist/actions/checkout.js +9 -0
  4. package/dist/actions/checkout.js.map +1 -0
  5. package/dist/actions/claimed.d.ts +6 -0
  6. package/dist/actions/claimed.js +8 -0
  7. package/dist/actions/claimed.js.map +1 -0
  8. package/dist/actions/create-magic-link.d.ts +6 -0
  9. package/dist/actions/create-magic-link.js +9 -0
  10. package/dist/actions/create-magic-link.js.map +1 -0
  11. package/dist/actions/index.d.ts +11 -0
  12. package/dist/actions/index.js +18 -0
  13. package/dist/actions/index.js.map +1 -0
  14. package/dist/actions/prices-coupon-for-code.d.ts +6 -0
  15. package/dist/actions/prices-coupon-for-code.js +63 -0
  16. package/dist/actions/prices-coupon-for-code.js.map +1 -0
  17. package/dist/actions/prices-formatted.d.ts +6 -0
  18. package/dist/actions/prices-formatted.js +8 -0
  19. package/dist/actions/prices-formatted.js.map +1 -0
  20. package/dist/actions/process-refund.d.ts +1 -0
  21. package/dist/actions/process-refund.js +8 -0
  22. package/dist/actions/process-refund.js.map +1 -0
  23. package/dist/actions/redeem.d.ts +1 -0
  24. package/dist/actions/redeem.js +8 -0
  25. package/dist/actions/redeem.js.map +1 -0
  26. package/dist/actions/transfer-purchase.d.ts +1 -0
  27. package/dist/actions/transfer-purchase.js +8 -0
  28. package/dist/actions/transfer-purchase.js.map +1 -0
  29. package/dist/actions/user-lookup.d.ts +6 -0
  30. package/dist/actions/user-lookup.js +9 -0
  31. package/dist/actions/user-lookup.js.map +1 -0
  32. package/dist/adapter-BtDS6LDw.d.ts +9 -0
  33. package/dist/chunk-22AMOZYZ.js +67 -0
  34. package/dist/chunk-22AMOZYZ.js.map +1 -0
  35. package/dist/chunk-4EQQSW57.js +32 -0
  36. package/dist/chunk-4EQQSW57.js.map +1 -0
  37. package/dist/chunk-4LZZLN6T.js +52 -0
  38. package/dist/chunk-4LZZLN6T.js.map +1 -0
  39. package/dist/chunk-4QQA3TC2.js +29 -0
  40. package/dist/chunk-4QQA3TC2.js.map +1 -0
  41. package/dist/chunk-4TSEPUSC.js +160 -0
  42. package/dist/chunk-4TSEPUSC.js.map +1 -0
  43. package/dist/chunk-5O4UO4IR.js +93 -0
  44. package/dist/chunk-5O4UO4IR.js.map +1 -0
  45. package/dist/chunk-7FCQOLKL.js +26 -0
  46. package/dist/chunk-7FCQOLKL.js.map +1 -0
  47. package/dist/chunk-AZLUMIIF.js +8 -0
  48. package/dist/chunk-AZLUMIIF.js.map +1 -0
  49. package/dist/chunk-E6HV6TNI.js +38 -0
  50. package/dist/chunk-E6HV6TNI.js.map +1 -0
  51. package/dist/chunk-ECNJPNPU.js +54 -0
  52. package/dist/chunk-ECNJPNPU.js.map +1 -0
  53. package/dist/chunk-F3KUYN5I.js +111 -0
  54. package/dist/chunk-F3KUYN5I.js.map +1 -0
  55. package/dist/chunk-G63YAJF2.js +107 -0
  56. package/dist/chunk-G63YAJF2.js.map +1 -0
  57. package/dist/chunk-JFR7XO72.js +7 -0
  58. package/dist/chunk-JFR7XO72.js.map +1 -0
  59. package/dist/chunk-KNC7QVGZ.js +26 -0
  60. package/dist/chunk-KNC7QVGZ.js.map +1 -0
  61. package/dist/chunk-ODSSRMD2.js +270 -0
  62. package/dist/chunk-ODSSRMD2.js.map +1 -0
  63. package/dist/chunk-VEKYIR7I.js +26 -0
  64. package/dist/chunk-VEKYIR7I.js.map +1 -0
  65. package/dist/chunk-W7YAT4NR.js +12 -0
  66. package/dist/chunk-W7YAT4NR.js.map +1 -0
  67. package/dist/chunk-WGAPYIUP.js +56 -0
  68. package/dist/chunk-WGAPYIUP.js.map +1 -0
  69. package/dist/chunk-WYNH2AWD.js +7 -0
  70. package/dist/chunk-WYNH2AWD.js.map +1 -0
  71. package/dist/chunk-Y5X5J55Z.js +384 -0
  72. package/dist/chunk-Y5X5J55Z.js.map +1 -0
  73. package/dist/chunk-YFLGJIMA.js +216 -0
  74. package/dist/chunk-YFLGJIMA.js.map +1 -0
  75. package/dist/chunk-ZFZNN4E5.js +7 -0
  76. package/dist/chunk-ZFZNN4E5.js.map +1 -0
  77. package/dist/create-inngest-middleware.d.ts +635 -0
  78. package/dist/create-inngest-middleware.js +12 -0
  79. package/dist/create-inngest-middleware.js.map +1 -0
  80. package/dist/http-router.d.ts +20 -0
  81. package/dist/http-router.js +24 -0
  82. package/dist/http-router.js.map +1 -0
  83. package/dist/http.d.ts +38 -0
  84. package/dist/http.js +32 -0
  85. package/dist/http.js.map +1 -0
  86. package/dist/index.d.ts +34 -0
  87. package/dist/index.js +365 -0
  88. package/dist/index.js.map +1 -0
  89. package/dist/magic-string.es-ENO43NON.js +1389 -0
  90. package/dist/magic-string.es-ENO43NON.js.map +1 -0
  91. package/dist/runtime/actions.d.ts +5 -0
  92. package/dist/runtime/actions.js +8 -0
  93. package/dist/runtime/actions.js.map +1 -0
  94. package/dist/runtime/assert.d.ts +15 -0
  95. package/dist/runtime/assert.js +8 -0
  96. package/dist/runtime/assert.js.map +1 -0
  97. package/dist/runtime/cookie.d.ts +8 -0
  98. package/dist/runtime/cookie.js +8 -0
  99. package/dist/runtime/cookie.js.map +1 -0
  100. package/dist/runtime/env.d.ts +9 -0
  101. package/dist/runtime/env.js +11 -0
  102. package/dist/runtime/env.js.map +1 -0
  103. package/dist/runtime/env.test.d.ts +2 -0
  104. package/dist/runtime/env.test.js +14956 -0
  105. package/dist/runtime/env.test.js.map +1 -0
  106. package/dist/runtime/init.d.ts +26 -0
  107. package/dist/runtime/init.js +14 -0
  108. package/dist/runtime/init.js.map +1 -0
  109. package/dist/runtime/logger.d.ts +4 -0
  110. package/dist/runtime/logger.js +10 -0
  111. package/dist/runtime/logger.js.map +1 -0
  112. package/dist/runtime/merge.d.ts +4 -0
  113. package/dist/runtime/merge.js +8 -0
  114. package/dist/runtime/merge.js.map +1 -0
  115. package/dist/runtime/providers.d.ts +21 -0
  116. package/dist/runtime/providers.js +9 -0
  117. package/dist/runtime/providers.js.map +1 -0
  118. package/dist/runtime/web.d.ts +29 -0
  119. package/dist/runtime/web.js +16 -0
  120. package/dist/runtime/web.js.map +1 -0
  121. package/package.json +65 -0
  122. package/src/actions/actions.test.ts +232 -0
  123. package/src/actions/checkout.ts +160 -0
  124. package/src/actions/claimed.ts +40 -0
  125. package/src/actions/create-magic-link.ts +78 -0
  126. package/src/actions/index.ts +401 -0
  127. package/src/actions/prices-coupon-for-code.ts +91 -0
  128. package/src/actions/prices-formatted.ts +313 -0
  129. package/src/actions/process-refund.ts +2 -0
  130. package/src/actions/redeem.ts +2 -0
  131. package/src/actions/transfer-purchase.ts +2 -0
  132. package/src/actions/user-lookup.ts +37 -0
  133. package/src/adapter.ts +28 -0
  134. package/src/create-inngest-middleware.ts +157 -0
  135. package/src/http-actions.ts +29 -0
  136. package/src/http-router.ts +79 -0
  137. package/src/http.test.ts +46 -0
  138. package/src/http.ts +83 -0
  139. package/src/index.test.ts +21 -0
  140. package/src/index.ts +44 -0
  141. package/src/mock-adapter.ts +398 -0
  142. package/src/mock-payment-provider.ts +56 -0
  143. package/src/resource-chat.ts +371 -0
  144. package/src/runtime/actions.ts +25 -0
  145. package/src/runtime/assert.ts +55 -0
  146. package/src/runtime/cookie.ts +12 -0
  147. package/src/runtime/env.test.ts +49 -0
  148. package/src/runtime/env.ts +63 -0
  149. package/src/runtime/init.ts +112 -0
  150. package/src/runtime/logger.ts +6 -0
  151. package/src/runtime/merge.ts +25 -0
  152. package/src/runtime/providers.ts +38 -0
  153. package/src/runtime/web.ts +199 -0
  154. package/src/streaming-chat-prompt-executor.ts +43 -0
  155. package/src/type-contracts.test.ts +167 -0
  156. package/src/web-body-parse.test.ts +55 -0
@@ -0,0 +1,384 @@
1
+ // src/create-inngest-middleware.ts
2
+ import {
3
+ EventSchemas,
4
+ Inngest,
5
+ InngestMiddleware
6
+ } from "inngest";
7
+
8
+ // src/mock-adapter.ts
9
+ var mockServerAdapter = {
10
+ client: null,
11
+ getPersonalOrganization: async () => null,
12
+ createPersonalOrganization: async () => {
13
+ throw new Error("Method not implemented.");
14
+ },
15
+ transferPurchaseToUser: async () => {
16
+ return null;
17
+ },
18
+ redeemFullPriceCoupon: async () => {
19
+ return {};
20
+ },
21
+ archiveProduct: async (productId) => {
22
+ return {};
23
+ },
24
+ updateProduct: async (product) => {
25
+ return {};
26
+ },
27
+ createProduct: async (product) => {
28
+ return {};
29
+ },
30
+ createPurchaseTransfer: async () => {
31
+ return Promise.resolve();
32
+ },
33
+ createCoupon: async (input) => {
34
+ return [];
35
+ },
36
+ addResourceToProduct: async (options) => {
37
+ return null;
38
+ },
39
+ incrementCouponUsedCount(_) {
40
+ return Promise.resolve();
41
+ },
42
+ getExistingNonBulkValidPurchasesOfProduct: async () => {
43
+ return [];
44
+ },
45
+ getMerchantPriceForProductId: async (productId) => null,
46
+ getMerchantProductForProductId: async (productId) => null,
47
+ getMerchantAccount: async () => null,
48
+ createMerchantCustomer: async () => null,
49
+ createMerchantCoupon: async () => ({}),
50
+ getMerchantCustomerForUserId: async () => null,
51
+ getUpgradableProducts: async () => [],
52
+ createPurchase: async (options) => {
53
+ throw new Error("Method not implemented.");
54
+ },
55
+ availableUpgradesForProduct(purchases, productId) {
56
+ return Promise.resolve([]);
57
+ },
58
+ clearLessonProgressForUser(options) {
59
+ return Promise.resolve(void 0);
60
+ },
61
+ completeLessonProgressForUser(options) {
62
+ return Promise.resolve(null);
63
+ },
64
+ couponForIdOrCode(options) {
65
+ return Promise.resolve(null);
66
+ },
67
+ createMerchantChargeAndPurchase(options) {
68
+ throw new Error("Method not implemented.");
69
+ },
70
+ findOrCreateMerchantCustomer(options) {
71
+ return Promise.resolve(null);
72
+ },
73
+ createMerchantEvent(options) {
74
+ throw new Error("Method not implemented.");
75
+ },
76
+ getMerchantEventByIdentifier(identifier) {
77
+ return Promise.resolve(null);
78
+ },
79
+ getMerchantEventsByAccount(merchantAccountId) {
80
+ return Promise.resolve([]);
81
+ },
82
+ findOrCreateUser(email, name) {
83
+ throw new Error("Method not implemented.");
84
+ },
85
+ getCoupon(couponIdOrCode) {
86
+ return Promise.resolve(null);
87
+ },
88
+ getCouponWithBulkPurchases(couponId) {
89
+ return Promise.resolve(null);
90
+ },
91
+ getDefaultCoupon(productIds) {
92
+ return Promise.resolve(null);
93
+ },
94
+ getLessonProgressCountsByDate() {
95
+ return Promise.resolve([]);
96
+ },
97
+ getLessonProgressForUser(userId) {
98
+ return Promise.resolve([]);
99
+ },
100
+ getModuleProgressForUser(userId, moduleId) {
101
+ return Promise.resolve({
102
+ completedLessons: [],
103
+ nextResource: null,
104
+ percentCompleted: 0,
105
+ completedLessonsCount: 0,
106
+ totalLessonsCount: 0
107
+ });
108
+ },
109
+ getLessonProgresses() {
110
+ return Promise.resolve([]);
111
+ },
112
+ getMerchantCharge(merchantChargeId) {
113
+ return Promise.resolve(null);
114
+ },
115
+ getMerchantCouponForTypeAndPercent(params) {
116
+ return Promise.resolve(null);
117
+ },
118
+ getMerchantCouponsForTypeAndPercent(params) {
119
+ return Promise.resolve([]);
120
+ },
121
+ getMerchantCouponForTypeAndAmount(params) {
122
+ return Promise.resolve(null);
123
+ },
124
+ getMerchantCoupon(merchantCouponId) {
125
+ return Promise.resolve(null);
126
+ },
127
+ getMerchantProduct(stripeProductId) {
128
+ return Promise.resolve(null);
129
+ },
130
+ getPrice(productId) {
131
+ return Promise.resolve(null);
132
+ },
133
+ getPriceForProduct(productId) {
134
+ return Promise.resolve(null);
135
+ },
136
+ getProduct(productId, withResources = true) {
137
+ return Promise.resolve(null);
138
+ },
139
+ getProductResources(productId) {
140
+ return Promise.resolve(null);
141
+ },
142
+ getPurchaseCountForProduct(productId) {
143
+ return Promise.resolve(0);
144
+ },
145
+ getPurchase(purchaseId) {
146
+ return Promise.resolve(null);
147
+ },
148
+ getPurchaseDetails(purchaseId, userId) {
149
+ return Promise.resolve({ availableUpgrades: [] });
150
+ },
151
+ getPurchaseForStripeCharge(stripeChargeId) {
152
+ return Promise.resolve(null);
153
+ },
154
+ getPurchaseByCheckoutSessionId(checkoutSessionId) {
155
+ return Promise.resolve(null);
156
+ },
157
+ getPurchaseUserTransferById(options) {
158
+ return Promise.resolve(null);
159
+ },
160
+ getPurchaseWithUser(purchaseId) {
161
+ return Promise.resolve(null);
162
+ },
163
+ getUserWithPurchasersByEmail(email) {
164
+ return Promise.resolve(null);
165
+ },
166
+ getPurchasesForUser(userId) {
167
+ return Promise.resolve([]);
168
+ },
169
+ getEntitlementsForUser(params) {
170
+ return Promise.resolve([]);
171
+ },
172
+ getEntitlementTypeByName(name) {
173
+ return Promise.resolve(null);
174
+ },
175
+ getUserById(userId) {
176
+ return Promise.resolve(null);
177
+ },
178
+ pricesOfPurchasesTowardOneBundle(options) {
179
+ return Promise.resolve([]);
180
+ },
181
+ toggleLessonProgressForUser(options) {
182
+ return Promise.resolve(null);
183
+ },
184
+ transferPurchasesToNewUser(options) {
185
+ return Promise.resolve(void 0);
186
+ },
187
+ updatePurchaseStatusForCharge(chargeId, status) {
188
+ return Promise.resolve(void 0);
189
+ },
190
+ updatePurchaseUserTransferTransferState(options) {
191
+ return Promise.resolve(null);
192
+ },
193
+ addResourceToResource: async (options) => {
194
+ return {};
195
+ },
196
+ removeResourceFromResource: async (options) => {
197
+ return null;
198
+ },
199
+ createContentResource: async (resource) => {
200
+ return resource;
201
+ },
202
+ getEvent: async (_) => {
203
+ return null;
204
+ },
205
+ createEvent: async (_) => {
206
+ return null;
207
+ },
208
+ createEventSeries: async (_) => {
209
+ return { eventSeries: null, childEvents: [] };
210
+ },
211
+ createCohort: async (_) => {
212
+ return { cohort: null, product: void 0 };
213
+ },
214
+ createWorkshop: async (_) => {
215
+ return {
216
+ workshop: null,
217
+ sections: [],
218
+ lessons: [],
219
+ product: void 0
220
+ };
221
+ },
222
+ getContentResource: async (_) => {
223
+ return null;
224
+ },
225
+ getVideoResource: async (_) => {
226
+ return null;
227
+ },
228
+ getParentResourceOfVideoResource: async (_) => {
229
+ return null;
230
+ },
231
+ updateContentResourceFields(_) {
232
+ return null;
233
+ },
234
+ createOrganization: async () => null,
235
+ getOrganization: async () => null,
236
+ addMemberToOrganization: async () => null,
237
+ removeMemberFromOrganization: async () => void 0,
238
+ addRoleForMember: async () => void 0,
239
+ removeRoleForMember: async () => void 0,
240
+ getMembershipsForUser: async () => [],
241
+ getOrganizationMembers: async () => [],
242
+ getMerchantSubscription: async () => null,
243
+ createMerchantSubscription: async () => null,
244
+ updateMerchantSubscription: async () => null,
245
+ deleteMerchantSubscription: async () => void 0,
246
+ createMerchantSession: async () => Promise.resolve({}),
247
+ createSubscription: async () => null,
248
+ getSubscriptionForStripeId: async () => null,
249
+ updateSubscriptionStatus: async () => void 0,
250
+ getPurchasesForBulkCouponId: async () => []
251
+ };
252
+
253
+ // src/mock-payment-provider.ts
254
+ var mockPaymentsAdapter = {
255
+ getCouponPercentOff: async () => 0,
256
+ getCouponAmountOff: async () => 0,
257
+ createCoupon: async () => "mock-coupon-id",
258
+ createPromotionCode: async () => "mock-promotion-code-id",
259
+ createCheckoutSession: async () => "mock-checkout-session-id",
260
+ createCustomer: async () => "mock-customer-id",
261
+ verifyWebhookSignature: async () => true,
262
+ getCheckoutSession: async () => ({ id: "mock-checkout-session-id" }),
263
+ getCustomer: async () => ({ id: "mock-customer-id" }),
264
+ updateCustomer: async () => {
265
+ },
266
+ refundCharge: async () => ({}),
267
+ updateProduct: async () => {
268
+ },
269
+ updatePrice: async () => {
270
+ },
271
+ getProduct: async () => ({}),
272
+ getPrice: async () => ({}),
273
+ createPrice: async () => ({}),
274
+ createProduct: async () => ({}),
275
+ getSubscription: async () => ({}),
276
+ getBillingPortalUrl: async () => "mock-billing-portal-url",
277
+ updateSubscriptionItemQuantity: async () => ({})
278
+ };
279
+ var mockPaymentProvider = {
280
+ id: "mock-stripe",
281
+ name: "Mock Stripe",
282
+ type: "payment",
283
+ options: {
284
+ errorRedirectUrl: "mock-error-redirect-url",
285
+ cancelUrl: "mock-cancel-url",
286
+ baseSuccessUrl: "mock-base-success-url",
287
+ paymentsAdapter: mockPaymentsAdapter
288
+ },
289
+ getSubscriptionInfo: async () => ({}),
290
+ getPurchaseInfo: async () => ({}),
291
+ createCheckoutSession: async () => ({
292
+ redirect: "mock-checkout-session-id",
293
+ status: 303
294
+ }),
295
+ getCustomer: async () => ({ id: "mock-customer-id" }),
296
+ updateCustomer: async () => {
297
+ },
298
+ refundCharge: async () => ({}),
299
+ updateProduct: async () => {
300
+ },
301
+ updatePrice: async () => {
302
+ },
303
+ getProduct: async () => ({}),
304
+ getPrice: async () => ({}),
305
+ createPrice: async () => ({}),
306
+ createProduct: async () => ({}),
307
+ getSubscription: async () => ({}),
308
+ getBillingPortalUrl: async () => "mock-billing-portal-url"
309
+ };
310
+
311
+ // src/create-inngest-middleware.ts
312
+ import {
313
+ MockOpenAIProvider
314
+ } from "@coursebuilder/core/providers/openai";
315
+ import {
316
+ MockPartykitProvider
317
+ } from "@coursebuilder/core/providers/partykit";
318
+ import {
319
+ mockSlackProvider
320
+ } from "@coursebuilder/core/providers/slack";
321
+ var MockTranscriptionProvider = {
322
+ id: "mock-transcription",
323
+ name: "Mock Transcription",
324
+ type: "transcription",
325
+ options: {
326
+ apiKey: "mock-api-key",
327
+ callbackUrl: "mock-callback-url"
328
+ },
329
+ apiKey: "mock-api-key",
330
+ callbackUrl: "mock-callback-url",
331
+ getCallbackUrl: () => "mock-callback-url",
332
+ initiateTranscription: async () => ({ mock: "transcription" }),
333
+ handleCallback: () => ({
334
+ srt: "mock-srt",
335
+ transcript: "mock-transcript",
336
+ wordLevelSrt: "mock-word-level-srt"
337
+ })
338
+ };
339
+ var defineCourseBuilderFunctions = (functions) => functions;
340
+ var createInngestMiddleware = (context) => {
341
+ return new InngestMiddleware({
342
+ name: "Course Builder Middleware",
343
+ init() {
344
+ return {
345
+ onFunctionRun() {
346
+ return {
347
+ transformInput() {
348
+ return { ctx: context };
349
+ }
350
+ };
351
+ }
352
+ };
353
+ }
354
+ });
355
+ };
356
+ var schemas = new EventSchemas().fromRecord();
357
+ var coreInngest = new Inngest({
358
+ id: "core-inngest",
359
+ schemas,
360
+ middleware: [
361
+ createInngestMiddleware({
362
+ db: mockServerAdapter,
363
+ siteRootUrl: "",
364
+ partyKitRootUrl: "",
365
+ transcriptProvider: MockTranscriptionProvider,
366
+ openaiProvider: MockOpenAIProvider,
367
+ partyProvider: MockPartykitProvider,
368
+ paymentProvider: mockPaymentProvider,
369
+ emailProvider: {},
370
+ notificationProvider: mockSlackProvider,
371
+ getAuthConfig: () => ({}),
372
+ mediaUploadProvider: {
373
+ deleteFiles: async (_) => Promise.resolve({ success: true })
374
+ }
375
+ })
376
+ ]
377
+ });
378
+
379
+ export {
380
+ defineCourseBuilderFunctions,
381
+ createInngestMiddleware,
382
+ coreInngest
383
+ };
384
+ //# sourceMappingURL=chunk-Y5X5J55Z.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/create-inngest-middleware.ts","../src/mock-adapter.ts","../src/mock-payment-provider.ts"],"sourcesContent":["import {\n\tEventSchemas,\n\tGetEvents,\n\tGetFunctionInput,\n\tHandler,\n\tInngest,\n\tInngestFunction,\n\tInngestMiddleware,\n} from 'inngest'\n\nimport type { ServerAdapter } from './adapter'\nimport { mockServerAdapter } from './mock-adapter'\nimport { mockPaymentProvider } from './mock-payment-provider'\nimport type {\n\tCourseBuilderAuthConfig,\n\tCourseBuilderEmailProvider,\n} from '@coursebuilder/core/auth'\nimport type { CourseBuilderCoreEvents } from '@coursebuilder/core/events'\nimport type { TranscriptionConfig } from '@coursebuilder/core/providers'\nimport {\n\tLlmProviderConfig,\n\tMockOpenAIProvider,\n} from '@coursebuilder/core/providers/openai'\nimport {\n\tMockPartykitProvider,\n\tPartyProviderConfig,\n} from '@coursebuilder/core/providers/partykit'\nimport {\n\tmockSlackProvider,\n\tNotificationProviderConfig,\n} from '@coursebuilder/core/providers/slack'\nimport { PaymentsProviderConfig } from '@coursebuilder/core/types'\n\nconst MockTranscriptionProvider: TranscriptionConfig = {\n\tid: 'mock-transcription',\n\tname: 'Mock Transcription',\n\ttype: 'transcription',\n\toptions: {\n\t\tapiKey: 'mock-api-key',\n\t\tcallbackUrl: 'mock-callback-url',\n\t},\n\tapiKey: 'mock-api-key',\n\tcallbackUrl: 'mock-callback-url',\n\tgetCallbackUrl: () => 'mock-callback-url',\n\tinitiateTranscription: async () => ({ mock: 'transcription' }),\n\thandleCallback: () => ({\n\t\tsrt: 'mock-srt',\n\t\ttranscript: 'mock-transcript',\n\t\twordLevelSrt: 'mock-word-level-srt',\n\t}),\n}\n\nexport interface CoreInngestContext {\n\tdb: ServerAdapter\n\tsiteRootUrl: string\n\ttranscriptProvider: TranscriptionConfig\n\topenaiProvider: LlmProviderConfig\n\tpartyProvider: PartyProviderConfig\n\tpaymentProvider?: PaymentsProviderConfig\n\temailProvider?: CourseBuilderEmailProvider\n\tnotificationProvider?: NotificationProviderConfig\n\tgetAuthConfig: () => CourseBuilderAuthConfig\n\tmediaUploadProvider: {\n\t\tdeleteFiles: (fileKey: string) => Promise<{ success: boolean }>\n\t}\n}\n\nexport type CoreInngestFunctionInput = GetFunctionInput<CoreInngest>\n\n/** A server composition input with a statically limited context and event. */\nexport type CourseBuilderHandlerInput<\n\tTContext extends Partial<CoreInngestContext>,\n\tTEventName extends Extract<keyof CourseBuilderCoreEvents, string>,\n\tTEvent extends CourseBuilderCoreEvents[TEventName] =\n\t\tCourseBuilderCoreEvents[TEventName],\n> = Omit<CoreInngestFunctionInput, keyof CoreInngestContext | 'event'> &\n\tTContext & {\n\t\tevent: TEvent\n\t}\n\nexport type CoreInngestFunctionInputFor<\n\tTContext extends Partial<CoreInngestContext>,\n\tTEventName extends Extract<keyof CourseBuilderCoreEvents, string>,\n\tTEvent extends CourseBuilderCoreEvents[TEventName] =\n\t\tCourseBuilderCoreEvents[TEventName],\n> = CourseBuilderHandlerInput<TContext, TEventName, TEvent>\n\nexport type CoreInngestTrigger = InngestFunction.Trigger<\n\tkeyof GetEvents<CoreInngest>\n>\nexport type CoreInngestHandler = Handler.Any\n\nexport type CourseBuilderFunctionDefinition = {\n\tconfig: { id: string }\n\ttrigger: CoreInngestTrigger\n\thandler: CoreInngestHandler\n}\n\n/** Validates function definitions without widening their inferred config types. */\nexport const defineCourseBuilderFunctions = <TFunctions extends unknown[]>(\n\tfunctions: TFunctions &\n\t\t(TFunctions[number] extends CourseBuilderFunctionDefinition\n\t\t\t? unknown\n\t\t\t: never),\n): TFunctions => functions\n\nexport const createInngestMiddleware = <\n\tTCourseBuilderContext extends CoreInngestContext = CoreInngestContext,\n>(\n\tcontext: TCourseBuilderContext,\n) => {\n\treturn new InngestMiddleware({\n\t\tname: 'Course Builder Middleware',\n\t\tinit() {\n\t\t\treturn {\n\t\t\t\tonFunctionRun() {\n\t\t\t\t\treturn {\n\t\t\t\t\t\ttransformInput() {\n\t\t\t\t\t\t\t// kill me - this middleware is just for types\n\t\t\t\t\t\t\ttype MappedCoreContext = {\n\t\t\t\t\t\t\t\t[K in keyof TCourseBuilderContext]: TCourseBuilderContext[K]\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\treturn { ctx: context as unknown as MappedCoreContext }\n\t\t\t\t\t\t},\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t}\n\t\t},\n\t})\n}\n\nconst schemas = new EventSchemas().fromRecord<CourseBuilderCoreEvents>()\n\nexport const coreInngest = new Inngest({\n\tid: 'core-inngest',\n\tschemas,\n\tmiddleware: [\n\t\tcreateInngestMiddleware({\n\t\t\tdb: mockServerAdapter,\n\t\t\tsiteRootUrl: '',\n\t\t\tpartyKitRootUrl: '',\n\t\t\ttranscriptProvider: MockTranscriptionProvider,\n\t\t\topenaiProvider: MockOpenAIProvider,\n\t\t\tpartyProvider: MockPartykitProvider,\n\t\t\tpaymentProvider: mockPaymentProvider,\n\t\t\temailProvider: {} as CourseBuilderEmailProvider,\n\t\t\tnotificationProvider: mockSlackProvider,\n\t\t\tgetAuthConfig: () => ({}) as CourseBuilderAuthConfig,\n\t\t\tmediaUploadProvider: {\n\t\t\t\tdeleteFiles: async (_) => Promise.resolve({ success: true }),\n\t\t\t},\n\t\t}),\n\t],\n})\n\nexport type CoreInngest = typeof coreInngest\n","import {\n\tContentResourceResource,\n\tEntitlement,\n\tMerchantCharge,\n\tUpgradableProduct,\n} from '@coursebuilder/core/schemas'\nimport { AttributionSnapshotPayload } from '@coursebuilder/core/schemas/attribution-snapshot'\nimport { type ContentResource } from '@coursebuilder/core/schemas/content-resource-schema'\nimport { Coupon } from '@coursebuilder/core/schemas/coupon-schema'\nimport { MerchantCoupon } from '@coursebuilder/core/schemas/merchant-coupon-schema'\nimport { MerchantCustomer } from '@coursebuilder/core/schemas/merchant-customer-schema'\nimport { MerchantEvents } from '@coursebuilder/core/schemas/merchant-events-schema'\nimport { MerchantProduct } from '@coursebuilder/core/schemas/merchant-product-schema'\nimport { MerchantSession } from '@coursebuilder/core/schemas/merchant-session'\nimport { Price } from '@coursebuilder/core/schemas/price-schema'\nimport { Product } from '@coursebuilder/core/schemas/product-schema'\nimport { Purchase } from '@coursebuilder/core/schemas/purchase-schema'\nimport {\n\tPurchaseUserTransfer,\n\tPurchaseUserTransferState,\n} from '@coursebuilder/core/schemas/purchase-user-transfer-schema'\nimport {\n\tModuleProgress,\n\tResourceProgress,\n} from '@coursebuilder/core/schemas/resource-progress-schema'\nimport { User } from '@coursebuilder/core/schemas/user-schema'\n\nimport type { ServerAdapter } from './adapter'\n\nexport const mockServerAdapter: ServerAdapter = {\n\tclient: null,\n\tgetPersonalOrganization: async () => null,\n\tcreatePersonalOrganization: async () => {\n\t\tthrow new Error('Method not implemented.')\n\t},\n\ttransferPurchaseToUser: async () => {\n\t\treturn null\n\t},\n\tredeemFullPriceCoupon: async () => {\n\t\treturn {} as any\n\t},\n\tarchiveProduct: async (productId) => {\n\t\treturn {} as any\n\t},\n\tupdateProduct: async (product) => {\n\t\treturn {} as any\n\t},\n\tcreateProduct: async (product) => {\n\t\treturn {} as any\n\t},\n\tcreatePurchaseTransfer: async () => {\n\t\treturn Promise.resolve()\n\t},\n\tcreateCoupon: async (input) => {\n\t\treturn []\n\t},\n\taddResourceToProduct: async (options) => {\n\t\treturn null\n\t},\n\tincrementCouponUsedCount(_) {\n\t\treturn Promise.resolve()\n\t},\n\tgetExistingNonBulkValidPurchasesOfProduct: async () => {\n\t\treturn []\n\t},\n\tgetMerchantPriceForProductId: async (productId) => null,\n\tgetMerchantProductForProductId: async (productId) => null,\n\tgetMerchantAccount: async () => null,\n\tcreateMerchantCustomer: async () => null,\n\tcreateMerchantCoupon: async () => ({}) as MerchantCoupon,\n\tgetMerchantCustomerForUserId: async () => null,\n\tgetUpgradableProducts: async () => [],\n\tcreatePurchase: async (options) => {\n\t\tthrow new Error('Method not implemented.')\n\t},\n\tavailableUpgradesForProduct(\n\t\tpurchases: any,\n\t\tproductId: string,\n\t): Promise<\n\t\t{\n\t\t\tupgradableTo: { id: string; name: string }\n\t\t\tupgradableFrom: { id: string; name: string }\n\t\t}[]\n\t> {\n\t\treturn Promise.resolve([])\n\t},\n\tclearLessonProgressForUser(options: {\n\t\tuserId: string\n\t\tlessons: { id: string; slug: string }[]\n\t}): Promise<void> {\n\t\treturn Promise.resolve(undefined)\n\t},\n\tcompleteLessonProgressForUser(options: {\n\t\tuserId: string\n\t\tlessonId?: string\n\t}): Promise<ResourceProgress | null> {\n\t\treturn Promise.resolve(null)\n\t},\n\tcouponForIdOrCode(options: {\n\t\tcode?: string\n\t\tcouponId?: string\n\t}): Promise<(Coupon & { merchantCoupon: MerchantCoupon }) | null> {\n\t\treturn Promise.resolve(null)\n\t},\n\tcreateMerchantChargeAndPurchase(options: {\n\t\tuserId: string\n\t\tproductId: string\n\t\tstripeChargeId: string\n\t\tstripeCouponId?: string\n\t\tmerchantAccountId: string\n\t\tmerchantProductId: string\n\t\tmerchantCustomerId: string\n\t\tstripeChargeAmount: number\n\t\tquantity?: number\n\t\tbulk?: boolean\n\t\tcheckoutSessionId: string\n\t\tappliedPPPStripeCouponId?: string\n\t\tupgradedFromPurchaseId?: string\n\t\tusedCouponId?: string\n\t\tcountry?: string\n\t\torganizationId?: string\n\t\tpurchaseBenefitsTransport?: string\n\t\tattributionSnapshot?: AttributionSnapshotPayload\n\t}): Promise<Purchase> {\n\t\tthrow new Error('Method not implemented.')\n\t},\n\tfindOrCreateMerchantCustomer(options: {\n\t\tuser: User\n\t\tidentifier: string\n\t\tmerchantAccountId: string\n\t}): Promise<MerchantCustomer | null> {\n\t\treturn Promise.resolve(null)\n\t},\n\tcreateMerchantEvent(options: {\n\t\tmerchantAccountId: string\n\t\tidentifier: string\n\t\tpayload: Record<string, any>\n\t}): Promise<MerchantEvents> {\n\t\tthrow new Error('Method not implemented.')\n\t},\n\tgetMerchantEventByIdentifier(\n\t\tidentifier: string,\n\t): Promise<MerchantEvents | null> {\n\t\treturn Promise.resolve(null)\n\t},\n\tgetMerchantEventsByAccount(\n\t\tmerchantAccountId: string,\n\t): Promise<MerchantEvents[]> {\n\t\treturn Promise.resolve([])\n\t},\n\tfindOrCreateUser(\n\t\temail: string,\n\t\tname?: string | null,\n\t): Promise<{\n\t\tuser: User\n\t\tisNewUser: boolean\n\t}> {\n\t\tthrow new Error('Method not implemented.')\n\t},\n\tgetCoupon(couponIdOrCode: string): Promise<Coupon | null> {\n\t\treturn Promise.resolve(null)\n\t},\n\tgetCouponWithBulkPurchases(couponId: string): Promise<\n\t\t| (Coupon & {\n\t\t\t\tredeemedBulkCouponPurchases: Purchase[]\n\t\t\t\tbulkPurchase?: Purchase | null\n\t\t })\n\t\t| null\n\t> {\n\t\treturn Promise.resolve(null)\n\t},\n\tgetDefaultCoupon(productIds?: string[]): Promise<{\n\t\tdefaultMerchantCoupon: MerchantCoupon\n\t\tdefaultCoupon: Coupon\n\t} | null> {\n\t\treturn Promise.resolve(null)\n\t},\n\tgetLessonProgressCountsByDate(): Promise<\n\t\t{\n\t\t\tcount: number\n\t\t\tcompletedAt: string\n\t\t}[]\n\t> {\n\t\treturn Promise.resolve([])\n\t},\n\tgetLessonProgressForUser(userId: string): Promise<ResourceProgress[]> {\n\t\treturn Promise.resolve([])\n\t},\n\tgetModuleProgressForUser(\n\t\tuserId: string,\n\t\tmoduleId: string,\n\t): Promise<ModuleProgress> {\n\t\treturn Promise.resolve({\n\t\t\tcompletedLessons: [],\n\t\t\tnextResource: null,\n\t\t\tpercentCompleted: 0,\n\t\t\tcompletedLessonsCount: 0,\n\t\t\ttotalLessonsCount: 0,\n\t\t})\n\t},\n\tgetLessonProgresses(): Promise<ResourceProgress[]> {\n\t\treturn Promise.resolve([])\n\t},\n\tgetMerchantCharge(merchantChargeId: string): Promise<MerchantCharge | null> {\n\t\treturn Promise.resolve(null)\n\t},\n\tgetMerchantCouponForTypeAndPercent(params: {\n\t\ttype: string\n\t\tpercentageDiscount: number\n\t}): Promise<MerchantCoupon | null> {\n\t\treturn Promise.resolve(null)\n\t},\n\tgetMerchantCouponsForTypeAndPercent(params: {\n\t\ttype: string\n\t\tpercentageDiscount: number\n\t}): Promise<MerchantCoupon[]> {\n\t\treturn Promise.resolve([])\n\t},\n\tgetMerchantCouponForTypeAndAmount(params: {\n\t\ttype: string\n\t\tamountDiscount: number\n\t}): Promise<MerchantCoupon | null> {\n\t\treturn Promise.resolve(null)\n\t},\n\tgetMerchantCoupon(merchantCouponId: string): Promise<MerchantCoupon | null> {\n\t\treturn Promise.resolve(null)\n\t},\n\tgetMerchantProduct(stripeProductId: string): Promise<MerchantProduct | null> {\n\t\treturn Promise.resolve(null)\n\t},\n\tgetPrice(productId: string): Promise<Price | null> {\n\t\treturn Promise.resolve(null)\n\t},\n\tgetPriceForProduct(productId: string): Promise<Price | null> {\n\t\treturn Promise.resolve(null)\n\t},\n\tgetProduct(\n\t\tproductId?: string,\n\t\twithResources: boolean = true,\n\t): Promise<Product | null> {\n\t\treturn Promise.resolve(null)\n\t},\n\tgetProductResources(productId: string): Promise<ContentResource[] | null> {\n\t\treturn Promise.resolve(null)\n\t},\n\tgetPurchaseCountForProduct(productId: string): Promise<number> {\n\t\treturn Promise.resolve(0)\n\t},\n\tgetPurchase(purchaseId: string): Promise<Purchase | null> {\n\t\treturn Promise.resolve(null)\n\t},\n\tgetPurchaseDetails(\n\t\tpurchaseId: string,\n\t\tuserId: string,\n\t): Promise<{\n\t\tpurchase?: Purchase\n\t\texistingPurchase?: Purchase | null\n\t\tavailableUpgrades: UpgradableProduct[]\n\t}> {\n\t\treturn Promise.resolve({ availableUpgrades: [] })\n\t},\n\tgetPurchaseForStripeCharge(stripeChargeId: string): Promise<Purchase | null> {\n\t\treturn Promise.resolve(null)\n\t},\n\tgetPurchaseByCheckoutSessionId(\n\t\tcheckoutSessionId: string,\n\t): Promise<Purchase | null> {\n\t\treturn Promise.resolve(null)\n\t},\n\tgetPurchaseUserTransferById(options: { id: string }): Promise<\n\t\t| (PurchaseUserTransfer & {\n\t\t\t\tsourceUser: User\n\t\t\t\ttargetUser: User | null\n\t\t\t\tpurchase: Purchase\n\t\t })\n\t\t| null\n\t> {\n\t\treturn Promise.resolve(null)\n\t},\n\tgetPurchaseWithUser(purchaseId: string): Promise<\n\t\t| (Purchase & {\n\t\t\t\tuser: User\n\t\t })\n\t\t| null\n\t> {\n\t\treturn Promise.resolve(null)\n\t},\n\tgetUserWithPurchasersByEmail(email: string): Promise<any | null> {\n\t\treturn Promise.resolve(null)\n\t},\n\tgetPurchasesForUser(userId?: string): Promise<Purchase[]> {\n\t\treturn Promise.resolve([])\n\t},\n\tgetEntitlementsForUser(params: {\n\t\tuserId: string\n\t\tsourceType?: string\n\t\tentitlementType?: string\n\t}): Promise<Entitlement[]> {\n\t\treturn Promise.resolve([])\n\t},\n\tgetEntitlementTypeByName(\n\t\tname: string,\n\t): Promise<{ id: string; name: string } | null> {\n\t\treturn Promise.resolve(null)\n\t},\n\tgetUserById(userId: string): Promise<User | null> {\n\t\treturn Promise.resolve(null)\n\t},\n\tpricesOfPurchasesTowardOneBundle(options: {\n\t\tuserId: string | undefined\n\t\tbundleId: string\n\t}): Promise<Price[]> {\n\t\treturn Promise.resolve([])\n\t},\n\ttoggleLessonProgressForUser(options: {\n\t\tuserId: string\n\t\tlessonId?: string\n\t\tlessonSlug?: string\n\t}): Promise<ResourceProgress | null> {\n\t\treturn Promise.resolve(null)\n\t},\n\ttransferPurchasesToNewUser(options: {\n\t\tmerchantCustomerId: string\n\t\tuserId: string\n\t}): Promise<unknown> {\n\t\treturn Promise.resolve(undefined)\n\t},\n\tupdatePurchaseStatusForCharge(\n\t\tchargeId: string,\n\t\tstatus: 'Valid' | 'Refunded' | 'Disputed' | 'Banned' | 'Restricted',\n\t): Promise<Purchase | undefined> {\n\t\treturn Promise.resolve(undefined)\n\t},\n\tupdatePurchaseUserTransferTransferState(options: {\n\t\tid: string\n\t\ttransferState: PurchaseUserTransferState\n\t}): Promise<PurchaseUserTransfer | null> {\n\t\treturn Promise.resolve(null)\n\t},\n\taddResourceToResource: async (options) => {\n\t\treturn {} as ContentResourceResource\n\t},\n\tremoveResourceFromResource: async (options) => {\n\t\treturn null\n\t},\n\tcreateContentResource: async (resource) => {\n\t\treturn resource as ContentResource\n\t},\n\tgetEvent: async (_) => {\n\t\treturn null\n\t},\n\tcreateEvent: async (_) => {\n\t\treturn null\n\t},\n\tcreateEventSeries: async (_) => {\n\t\treturn { eventSeries: null as any, childEvents: [] }\n\t},\n\tcreateCohort: async (_) => {\n\t\treturn { cohort: null as any, product: undefined }\n\t},\n\tcreateWorkshop: async (_) => {\n\t\treturn {\n\t\t\tworkshop: null as any,\n\t\t\tsections: [],\n\t\t\tlessons: [],\n\t\t\tproduct: undefined,\n\t\t}\n\t},\n\tgetContentResource: async (_) => {\n\t\treturn null\n\t},\n\tgetVideoResource: async (_) => {\n\t\treturn null\n\t},\n\tgetParentResourceOfVideoResource: async (_) => {\n\t\treturn null\n\t},\n\tupdateContentResourceFields(_) {\n\t\treturn null\n\t},\n\tcreateOrganization: async () => null,\n\tgetOrganization: async () => null,\n\taddMemberToOrganization: async () => null,\n\tremoveMemberFromOrganization: async () => undefined,\n\taddRoleForMember: async () => undefined,\n\tremoveRoleForMember: async () => undefined,\n\tgetMembershipsForUser: async () => [],\n\tgetOrganizationMembers: async () => [],\n\tgetMerchantSubscription: async () => null,\n\tcreateMerchantSubscription: async () => null,\n\tupdateMerchantSubscription: async () => null,\n\tdeleteMerchantSubscription: async () => undefined,\n\tcreateMerchantSession: async () => Promise.resolve({} as MerchantSession),\n\tcreateSubscription: async () => null,\n\tgetSubscriptionForStripeId: async () => null,\n\tupdateSubscriptionStatus: async () => undefined,\n\tgetPurchasesForBulkCouponId: async () => [],\n}\n","import type {\n\tPaymentsAdapter,\n\tPaymentsProviderConfig,\n} from '@coursebuilder/core/types'\n\nconst mockPaymentsAdapter: PaymentsAdapter = {\n\tgetCouponPercentOff: async () => 0,\n\tgetCouponAmountOff: async () => 0,\n\tcreateCoupon: async () => 'mock-coupon-id',\n\tcreatePromotionCode: async () => 'mock-promotion-code-id',\n\tcreateCheckoutSession: async () => 'mock-checkout-session-id',\n\tcreateCustomer: async () => 'mock-customer-id',\n\tverifyWebhookSignature: async () => true,\n\tgetCheckoutSession: async () => ({ id: 'mock-checkout-session-id' }) as any,\n\tgetCustomer: async () => ({ id: 'mock-customer-id' }) as any,\n\tupdateCustomer: async () => {},\n\trefundCharge: async () => ({}) as any,\n\tupdateProduct: async () => {},\n\tupdatePrice: async () => {},\n\tgetProduct: async () => ({}) as any,\n\tgetPrice: async () => ({}) as any,\n\tcreatePrice: async () => ({}) as any,\n\tcreateProduct: async () => ({}) as any,\n\tgetSubscription: async () => ({}) as any,\n\tgetBillingPortalUrl: async () => 'mock-billing-portal-url',\n\tupdateSubscriptionItemQuantity: async () => ({}) as any,\n}\n\nexport const mockPaymentProvider: PaymentsProviderConfig = {\n\tid: 'mock-stripe',\n\tname: 'Mock Stripe',\n\ttype: 'payment',\n\toptions: {\n\t\terrorRedirectUrl: 'mock-error-redirect-url',\n\t\tcancelUrl: 'mock-cancel-url',\n\t\tbaseSuccessUrl: 'mock-base-success-url',\n\t\tpaymentsAdapter: mockPaymentsAdapter,\n\t},\n\tgetSubscriptionInfo: async () => ({}) as any,\n\tgetPurchaseInfo: async () => ({}) as any,\n\tcreateCheckoutSession: async () => ({\n\t\tredirect: 'mock-checkout-session-id',\n\t\tstatus: 303,\n\t}),\n\tgetCustomer: async () => ({ id: 'mock-customer-id' }) as any,\n\tupdateCustomer: async () => {},\n\trefundCharge: async () => ({}) as any,\n\tupdateProduct: async () => {},\n\tupdatePrice: async () => {},\n\tgetProduct: async () => ({}) as any,\n\tgetPrice: async () => ({}) as any,\n\tcreatePrice: async () => ({}) as any,\n\tcreateProduct: async () => ({}) as any,\n\tgetSubscription: async () => ({}) as any,\n\tgetBillingPortalUrl: async () => 'mock-billing-portal-url',\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,216 @@
1
+ // src/actions/prices-formatted.ts
2
+ import { isAfter } from "date-fns";
3
+ import { formatPricesForProduct } from "@coursebuilder/commerce/format-prices-for-product";
4
+ import { PricingFormattedInputSchema } from "@coursebuilder/core/schemas/pricing-formatted-input-schema";
5
+ import { find } from "@coursebuilder/nodash";
6
+ var checkForAnyAvailableUpgrades = async ({
7
+ upgradeFromPurchaseId,
8
+ productId,
9
+ purchases,
10
+ courseBuilderAdapter
11
+ }) => {
12
+ if (upgradeFromPurchaseId)
13
+ return upgradeFromPurchaseId;
14
+ const validPurchases = getValidPurchases(purchases);
15
+ const productIdsAlreadyPurchased = validPurchases.map(
16
+ (purchase) => purchase.productId
17
+ );
18
+ const potentialUpgrades = await courseBuilderAdapter.availableUpgradesForProduct(
19
+ validPurchases,
20
+ productId
21
+ );
22
+ const availableUpgrades = potentialUpgrades.filter(
23
+ (availableUpgrade) => {
24
+ return !productIdsAlreadyPurchased.includes(
25
+ availableUpgrade.upgradableTo.id
26
+ );
27
+ }
28
+ );
29
+ return find(validPurchases, (purchase) => {
30
+ const upgradeProductIds = availableUpgrades.map(
31
+ (upgrade) => upgrade.upgradableFrom.id
32
+ );
33
+ return upgradeProductIds.includes(purchase.productId);
34
+ })?.id;
35
+ };
36
+ var getValidPurchases = (purchases) => {
37
+ return purchases.filter(
38
+ (purchase) => ["Valid", "Restricted"].includes(purchase.status)
39
+ );
40
+ };
41
+ function couponIsValid(coupon) {
42
+ if (coupon) {
43
+ const unlimitedUse = coupon.maxUses === -1;
44
+ const now = /* @__PURE__ */ new Date();
45
+ if (!unlimitedUse && coupon.usedCount >= coupon.maxUses)
46
+ return false;
47
+ if (coupon.expires && isAfter(now, coupon.expires))
48
+ return false;
49
+ } else {
50
+ return false;
51
+ }
52
+ return true;
53
+ }
54
+ async function getActiveMerchantCoupon({
55
+ productId,
56
+ siteCouponId,
57
+ code,
58
+ courseBuilderAdapter
59
+ }) {
60
+ let activeMerchantCoupon = null;
61
+ let usedCouponId;
62
+ const defaultCoupons = productId ? await courseBuilderAdapter.getDefaultCoupon([productId]) : void 0;
63
+ const defaultMerchantCoupon = defaultCoupons ? defaultCoupons.defaultMerchantCoupon : null;
64
+ const incomingCoupon = await courseBuilderAdapter.couponForIdOrCode({
65
+ couponId: siteCouponId,
66
+ code
67
+ });
68
+ if (
69
+ // compare the discounts if there is a coupon and site/sale running
70
+ incomingCoupon?.merchantCoupon && couponIsValid(incomingCoupon) && defaultMerchantCoupon
71
+ ) {
72
+ const { merchantCoupon: incomingMerchantCoupon } = incomingCoupon;
73
+ const product = productId ? await courseBuilderAdapter.getProduct(productId) : null;
74
+ const price = product ? await courseBuilderAdapter.getPriceForProduct(productId) : null;
75
+ const unitPrice = price?.unitAmount || 0;
76
+ const incomingDiscountAmount = incomingMerchantCoupon.amountDiscount !== null && incomingMerchantCoupon.amountDiscount !== void 0 && incomingMerchantCoupon.amountDiscount > 0 ? incomingMerchantCoupon.amountDiscount / 100 : (incomingMerchantCoupon.percentageDiscount ?? 0) * unitPrice;
77
+ const defaultDiscountAmount = defaultMerchantCoupon.amountDiscount !== null && defaultMerchantCoupon.amountDiscount !== void 0 && defaultMerchantCoupon.amountDiscount > 0 ? defaultMerchantCoupon.amountDiscount / 100 : (defaultMerchantCoupon.percentageDiscount ?? 0) * unitPrice;
78
+ if (incomingDiscountAmount >= defaultDiscountAmount) {
79
+ activeMerchantCoupon = incomingMerchantCoupon;
80
+ usedCouponId = incomingCoupon.id;
81
+ } else {
82
+ activeMerchantCoupon = defaultMerchantCoupon;
83
+ usedCouponId = defaultCoupons?.defaultCoupon?.id;
84
+ }
85
+ } else if (
86
+ // if it's a coupon, use it
87
+ incomingCoupon?.merchantCoupon && couponIsValid(incomingCoupon)
88
+ ) {
89
+ activeMerchantCoupon = incomingCoupon.merchantCoupon;
90
+ usedCouponId = incomingCoupon.id;
91
+ } else if (
92
+ // if a sale is running, use that
93
+ defaultMerchantCoupon
94
+ ) {
95
+ activeMerchantCoupon = defaultMerchantCoupon;
96
+ usedCouponId = defaultCoupons?.defaultCoupon?.id;
97
+ }
98
+ const defaultCoupon = defaultCoupons?.defaultCoupon;
99
+ return {
100
+ usedCouponId,
101
+ activeMerchantCoupon,
102
+ ...defaultCoupon && defaultCoupon.merchantCouponId === activeMerchantCoupon?.id && {
103
+ defaultCoupon
104
+ }
105
+ };
106
+ }
107
+ var CheckForAvailableCouponsSchema = PricingFormattedInputSchema.pick({
108
+ merchantCoupon: true,
109
+ couponId: true,
110
+ code: true,
111
+ productId: true
112
+ });
113
+ var checkForAvailableCoupons = async ({
114
+ merchantCoupon,
115
+ couponId,
116
+ productId,
117
+ courseBuilderAdapter
118
+ }) => {
119
+ if (merchantCoupon?.id) {
120
+ return {
121
+ activeMerchantCoupon: merchantCoupon,
122
+ defaultCoupon: void 0
123
+ };
124
+ } else {
125
+ const { activeMerchantCoupon, defaultCoupon, usedCouponId } = await getActiveMerchantCoupon({
126
+ siteCouponId: couponId,
127
+ productId,
128
+ code: void 0,
129
+ courseBuilderAdapter
130
+ });
131
+ const minimalDefaultCoupon = defaultCoupon && {
132
+ expires: defaultCoupon.expires?.toISOString(),
133
+ percentageDiscount: defaultCoupon.percentageDiscount?.toString() || "0"
134
+ };
135
+ return {
136
+ activeMerchantCoupon,
137
+ defaultCoupon,
138
+ usedCouponId
139
+ };
140
+ }
141
+ };
142
+ async function getPricesFormatted(request, cookies, options) {
143
+ const currentUser = options.getCurrentUser ? await options.getCurrentUser() : null;
144
+ const {
145
+ productId,
146
+ quantity = 1,
147
+ couponId,
148
+ merchantCoupon,
149
+ upgradeFromPurchaseId: _upgradeFromPurchaseId,
150
+ autoApplyPPP,
151
+ userId = currentUser?.id
152
+ } = PricingFormattedInputSchema.parse(request.body);
153
+ if (!productId)
154
+ return { status: 400, body: "productId is required" };
155
+ if (!options.adapter)
156
+ return { status: 400, body: "Adapter not found" };
157
+ const purchases = getValidPurchases(
158
+ await options.adapter.getPurchasesForUser(userId)
159
+ );
160
+ const country = request.headers?.["x-vercel-ip-country"] || request.body?.country || process.env.DEFAULT_COUNTRY || "US";
161
+ let upgradeFromPurchaseId = await checkForAnyAvailableUpgrades({
162
+ upgradeFromPurchaseId: _upgradeFromPurchaseId,
163
+ productId,
164
+ purchases,
165
+ country,
166
+ courseBuilderAdapter: options.adapter
167
+ });
168
+ const restrictedPurchase = purchases.find((purchase) => {
169
+ return purchase.productId === productId && purchase.status === "Restricted";
170
+ });
171
+ if (restrictedPurchase) {
172
+ const validPurchase = purchases.find((purchase) => {
173
+ return purchase.productId === productId && purchase.status === "Valid";
174
+ });
175
+ if (!validPurchase) {
176
+ upgradeFromPurchaseId = restrictedPurchase.id;
177
+ }
178
+ }
179
+ const { activeMerchantCoupon, defaultCoupon, usedCouponId } = await checkForAvailableCoupons({
180
+ merchantCoupon,
181
+ couponId,
182
+ productId,
183
+ courseBuilderAdapter: options.adapter
184
+ });
185
+ const usedCoupon = usedCouponId ? await options.adapter.getCoupon(usedCouponId) : null;
186
+ const productPrices = await formatPricesForProduct({
187
+ productId,
188
+ country,
189
+ quantity,
190
+ merchantCouponId: activeMerchantCoupon?.id,
191
+ ...upgradeFromPurchaseId && { upgradeFromPurchaseId },
192
+ userId,
193
+ autoApplyPPP,
194
+ usedCouponId,
195
+ ctx: options.adapter
196
+ });
197
+ return {
198
+ body: {
199
+ ...productPrices,
200
+ ...defaultCoupon && { defaultCoupon },
201
+ ...usedCoupon && {
202
+ usedCoupon,
203
+ usedCouponId
204
+ }
205
+ },
206
+ headers: {
207
+ "Content-Type": "application/json"
208
+ },
209
+ cookies
210
+ };
211
+ }
212
+
213
+ export {
214
+ getPricesFormatted
215
+ };
216
+ //# sourceMappingURL=chunk-YFLGJIMA.js.map