@flink-app/stripe-plugin 0.12.1-alpha.9 → 0.13.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.
@@ -1,4 +1,4 @@
1
- // Generated Fri Apr 11 2025 20:43:10 GMT+0200 (Central European Summer Time)
1
+ // Generated Fri Jan 09 2026 11:18:13 GMT+0100 (Central European Standard Time)
2
2
  import { autoRegisteredHandlers, HttpMethod } from "@flink-app/flink";
3
3
  import * as HandlebarsTemplateHandler_0 from "../src/handlers/HandlebarsTemplateHandler";
4
4
 
@@ -1,4 +1,4 @@
1
- // Generated Fri Apr 11 2025 20:43:10 GMT+0200 (Central European Summer Time)
1
+ // Generated Fri Jan 09 2026 11:18:13 GMT+0100 (Central European Standard Time)
2
2
  import { autoRegisteredJobs } from "@flink-app/flink";
3
3
  export const jobs = [];
4
4
  autoRegisteredJobs.push(...jobs);
@@ -1,4 +1,4 @@
1
- // Generated Fri Apr 11 2025 20:43:10 GMT+0200 (Central European Summer Time)
1
+ // Generated Fri Jan 09 2026 11:18:13 GMT+0100 (Central European Standard Time)
2
2
  import { autoRegisteredRepos } from "@flink-app/flink";
3
3
  export const repos = [];
4
4
  autoRegisteredRepos.push(...repos);
@@ -1 +1 @@
1
- // Generated Fri Apr 11 2025 20:43:10 GMT+0200 (Central European Summer Time)
1
+ // Generated Fri Jan 09 2026 11:18:13 GMT+0100 (Central European Standard Time)
package/.flink/start.ts CHANGED
@@ -1,5 +1,6 @@
1
- // Generated Fri Apr 11 2025 20:43:10 GMT+0200 (Central European Summer Time)
1
+ // Generated Fri Jan 09 2026 11:18:13 GMT+0100 (Central European Standard Time)
2
2
  import "./generatedHandlers";
3
3
  import "./generatedRepos";
4
4
  import "./generatedJobs";
5
5
  import "../src/index";
6
+ export default {}; // Export an empty object to make it a module
package/CHANGELOG.md ADDED
@@ -0,0 +1,7 @@
1
+ # @flink-app/stripe-plugin
2
+
3
+ ## 0.13.0
4
+
5
+ ### Minor Changes
6
+
7
+ - Migrate to pnpm and streamlines build process.
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.handlers = void 0;
4
- // Generated Fri Apr 11 2025 20:43:10 GMT+0200 (Central European Summer Time)
4
+ // Generated Fri Jan 09 2026 11:18:13 GMT+0100 (Central European Standard Time)
5
5
  var flink_1 = require("@flink-app/flink");
6
6
  exports.handlers = [];
7
7
  flink_1.autoRegisteredHandlers.push.apply(flink_1.autoRegisteredHandlers, exports.handlers);
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.jobs = void 0;
4
- // Generated Fri Apr 11 2025 20:43:10 GMT+0200 (Central European Summer Time)
4
+ // Generated Fri Jan 09 2026 11:18:13 GMT+0100 (Central European Standard Time)
5
5
  var flink_1 = require("@flink-app/flink");
6
6
  exports.jobs = [];
7
7
  flink_1.autoRegisteredJobs.push.apply(flink_1.autoRegisteredJobs, exports.jobs);
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.repos = void 0;
4
- // Generated Fri Apr 11 2025 20:43:10 GMT+0200 (Central European Summer Time)
4
+ // Generated Fri Jan 09 2026 11:18:13 GMT+0100 (Central European Standard Time)
5
5
  var flink_1 = require("@flink-app/flink");
6
6
  exports.repos = [];
7
7
  flink_1.autoRegisteredRepos.push.apply(flink_1.autoRegisteredRepos, exports.repos);
@@ -1,2 +1,2 @@
1
1
  "use strict";
2
- // Generated Fri Apr 11 2025 20:43:10 GMT+0200 (Central European Summer Time)
2
+ // Generated Fri Jan 09 2026 11:18:13 GMT+0100 (Central European Standard Time)
@@ -2,3 +2,5 @@ import "./generatedHandlers";
2
2
  import "./generatedRepos";
3
3
  import "./generatedJobs";
4
4
  import "../src/index";
5
+ declare const _default: {};
6
+ export default _default;
@@ -1,7 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- // Generated Fri Apr 11 2025 20:43:10 GMT+0200 (Central European Summer Time)
3
+ // Generated Fri Jan 09 2026 11:18:13 GMT+0100 (Central European Standard Time)
4
4
  require("./generatedHandlers");
5
5
  require("./generatedRepos");
6
6
  require("./generatedJobs");
7
7
  require("../src/index");
8
+ exports.default = {}; // Export an empty object to make it a module
@@ -1,5 +1,4 @@
1
- import { ExpressResponse } from "@flink-app/flink";
2
1
  export declare function HandlebarsTemplateHandler(masterTemplate: string, styleTemplate: string, template: string, pageContext: {
3
2
  [key: string]: any;
4
- }, res: ExpressResponse): Promise<void>;
3
+ }, res: any): Promise<void>;
5
4
  export declare const __assumedHttpMethod = "", __file = "HandlebarsTemplateHandler.ts", __query: never[], __params: never[];
@@ -9,8 +9,8 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
9
9
  });
10
10
  };
11
11
  var __generator = (this && this.__generator) || function (thisArg, body) {
12
- var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
13
- return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
12
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
13
+ return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14
14
  function verb(n) { return function (v) { return step([n, v]); }; }
15
15
  function step(op) {
16
16
  if (f) throw new TypeError("Generator is already executing.");
@@ -39,7 +39,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
39
39
  return (mod && mod.__esModule) ? mod : { "default": mod };
40
40
  };
41
41
  Object.defineProperty(exports, "__esModule", { value: true });
42
- exports.__params = exports.__query = exports.__file = exports.__assumedHttpMethod = exports.HandlebarsTemplateHandler = void 0;
42
+ exports.__params = exports.__query = exports.__file = exports.__assumedHttpMethod = void 0;
43
+ exports.HandlebarsTemplateHandler = HandlebarsTemplateHandler;
43
44
  var flink_1 = require("@flink-app/flink");
44
45
  var handlebars_1 = __importDefault(require("handlebars"));
45
46
  function HandlebarsTemplateHandler(masterTemplate, styleTemplate, template, pageContext, res) {
@@ -59,5 +60,4 @@ function HandlebarsTemplateHandler(masterTemplate, styleTemplate, template, page
59
60
  });
60
61
  });
61
62
  }
62
- exports.HandlebarsTemplateHandler = HandlebarsTemplateHandler;
63
63
  exports.__assumedHttpMethod = "", exports.__file = "HandlebarsTemplateHandler.ts", exports.__query = [], exports.__params = [];
package/dist/src/index.js CHANGED
@@ -23,8 +23,8 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
23
23
  });
24
24
  };
25
25
  var __generator = (this && this.__generator) || function (thisArg, body) {
26
- var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
27
- return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
26
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
27
+ return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
28
28
  function verb(n) { return function (v) { return step([n, v]); }; }
29
29
  function step(op) {
30
30
  if (f) throw new TypeError("Generator is already executing.");
@@ -55,17 +55,17 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
55
55
  Object.defineProperty(exports, "__esModule", { value: true });
56
56
  exports.stripePlugin = void 0;
57
57
  var flink_1 = require("@flink-app/flink");
58
- var stripeAPI_1 = require("./stripeAPI");
59
58
  var HandlebarsTemplateHandler_1 = require("./handlers/HandlebarsTemplateHandler");
59
+ var stripeAPI_1 = require("./stripeAPI");
60
60
  __exportStar(require("./stripePluginContext"), exports);
61
+ var connect_done_1 = require("./templates/connect-done");
62
+ var error_1 = require("./templates/error");
61
63
  var master_1 = require("./templates/master");
64
+ var pay_enter_card_1 = require("./templates/pay-enter-card");
65
+ var pay_select_card_1 = require("./templates/pay-select-card");
62
66
  var setup_card_1 = require("./templates/setup-card");
63
- var style_1 = require("./templates/style");
64
67
  var setup_done_1 = require("./templates/setup-done");
65
- var error_1 = require("./templates/error");
66
- var pay_select_card_1 = require("./templates/pay-select-card");
67
- var pay_enter_card_1 = require("./templates/pay-enter-card");
68
- var connect_done_1 = require("./templates/connect-done");
68
+ var style_1 = require("./templates/style");
69
69
  var jsonwebtoken_1 = require("jsonwebtoken");
70
70
  var ConnectSessionRepo_1 = __importDefault(require("./reposx/ConnectSessionRepo"));
71
71
  var stripePlugin = function (options) {
@@ -1,107 +1,5 @@
1
- /// <reference types="stripe/types/crypto/crypto" />
2
- /// <reference types="stripe/types/shared" />
3
- /// <reference types="stripe/types/Errors" />
4
- /// <reference types="stripe/types/OAuth" />
5
- /// <reference types="stripe/types/Webhooks" />
6
- /// <reference types="stripe/types/2020-08-27/AccountLinks" />
7
- /// <reference types="stripe/types/2020-08-27/Accounts" />
8
- /// <reference types="stripe/types/2020-08-27/AlipayAccounts" />
9
- /// <reference types="stripe/types/2020-08-27/ApplePayDomains" />
10
- /// <reference types="stripe/types/2020-08-27/ApplicationFees" />
11
- /// <reference types="stripe/types/2020-08-27/Applications" />
12
- /// <reference types="stripe/types/2020-08-27/Balance" />
13
- /// <reference types="stripe/types/2020-08-27/BalanceTransactions" />
14
- /// <reference types="stripe/types/2020-08-27/BankAccounts" />
15
- /// <reference types="stripe/types/2020-08-27/BillingPortal/Configurations" />
16
- /// <reference types="stripe/types/2020-08-27/BillingPortal/Sessions" />
17
- /// <reference types="stripe/types/2020-08-27/BitcoinReceivers" />
18
- /// <reference types="stripe/types/2020-08-27/BitcoinTransactions" />
19
- /// <reference types="stripe/types/2020-08-27/Capabilities" />
20
- /// <reference types="stripe/types/2020-08-27/Cards" />
21
- /// <reference types="stripe/types/2020-08-27/Charges" />
22
- /// <reference types="stripe/types/2020-08-27/Checkout/Sessions" />
23
- /// <reference types="stripe/types/2020-08-27/ConnectCollectionTransfers" />
24
- /// <reference types="stripe/types/2020-08-27/CountrySpecs" />
25
- /// <reference types="stripe/types/2020-08-27/Coupons" />
26
- /// <reference types="stripe/types/2020-08-27/CreditNoteLineItems" />
27
- /// <reference types="stripe/types/2020-08-27/CreditNotes" />
28
- /// <reference types="stripe/types/2020-08-27/CustomerBalanceTransactions" />
29
- /// <reference types="stripe/types/2020-08-27/CustomerSources" />
30
- /// <reference types="stripe/types/2020-08-27/Customers" />
31
- /// <reference types="stripe/types/2020-08-27/Discounts" />
32
- /// <reference types="stripe/types/2020-08-27/Disputes" />
33
- /// <reference types="stripe/types/2020-08-27/EphemeralKeys" />
34
- /// <reference types="stripe/types/2020-08-27/Events" />
35
- /// <reference types="stripe/types/2020-08-27/ExchangeRates" />
36
- /// <reference types="stripe/types/2020-08-27/ExternalAccounts" />
37
- /// <reference types="stripe/types/2020-08-27/FeeRefunds" />
38
- /// <reference types="stripe/types/2020-08-27/FileLinks" />
39
- /// <reference types="stripe/types/2020-08-27/Files" />
40
- /// <reference types="stripe/types/2020-08-27/Identity/VerificationReports" />
41
- /// <reference types="stripe/types/2020-08-27/Identity/VerificationSessions" />
42
- /// <reference types="stripe/types/2020-08-27/InvoiceItems" />
43
- /// <reference types="stripe/types/2020-08-27/InvoiceLineItems" />
44
- /// <reference types="stripe/types/2020-08-27/Invoices" />
45
- /// <reference types="stripe/types/2020-08-27/IssuerFraudRecords" />
46
- /// <reference types="stripe/types/2020-08-27/Issuing/Authorizations" />
47
- /// <reference types="stripe/types/2020-08-27/Issuing/CardDetails" />
48
- /// <reference types="stripe/types/2020-08-27/Issuing/Cardholders" />
49
- /// <reference types="stripe/types/2020-08-27/Issuing/Cards" />
50
- /// <reference types="stripe/types/2020-08-27/Issuing/Disputes" />
51
- /// <reference types="stripe/types/2020-08-27/Issuing/Transactions" />
52
- /// <reference types="stripe/types/2020-08-27/LineItems" />
53
- /// <reference types="stripe/types/2020-08-27/LoginLinks" />
54
- /// <reference types="stripe/types/2020-08-27/Mandates" />
55
- /// <reference types="stripe/types/2020-08-27/OrderItems" />
56
- /// <reference types="stripe/types/2020-08-27/OrderReturns" />
57
- /// <reference types="stripe/types/2020-08-27/Orders" />
58
- /// <reference types="stripe/types/2020-08-27/PaymentIntents" />
59
- /// <reference types="stripe/types/2020-08-27/PaymentMethods" />
60
- /// <reference types="stripe/types/2020-08-27/Payouts" />
61
- /// <reference types="stripe/types/2020-08-27/Persons" />
62
- /// <reference types="stripe/types/2020-08-27/Plans" />
63
- /// <reference types="stripe/types/2020-08-27/PlatformTaxFees" />
64
- /// <reference types="stripe/types/2020-08-27/Prices" />
65
- /// <reference types="stripe/types/2020-08-27/Products" />
66
- /// <reference types="stripe/types/2020-08-27/PromotionCodes" />
67
- /// <reference types="stripe/types/2020-08-27/Quotes" />
68
- /// <reference types="stripe/types/2020-08-27/Radar/EarlyFraudWarnings" />
69
- /// <reference types="stripe/types/2020-08-27/Radar/ValueListItems" />
70
- /// <reference types="stripe/types/2020-08-27/Radar/ValueLists" />
71
- /// <reference types="stripe/types/2020-08-27/Recipients" />
72
- /// <reference types="stripe/types/2020-08-27/Refunds" />
73
- /// <reference types="stripe/types/2020-08-27/Reporting/ReportRuns" />
74
- /// <reference types="stripe/types/2020-08-27/Reporting/ReportTypes" />
75
- /// <reference types="stripe/types/2020-08-27/ReserveTransactions" />
76
- /// <reference types="stripe/types/2020-08-27/Reviews" />
77
- /// <reference types="stripe/types/2020-08-27/SKUs" />
78
- /// <reference types="stripe/types/2020-08-27/SetupAttempts" />
79
- /// <reference types="stripe/types/2020-08-27/SetupIntents" />
80
- /// <reference types="stripe/types/2020-08-27/Sigma/ScheduledQueryRuns" />
81
- /// <reference types="stripe/types/2020-08-27/SourceMandateNotifications" />
82
- /// <reference types="stripe/types/2020-08-27/SourceTransactions" />
83
- /// <reference types="stripe/types/2020-08-27/Sources" />
84
- /// <reference types="stripe/types/2020-08-27/SubscriptionItems" />
85
- /// <reference types="stripe/types/2020-08-27/SubscriptionSchedules" />
86
- /// <reference types="stripe/types/2020-08-27/Subscriptions" />
87
- /// <reference types="stripe/types/2020-08-27/TaxCodes" />
88
- /// <reference types="stripe/types/2020-08-27/TaxDeductedAtSources" />
89
- /// <reference types="stripe/types/2020-08-27/TaxIds" />
90
- /// <reference types="stripe/types/2020-08-27/TaxRates" />
91
- /// <reference types="stripe/types/2020-08-27/Terminal/ConnectionTokens" />
92
- /// <reference types="stripe/types/2020-08-27/Terminal/Locations" />
93
- /// <reference types="stripe/types/2020-08-27/Terminal/Readers" />
94
- /// <reference types="stripe/types/2020-08-27/Tokens" />
95
- /// <reference types="stripe/types/2020-08-27/Topups" />
96
- /// <reference types="stripe/types/2020-08-27/TransferReversals" />
97
- /// <reference types="stripe/types/2020-08-27/Transfers" />
98
- /// <reference types="stripe/types/2020-08-27/UsageRecordSummaries" />
99
- /// <reference types="stripe/types/2020-08-27/UsageRecords" />
100
- /// <reference types="stripe/types/2020-08-27/WebhookEndpoints" />
101
- /// <reference types="stripe/types/lib" />
102
- /// <reference types="stripe/types/net/net" />
103
- import { setupCardOptions } from "../schemas/customer/setupCardOptions";
104
1
  import { hasPaymentMethodOptions } from "../schemas/customer/hasPaymentMethodOptions";
2
+ import { setupCardOptions } from "../schemas/customer/setupCardOptions";
105
3
  import { Stripe } from "stripe";
106
4
  export declare const createStripeCustomer: (stripe: Stripe, options: Stripe.CustomerCreateParams) => Promise<string>;
107
5
  export declare const hasPaymentMethod: (stripe: Stripe, options: hasPaymentMethodOptions) => Promise<boolean>;
@@ -20,8 +20,8 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
20
20
  });
21
21
  };
22
22
  var __generator = (this && this.__generator) || function (thisArg, body) {
23
- var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
24
- return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
23
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
24
+ return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
25
25
  function verb(n) { return function (v) { return step([n, v]); }; }
26
26
  function step(op) {
27
27
  if (f) throw new TypeError("Generator is already executing.");
@@ -1,105 +1,3 @@
1
- /// <reference types="stripe/types/crypto/crypto" />
2
- /// <reference types="stripe/types/shared" />
3
- /// <reference types="stripe/types/Errors" />
4
- /// <reference types="stripe/types/OAuth" />
5
- /// <reference types="stripe/types/Webhooks" />
6
- /// <reference types="stripe/types/2020-08-27/AccountLinks" />
7
- /// <reference types="stripe/types/2020-08-27/Accounts" />
8
- /// <reference types="stripe/types/2020-08-27/AlipayAccounts" />
9
- /// <reference types="stripe/types/2020-08-27/ApplePayDomains" />
10
- /// <reference types="stripe/types/2020-08-27/ApplicationFees" />
11
- /// <reference types="stripe/types/2020-08-27/Applications" />
12
- /// <reference types="stripe/types/2020-08-27/Balance" />
13
- /// <reference types="stripe/types/2020-08-27/BalanceTransactions" />
14
- /// <reference types="stripe/types/2020-08-27/BankAccounts" />
15
- /// <reference types="stripe/types/2020-08-27/BillingPortal/Configurations" />
16
- /// <reference types="stripe/types/2020-08-27/BillingPortal/Sessions" />
17
- /// <reference types="stripe/types/2020-08-27/BitcoinReceivers" />
18
- /// <reference types="stripe/types/2020-08-27/BitcoinTransactions" />
19
- /// <reference types="stripe/types/2020-08-27/Capabilities" />
20
- /// <reference types="stripe/types/2020-08-27/Cards" />
21
- /// <reference types="stripe/types/2020-08-27/Charges" />
22
- /// <reference types="stripe/types/2020-08-27/Checkout/Sessions" />
23
- /// <reference types="stripe/types/2020-08-27/ConnectCollectionTransfers" />
24
- /// <reference types="stripe/types/2020-08-27/CountrySpecs" />
25
- /// <reference types="stripe/types/2020-08-27/Coupons" />
26
- /// <reference types="stripe/types/2020-08-27/CreditNoteLineItems" />
27
- /// <reference types="stripe/types/2020-08-27/CreditNotes" />
28
- /// <reference types="stripe/types/2020-08-27/CustomerBalanceTransactions" />
29
- /// <reference types="stripe/types/2020-08-27/CustomerSources" />
30
- /// <reference types="stripe/types/2020-08-27/Customers" />
31
- /// <reference types="stripe/types/2020-08-27/Discounts" />
32
- /// <reference types="stripe/types/2020-08-27/Disputes" />
33
- /// <reference types="stripe/types/2020-08-27/EphemeralKeys" />
34
- /// <reference types="stripe/types/2020-08-27/Events" />
35
- /// <reference types="stripe/types/2020-08-27/ExchangeRates" />
36
- /// <reference types="stripe/types/2020-08-27/ExternalAccounts" />
37
- /// <reference types="stripe/types/2020-08-27/FeeRefunds" />
38
- /// <reference types="stripe/types/2020-08-27/FileLinks" />
39
- /// <reference types="stripe/types/2020-08-27/Files" />
40
- /// <reference types="stripe/types/2020-08-27/Identity/VerificationReports" />
41
- /// <reference types="stripe/types/2020-08-27/Identity/VerificationSessions" />
42
- /// <reference types="stripe/types/2020-08-27/InvoiceItems" />
43
- /// <reference types="stripe/types/2020-08-27/InvoiceLineItems" />
44
- /// <reference types="stripe/types/2020-08-27/Invoices" />
45
- /// <reference types="stripe/types/2020-08-27/IssuerFraudRecords" />
46
- /// <reference types="stripe/types/2020-08-27/Issuing/Authorizations" />
47
- /// <reference types="stripe/types/2020-08-27/Issuing/CardDetails" />
48
- /// <reference types="stripe/types/2020-08-27/Issuing/Cardholders" />
49
- /// <reference types="stripe/types/2020-08-27/Issuing/Cards" />
50
- /// <reference types="stripe/types/2020-08-27/Issuing/Disputes" />
51
- /// <reference types="stripe/types/2020-08-27/Issuing/Transactions" />
52
- /// <reference types="stripe/types/2020-08-27/LineItems" />
53
- /// <reference types="stripe/types/2020-08-27/LoginLinks" />
54
- /// <reference types="stripe/types/2020-08-27/Mandates" />
55
- /// <reference types="stripe/types/2020-08-27/OrderItems" />
56
- /// <reference types="stripe/types/2020-08-27/OrderReturns" />
57
- /// <reference types="stripe/types/2020-08-27/Orders" />
58
- /// <reference types="stripe/types/2020-08-27/PaymentIntents" />
59
- /// <reference types="stripe/types/2020-08-27/PaymentMethods" />
60
- /// <reference types="stripe/types/2020-08-27/Payouts" />
61
- /// <reference types="stripe/types/2020-08-27/Persons" />
62
- /// <reference types="stripe/types/2020-08-27/Plans" />
63
- /// <reference types="stripe/types/2020-08-27/PlatformTaxFees" />
64
- /// <reference types="stripe/types/2020-08-27/Prices" />
65
- /// <reference types="stripe/types/2020-08-27/Products" />
66
- /// <reference types="stripe/types/2020-08-27/PromotionCodes" />
67
- /// <reference types="stripe/types/2020-08-27/Quotes" />
68
- /// <reference types="stripe/types/2020-08-27/Radar/EarlyFraudWarnings" />
69
- /// <reference types="stripe/types/2020-08-27/Radar/ValueListItems" />
70
- /// <reference types="stripe/types/2020-08-27/Radar/ValueLists" />
71
- /// <reference types="stripe/types/2020-08-27/Recipients" />
72
- /// <reference types="stripe/types/2020-08-27/Refunds" />
73
- /// <reference types="stripe/types/2020-08-27/Reporting/ReportRuns" />
74
- /// <reference types="stripe/types/2020-08-27/Reporting/ReportTypes" />
75
- /// <reference types="stripe/types/2020-08-27/ReserveTransactions" />
76
- /// <reference types="stripe/types/2020-08-27/Reviews" />
77
- /// <reference types="stripe/types/2020-08-27/SKUs" />
78
- /// <reference types="stripe/types/2020-08-27/SetupAttempts" />
79
- /// <reference types="stripe/types/2020-08-27/SetupIntents" />
80
- /// <reference types="stripe/types/2020-08-27/Sigma/ScheduledQueryRuns" />
81
- /// <reference types="stripe/types/2020-08-27/SourceMandateNotifications" />
82
- /// <reference types="stripe/types/2020-08-27/SourceTransactions" />
83
- /// <reference types="stripe/types/2020-08-27/Sources" />
84
- /// <reference types="stripe/types/2020-08-27/SubscriptionItems" />
85
- /// <reference types="stripe/types/2020-08-27/SubscriptionSchedules" />
86
- /// <reference types="stripe/types/2020-08-27/Subscriptions" />
87
- /// <reference types="stripe/types/2020-08-27/TaxCodes" />
88
- /// <reference types="stripe/types/2020-08-27/TaxDeductedAtSources" />
89
- /// <reference types="stripe/types/2020-08-27/TaxIds" />
90
- /// <reference types="stripe/types/2020-08-27/TaxRates" />
91
- /// <reference types="stripe/types/2020-08-27/Terminal/ConnectionTokens" />
92
- /// <reference types="stripe/types/2020-08-27/Terminal/Locations" />
93
- /// <reference types="stripe/types/2020-08-27/Terminal/Readers" />
94
- /// <reference types="stripe/types/2020-08-27/Tokens" />
95
- /// <reference types="stripe/types/2020-08-27/Topups" />
96
- /// <reference types="stripe/types/2020-08-27/TransferReversals" />
97
- /// <reference types="stripe/types/2020-08-27/Transfers" />
98
- /// <reference types="stripe/types/2020-08-27/UsageRecordSummaries" />
99
- /// <reference types="stripe/types/2020-08-27/UsageRecords" />
100
- /// <reference types="stripe/types/2020-08-27/WebhookEndpoints" />
101
- /// <reference types="stripe/types/lib" />
102
- /// <reference types="stripe/types/net/net" />
103
1
  import { Stripe } from "stripe";
104
2
  import { confirmPaymentOptions } from "../schemas/payment/confirmPaymentOptions";
105
3
  import { confirmPaymentResponse } from "../schemas/payment/confirmPaymentResponse";
@@ -9,8 +9,8 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
9
9
  });
10
10
  };
11
11
  var __generator = (this && this.__generator) || function (thisArg, body) {
12
- var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
13
- return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
12
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
13
+ return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14
14
  function verb(n) { return function (v) { return step([n, v]); }; }
15
15
  function step(op) {
16
16
  if (f) throw new TypeError("Generator is already executing.");
@@ -1,105 +1,3 @@
1
- /// <reference types="stripe/types/crypto/crypto" />
2
- /// <reference types="stripe/types/shared" />
3
- /// <reference types="stripe/types/Errors" />
4
- /// <reference types="stripe/types/OAuth" />
5
- /// <reference types="stripe/types/Webhooks" />
6
- /// <reference types="stripe/types/2020-08-27/AccountLinks" />
7
- /// <reference types="stripe/types/2020-08-27/Accounts" />
8
- /// <reference types="stripe/types/2020-08-27/AlipayAccounts" />
9
- /// <reference types="stripe/types/2020-08-27/ApplePayDomains" />
10
- /// <reference types="stripe/types/2020-08-27/ApplicationFees" />
11
- /// <reference types="stripe/types/2020-08-27/Applications" />
12
- /// <reference types="stripe/types/2020-08-27/Balance" />
13
- /// <reference types="stripe/types/2020-08-27/BalanceTransactions" />
14
- /// <reference types="stripe/types/2020-08-27/BankAccounts" />
15
- /// <reference types="stripe/types/2020-08-27/BillingPortal/Configurations" />
16
- /// <reference types="stripe/types/2020-08-27/BillingPortal/Sessions" />
17
- /// <reference types="stripe/types/2020-08-27/BitcoinReceivers" />
18
- /// <reference types="stripe/types/2020-08-27/BitcoinTransactions" />
19
- /// <reference types="stripe/types/2020-08-27/Capabilities" />
20
- /// <reference types="stripe/types/2020-08-27/Cards" />
21
- /// <reference types="stripe/types/2020-08-27/Charges" />
22
- /// <reference types="stripe/types/2020-08-27/Checkout/Sessions" />
23
- /// <reference types="stripe/types/2020-08-27/ConnectCollectionTransfers" />
24
- /// <reference types="stripe/types/2020-08-27/CountrySpecs" />
25
- /// <reference types="stripe/types/2020-08-27/Coupons" />
26
- /// <reference types="stripe/types/2020-08-27/CreditNoteLineItems" />
27
- /// <reference types="stripe/types/2020-08-27/CreditNotes" />
28
- /// <reference types="stripe/types/2020-08-27/CustomerBalanceTransactions" />
29
- /// <reference types="stripe/types/2020-08-27/CustomerSources" />
30
- /// <reference types="stripe/types/2020-08-27/Customers" />
31
- /// <reference types="stripe/types/2020-08-27/Discounts" />
32
- /// <reference types="stripe/types/2020-08-27/Disputes" />
33
- /// <reference types="stripe/types/2020-08-27/EphemeralKeys" />
34
- /// <reference types="stripe/types/2020-08-27/Events" />
35
- /// <reference types="stripe/types/2020-08-27/ExchangeRates" />
36
- /// <reference types="stripe/types/2020-08-27/ExternalAccounts" />
37
- /// <reference types="stripe/types/2020-08-27/FeeRefunds" />
38
- /// <reference types="stripe/types/2020-08-27/FileLinks" />
39
- /// <reference types="stripe/types/2020-08-27/Files" />
40
- /// <reference types="stripe/types/2020-08-27/Identity/VerificationReports" />
41
- /// <reference types="stripe/types/2020-08-27/Identity/VerificationSessions" />
42
- /// <reference types="stripe/types/2020-08-27/InvoiceItems" />
43
- /// <reference types="stripe/types/2020-08-27/InvoiceLineItems" />
44
- /// <reference types="stripe/types/2020-08-27/Invoices" />
45
- /// <reference types="stripe/types/2020-08-27/IssuerFraudRecords" />
46
- /// <reference types="stripe/types/2020-08-27/Issuing/Authorizations" />
47
- /// <reference types="stripe/types/2020-08-27/Issuing/CardDetails" />
48
- /// <reference types="stripe/types/2020-08-27/Issuing/Cardholders" />
49
- /// <reference types="stripe/types/2020-08-27/Issuing/Cards" />
50
- /// <reference types="stripe/types/2020-08-27/Issuing/Disputes" />
51
- /// <reference types="stripe/types/2020-08-27/Issuing/Transactions" />
52
- /// <reference types="stripe/types/2020-08-27/LineItems" />
53
- /// <reference types="stripe/types/2020-08-27/LoginLinks" />
54
- /// <reference types="stripe/types/2020-08-27/Mandates" />
55
- /// <reference types="stripe/types/2020-08-27/OrderItems" />
56
- /// <reference types="stripe/types/2020-08-27/OrderReturns" />
57
- /// <reference types="stripe/types/2020-08-27/Orders" />
58
- /// <reference types="stripe/types/2020-08-27/PaymentIntents" />
59
- /// <reference types="stripe/types/2020-08-27/PaymentMethods" />
60
- /// <reference types="stripe/types/2020-08-27/Payouts" />
61
- /// <reference types="stripe/types/2020-08-27/Persons" />
62
- /// <reference types="stripe/types/2020-08-27/Plans" />
63
- /// <reference types="stripe/types/2020-08-27/PlatformTaxFees" />
64
- /// <reference types="stripe/types/2020-08-27/Prices" />
65
- /// <reference types="stripe/types/2020-08-27/Products" />
66
- /// <reference types="stripe/types/2020-08-27/PromotionCodes" />
67
- /// <reference types="stripe/types/2020-08-27/Quotes" />
68
- /// <reference types="stripe/types/2020-08-27/Radar/EarlyFraudWarnings" />
69
- /// <reference types="stripe/types/2020-08-27/Radar/ValueListItems" />
70
- /// <reference types="stripe/types/2020-08-27/Radar/ValueLists" />
71
- /// <reference types="stripe/types/2020-08-27/Recipients" />
72
- /// <reference types="stripe/types/2020-08-27/Refunds" />
73
- /// <reference types="stripe/types/2020-08-27/Reporting/ReportRuns" />
74
- /// <reference types="stripe/types/2020-08-27/Reporting/ReportTypes" />
75
- /// <reference types="stripe/types/2020-08-27/ReserveTransactions" />
76
- /// <reference types="stripe/types/2020-08-27/Reviews" />
77
- /// <reference types="stripe/types/2020-08-27/SKUs" />
78
- /// <reference types="stripe/types/2020-08-27/SetupAttempts" />
79
- /// <reference types="stripe/types/2020-08-27/SetupIntents" />
80
- /// <reference types="stripe/types/2020-08-27/Sigma/ScheduledQueryRuns" />
81
- /// <reference types="stripe/types/2020-08-27/SourceMandateNotifications" />
82
- /// <reference types="stripe/types/2020-08-27/SourceTransactions" />
83
- /// <reference types="stripe/types/2020-08-27/Sources" />
84
- /// <reference types="stripe/types/2020-08-27/SubscriptionItems" />
85
- /// <reference types="stripe/types/2020-08-27/SubscriptionSchedules" />
86
- /// <reference types="stripe/types/2020-08-27/Subscriptions" />
87
- /// <reference types="stripe/types/2020-08-27/TaxCodes" />
88
- /// <reference types="stripe/types/2020-08-27/TaxDeductedAtSources" />
89
- /// <reference types="stripe/types/2020-08-27/TaxIds" />
90
- /// <reference types="stripe/types/2020-08-27/TaxRates" />
91
- /// <reference types="stripe/types/2020-08-27/Terminal/ConnectionTokens" />
92
- /// <reference types="stripe/types/2020-08-27/Terminal/Locations" />
93
- /// <reference types="stripe/types/2020-08-27/Terminal/Readers" />
94
- /// <reference types="stripe/types/2020-08-27/Tokens" />
95
- /// <reference types="stripe/types/2020-08-27/Topups" />
96
- /// <reference types="stripe/types/2020-08-27/TransferReversals" />
97
- /// <reference types="stripe/types/2020-08-27/Transfers" />
98
- /// <reference types="stripe/types/2020-08-27/UsageRecordSummaries" />
99
- /// <reference types="stripe/types/2020-08-27/UsageRecords" />
100
- /// <reference types="stripe/types/2020-08-27/WebhookEndpoints" />
101
- /// <reference types="stripe/types/lib" />
102
- /// <reference types="stripe/types/net/net" />
103
1
  import { Stripe } from "stripe";
104
2
  import { hasPaymentMethodOptions } from "./schemas/customer/hasPaymentMethodOptions";
105
3
  import { setupCardOptions } from "./schemas/customer/setupCardOptions";
@@ -9,8 +9,8 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
9
9
  });
10
10
  };
11
11
  var __generator = (this && this.__generator) || function (thisArg, body) {
12
- var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
13
- return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
12
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
13
+ return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14
14
  function verb(n) { return function (v) { return step([n, v]); }; }
15
15
  function step(op) {
16
16
  if (f) throw new TypeError("Generator is already executing.");
package/package.json CHANGED
@@ -1,37 +1,33 @@
1
1
  {
2
- "name": "@flink-app/stripe-plugin",
3
- "version": "0.12.1-alpha.9",
4
- "description": "Flink plugin to work with stripe payments",
5
- "scripts": {
6
- "test": "echo \"Error: no test specified\"",
7
- "build": "flink build",
8
- "prepare": "npm run build",
9
- "watch": "nodemon --exec \"flink build\""
10
- },
11
- "author": "johan@frost.se",
12
- "publishConfig": {
13
- "access": "public"
14
- },
15
- "license": "MIT",
16
- "types": "dist/src/index.d.ts",
17
- "main": "dist/src/index.js",
18
- "dependencies": {
19
- "@types/stripe": "^8.0.417",
20
- "bcrypt": "^5.0.1",
21
- "express": "^4.17.1",
22
- "handlebars": "^4.7.7",
23
- "jsonwebtoken": "^8.5.1",
24
- "stripe": "^8.186.1"
25
- },
26
- "devDependencies": {
27
- "@flink-app/flink": "^0.12.1-alpha.9",
28
- "@types/bcrypt": "^5.0.0",
29
- "@types/express": "4.17.11",
30
- "@types/express-fileupload": "^1.1.7",
31
- "@types/jsonwebtoken": "^8.5.5",
32
- "@types/node": "22.13.10",
33
- "ts-node": "^9.1.1",
34
- "typescript": "5.4.5"
35
- },
36
- "gitHead": "3007ad036607014176930446fde56203bde8d6f5"
37
- }
2
+ "name": "@flink-app/stripe-plugin",
3
+ "version": "0.13.0",
4
+ "description": "Flink plugin to work with stripe payments",
5
+ "author": "johan@frost.se",
6
+ "publishConfig": {
7
+ "access": "public"
8
+ },
9
+ "license": "MIT",
10
+ "types": "dist/src/index.d.ts",
11
+ "main": "dist/src/index.js",
12
+ "dependencies": {
13
+ "@types/stripe": "^8.0.417",
14
+ "bcrypt": "^5.0.1",
15
+ "handlebars": "^4.7.7",
16
+ "jsonwebtoken": "^8.5.1",
17
+ "stripe": "^8.186.1"
18
+ },
19
+ "devDependencies": {
20
+ "@types/bcrypt": "^5.0.0",
21
+ "@types/express-fileupload": "^1.1.7",
22
+ "@types/jsonwebtoken": "^8.5.5",
23
+ "@types/node": "22.13.10",
24
+ "@flink-app/flink": "0.13.0"
25
+ },
26
+ "gitHead": "4243e3b3cd6d4e1ca001a61baa8436bf2bbe4113",
27
+ "scripts": {
28
+ "test": "echo \"Error: no test specified\"",
29
+ "build": "flink build",
30
+ "watch": "nodemon --exec \"flink build\"",
31
+ "clean": "rimraf dist .flink"
32
+ }
33
+ }
package/readme.md CHANGED
@@ -1,51 +1,390 @@
1
- # Flink API Docs
1
+ # @flink-app/stripe-plugin
2
2
 
3
- **WORK IN PROGRESS 👷‍♀️👷🏻‍♂️**
3
+ A comprehensive Flink plugin for integrating Stripe payment processing, including customer management, payment intents, card setup, and Stripe Connect functionality. The plugin provides both API methods and hosted UI pages for payment flows.
4
4
 
5
- A FLINK plugin that lets you expose management api:s for other plugins.
5
+ ## Features
6
6
 
7
- Other plugins must be able to generate a ManagementApiModule that can be registered with this plugin to expose management apis.
7
+ - Customer creation and management
8
+ - Payment intent creation and confirmation
9
+ - Card setup with hosted UI
10
+ - Payment capture for authorized payments
11
+ - Stripe Connect integration
12
+ - Pre-built, customizable payment UI templates
13
+ - JWT-based secure token system
14
+ - MongoDB-backed session management
15
+ - Webhook callback support
16
+ - Full TypeScript support
8
17
 
9
- ## Usage
10
-
11
- Install plugin to your flink app project:
18
+ ## Installation
12
19
 
13
- ```
14
- npm i -S @flink-app/management-api-plugin
20
+ ```bash
21
+ npm install @flink-app/stripe-plugin
15
22
  ```
16
23
 
17
- Add and configure plugin in your app startup (probable the `index.ts` in root project):
24
+ ## Usage
18
25
 
19
- ```
20
- import { managementApiPlugin } from "@flink-app/management-api-plugin";
26
+ ### Basic Setup
21
27
 
28
+ ```typescript
29
+ import { FlinkApp } from "@flink-app/flink";
30
+ import { stripePlugin } from "@flink-app/stripe-plugin";
22
31
 
23
32
  function start() {
24
33
  new FlinkApp<AppContext>({
25
34
  name: "My app",
26
35
  plugins: [
27
- // Register plugin
28
- managementApiPlugin({
29
- token : "SECRET_TOKEN_USED_TO_COMMUNICATE_WITH_THE_API",
30
- jwtSecret : "JWT_SECRET_USED_TO_GENERATE_LOGGED_IN_TOKENS",
31
- modules : []
32
- })
36
+ stripePlugin({
37
+ stripeSecreteKey: process.env.STRIPE_SECRET_KEY!,
38
+ stripePublishableKey: process.env.STRIPE_PUBLISHABLE_KEY!,
39
+ JTW_TOKEN: process.env.JWT_SECRET!,
40
+ baseUrl: "/stripe", // optional, defaults to /stripe
41
+ redirectUrl: "https://yourapp.com/success", // Where to redirect after successful operations
42
+ logo: "https://yourapp.com/logo.png", // Optional logo for payment pages
43
+ stripeConnectClientID: process.env.STRIPE_CONNECT_CLIENT_ID, // For Stripe Connect
44
+ paymentCallback: (paymentIntentId, status) => {
45
+ // Handle successful payments
46
+ console.log(`Payment ${paymentIntentId} status: ${status}`);
47
+ },
48
+ stripeConnectCallback: (userId, stripeAccountId) => {
49
+ // Handle Stripe Connect account linking
50
+ console.log(`User ${userId} connected to Stripe account ${stripeAccountId}`);
51
+ },
52
+ phrases: {
53
+ setupDescription: "Add your payment card",
54
+ setupButtonText: "Save Card",
55
+ setupDoneMessage: "Your card has been saved successfully",
56
+ paymentSelectCardPayButtonText: "Pay",
57
+ paymentSelectCardChangeCardButtonText: "Change Card",
58
+ paymentEnterCardPayButtonText: "Pay",
59
+ connectDoneMessage: "Your account has been connected to Stripe",
60
+ },
61
+ }),
33
62
  ],
34
63
  }).start();
35
64
  }
36
65
  ```
37
66
 
38
- ## Communicating with the management api
67
+ ### Add Plugin Context to Your Application
68
+
69
+ ```typescript
70
+ import { stripePluginContext } from "@flink-app/stripe-plugin";
71
+
72
+ export interface AppContext extends FlinkContext<stripePluginContext> {
73
+ repos: {
74
+ // your repos
75
+ };
76
+ }
77
+ ```
78
+
79
+ ## Configuration Options
80
+
81
+ - `stripeSecreteKey` (required): Your Stripe secret API key
82
+ - `stripePublishableKey` (required): Your Stripe publishable API key
83
+ - `JTW_TOKEN` (required): Secret for JWT token generation
84
+ - `baseUrl` (optional): Base URL for plugin routes (defaults to `/stripe`)
85
+ - `redirectUrl` (optional): URL to redirect users after successful operations
86
+ - `logo` (optional): Logo URL to display on payment pages
87
+ - `stripeConnectClientID` (optional): Client ID for Stripe Connect integration
88
+ - `paymentCallback` (optional): Function called when payment succeeds
89
+ - `stripeConnectCallback` (optional): Function called when Stripe Connect linking succeeds
90
+ - `phrases` (optional): Customize UI text for different languages
91
+ - `templates` (optional): Override default Handlebars templates for payment pages
92
+
93
+ ## API Usage
94
+
95
+ ### Customer Management
96
+
97
+ #### Create Customer
98
+
99
+ ```typescript
100
+ const customerId = await ctx.plugins.stripePlugin.stripeAPI.customer.create({
101
+ email: "customer@example.com",
102
+ name: "John Doe",
103
+ metadata: {
104
+ userId: "user123",
105
+ },
106
+ });
107
+ ```
108
+
109
+ #### Check if Customer Has Payment Method
110
+
111
+ ```typescript
112
+ const hasCard = await ctx.plugins.stripePlugin.stripeAPI.customer.hasPaymentMethod({
113
+ stripeCustomerId: "cus_xxxxx",
114
+ });
115
+ ```
116
+
117
+ #### Setup Card Registration
118
+
119
+ ```typescript
120
+ const { token, redirectUrl } = await ctx.plugins.stripePlugin.stripeAPI.customer.setupCard({
121
+ stripeCustomerId: "cus_xxxxx",
122
+ });
123
+
124
+ // Redirect user to redirectUrl to complete card setup
125
+ // Example: https://yourapp.com/stripe/customer/setup-card/JWT_TOKEN
126
+ ```
127
+
128
+ #### Connect to Stripe Connect
129
+
130
+ ```typescript
131
+ const connectUrl = await ctx.plugins.stripePlugin.stripeAPI.customer.connectToStripeConnect({
132
+ userId: "user123",
133
+ });
134
+
135
+ // Redirect user to connectUrl to link their Stripe Connect account
136
+ ```
137
+
138
+ ### Payment Processing
139
+
140
+ #### Create Payment Intent
141
+
142
+ ```typescript
143
+ const payment = await ctx.plugins.stripePlugin.stripeAPI.payment.create({
144
+ amount: 5000, // Amount in cents ($50.00)
145
+ currency: "usd",
146
+ customer: "cus_xxxxx",
147
+ description: "Order #12345",
148
+ capture_method: "automatic", // or "manual" for authorization only
149
+ metadata: {
150
+ orderId: "order_12345",
151
+ },
152
+ });
153
+
154
+ // payment.token - JWT token for payment confirmation
155
+ // payment.paymentUrl - URL to redirect user for payment
156
+ // payment.paymentIntentId - Stripe payment intent ID
157
+ ```
158
+
159
+ #### Confirm Payment
160
+
161
+ ```typescript
162
+ const result = await ctx.plugins.stripePlugin.stripeAPI.payment.confirm({
163
+ paymentIntentId: "pi_xxxxx",
164
+ });
165
+
166
+ // result.confirmed - true if payment was confirmed
167
+ // result.captured - true if payment was captured (only for automatic capture)
168
+ // result.token - JWT token if additional action needed
169
+ // result.redirectUrl - URL to redirect user if additional action needed
170
+ ```
171
+
172
+ #### Create and Confirm Payment (Combined)
173
+
174
+ ```typescript
175
+ const result = await ctx.plugins.stripePlugin.stripeAPI.payment.createAndConfirm({
176
+ amount: 5000,
177
+ currency: "usd",
178
+ customer: "cus_xxxxx",
179
+ description: "Order #12345",
180
+ });
181
+ ```
182
+
183
+ #### Capture Authorized Payment
184
+
185
+ For payments created with `capture_method: "manual"`:
186
+
187
+ ```typescript
188
+ const captured = await ctx.plugins.stripePlugin.stripeAPI.payment.capture({
189
+ paymentIntentId: "pi_xxxxx",
190
+ amount: 5000, // Optional: partial capture amount
191
+ });
192
+ ```
193
+
194
+ ## Hosted Payment Flow
195
+
196
+ The plugin provides pre-built, secure payment pages:
197
+
198
+ ### Card Setup Flow
199
+
200
+ 1. Generate setup URL:
201
+ ```typescript
202
+ const { redirectUrl } = await ctx.plugins.stripePlugin.stripeAPI.customer.setupCard({
203
+ stripeCustomerId: "cus_xxxxx",
204
+ });
205
+ ```
206
+
207
+ 2. Redirect user to `redirectUrl`
208
+ 3. User enters card details on hosted page
209
+ 4. User is redirected to your `redirectUrl` upon completion
210
+
211
+ ### Payment Flow
212
+
213
+ 1. Create payment intent:
214
+ ```typescript
215
+ const { paymentUrl } = await ctx.plugins.stripePlugin.stripeAPI.payment.create({
216
+ amount: 5000,
217
+ currency: "usd",
218
+ customer: "cus_xxxxx",
219
+ });
220
+ ```
221
+
222
+ 2. Redirect user to `paymentUrl`
223
+ 3. Plugin automatically detects if customer has saved cards
224
+ 4. Shows appropriate UI (select saved card or enter new card)
225
+ 5. Processes payment and redirects to your `redirectUrl`
226
+
227
+ ## API Routes
228
+
229
+ The plugin automatically registers these routes:
230
+
231
+ - `GET /stripe/customer/setup-card/:token` - Card setup page
232
+ - `GET /stripe/customer/setup-card-done` - Success page after card setup
233
+ - `GET /stripe/payment/confirm/:token` - Payment confirmation flow entry
234
+ - `GET /stripe/payment/select-card/:token` - Select from saved cards
235
+ - `GET /stripe/payment/enter-card/:token` - Enter new card details
236
+ - `GET /stripe/error` - Error page
237
+ - `POST /stripe/callback/:event` - Webhook for payment status updates
238
+ - `GET /stripe/connect` - Stripe Connect OAuth callback
239
+
240
+ ## Webhooks
241
+
242
+ Configure Stripe webhooks to point to:
243
+ ```
244
+ POST https://yourapp.com/stripe/callback/charge.succeeded
245
+ ```
246
+
247
+ The `paymentCallback` function will be invoked when payments succeed:
248
+
249
+ ```typescript
250
+ paymentCallback: async (paymentIntentId, status) => {
251
+ // Update order status in database
252
+ await ctx.repos.orderRepo.updateByPaymentId(paymentIntentId, {
253
+ status: status === "succeeded" ? "paid" : "authorized",
254
+ });
255
+ }
256
+ ```
257
+
258
+ ## Stripe Connect Integration
259
+
260
+ Enable users to receive payments through Stripe Connect:
261
+
262
+ 1. Configure `stripeConnectClientID` in plugin options
263
+ 2. Generate connect URL:
264
+ ```typescript
265
+ const url = await ctx.plugins.stripePlugin.stripeAPI.customer.connectToStripeConnect({
266
+ userId: "user123",
267
+ });
268
+ ```
269
+ 3. Redirect user to `url`
270
+ 4. User completes Stripe Connect onboarding
271
+ 5. `stripeConnectCallback` is invoked with their Stripe account ID
272
+
273
+ ## Customization
274
+
275
+ ### Custom Templates
276
+
277
+ Override default payment page templates:
278
+
279
+ ```typescript
280
+ stripePlugin({
281
+ // ... other options
282
+ templates: {
283
+ master: customMasterTemplate,
284
+ style: customStyleTemplate,
285
+ setupCard: customSetupCardTemplate,
286
+ setupDone: customSetupDoneTemplate,
287
+ error: customErrorTemplate,
288
+ paySelectCard: customPaySelectCardTemplate,
289
+ payEnterCard: customPayEnterCardTemplate,
290
+ connectDone: customConnectDoneTemplate,
291
+ },
292
+ });
293
+ ```
294
+
295
+ Templates use Handlebars syntax.
296
+
297
+ ### Custom Phrases
298
+
299
+ Customize text for different languages or branding:
300
+
301
+ ```typescript
302
+ phrases: {
303
+ setupDescription: "Lägg till ditt kort",
304
+ setupButtonText: "Spara",
305
+ setupDoneMessage: "Kortet har sparats",
306
+ paymentSelectCardPayButtonText: "Betala",
307
+ paymentSelectCardChangeCardButtonText: "Byt kort",
308
+ paymentEnterCardPayButtonText: "Betala",
309
+ connectDoneMessage: "Kontot har kopplats",
310
+ }
311
+ ```
312
+
313
+ ## Database Requirements
314
+
315
+ This plugin requires MongoDB to be configured for Stripe Connect session management. The plugin automatically creates a `ConnectSessionRepo` repository.
316
+
317
+ ## Security Notes
318
+
319
+ - Never expose your `stripeSecreteKey` in client-side code
320
+ - Store all secrets in environment variables
321
+ - Use the JWT token system for secure payment URLs
322
+ - Validate webhook signatures in production (enhance `paymentCallback` with signature verification)
323
+ - Use HTTPS in production for all payment flows
324
+
325
+ ## Testing
39
326
 
40
- To work with the management api you must in the http header `management-token` send either the `token` specified when register the plugin or a user login token.
327
+ Use Stripe test mode credentials during development:
328
+ - Test secret key: `sk_test_...`
329
+ - Test publishable key: `pk_test_...`
330
+ - Use Stripe's test card numbers
41
331
 
42
- The management API have it's own users system, where you might add, edit or remove management users.
332
+ ## Error Handling
43
333
 
44
- To create a first user to your management api make a POST request to /managementapi/managementapiuser with http-header management-token set to the specified token.
334
+ All API methods throw errors that should be caught and handled:
45
335
 
336
+ ```typescript
337
+ try {
338
+ const payment = await ctx.plugins.stripePlugin.stripeAPI.payment.create({
339
+ amount: 5000,
340
+ currency: "usd",
341
+ customer: "cus_xxxxx",
342
+ });
343
+ } catch (error) {
344
+ console.error("Payment creation failed:", error);
345
+ // Handle error appropriately
346
+ }
46
347
  ```
47
- curl 'https://URL-TO-YOUR-API/managementapi/managementapiuser' \
48
- -H 'management-token: SECRET_TOKEN_USED_TO_COMMUNICATE_WITH_THE_API' \
49
- -H 'Content-Type: application/json;charset=UTF-8' \
50
- --data-raw '{"username":"test","password":"test"}'
348
+
349
+ ## TypeScript Support
350
+
351
+ The plugin includes comprehensive TypeScript definitions for all options, methods, and responses.
352
+
353
+ ## Complete Example
354
+
355
+ ```typescript
356
+ // Create customer
357
+ const customerId = await ctx.plugins.stripePlugin.stripeAPI.customer.create({
358
+ email: user.email,
359
+ name: user.name,
360
+ });
361
+
362
+ // Setup their card
363
+ const { redirectUrl: setupUrl } = await ctx.plugins.stripePlugin.stripeAPI.customer.setupCard({
364
+ stripeCustomerId: customerId,
365
+ });
366
+ // Redirect user to setupUrl
367
+
368
+ // Later, create a payment
369
+ const hasCard = await ctx.plugins.stripePlugin.stripeAPI.customer.hasPaymentMethod({
370
+ stripeCustomerId: customerId,
371
+ });
372
+
373
+ if (hasCard) {
374
+ const result = await ctx.plugins.stripePlugin.stripeAPI.payment.createAndConfirm({
375
+ amount: 5000,
376
+ currency: "usd",
377
+ customer: customerId,
378
+ description: "Premium subscription",
379
+ });
380
+
381
+ if (result.confirmed && result.captured) {
382
+ // Payment successful
383
+ await activatePremiumSubscription(user.id);
384
+ }
385
+ }
51
386
  ```
387
+
388
+ ## License
389
+
390
+ MIT
@@ -1,4 +1,3 @@
1
- import { ExpressResponse } from "@flink-app/flink";
2
1
  import { log } from "@flink-app/flink";
3
2
  import Handlebars from "handlebars";
4
3
 
@@ -7,7 +6,7 @@ export async function HandlebarsTemplateHandler(
7
6
  styleTemplate: string,
8
7
  template: string,
9
8
  pageContext: { [key: string]: any },
10
- res: ExpressResponse
9
+ res: any
11
10
  ) {
12
11
  try {
13
12
  const master = Handlebars.compile(masterTemplate.replace("{{{body}}}", "###BODY###").replace("{{{style}}}", "###STYLE###"))(pageContext);
package/src/index.ts CHANGED
@@ -1,24 +1,24 @@
1
- import { badRequest, FlinkApp, FlinkPlugin, HttpMethod, log, unauthorized } from "@flink-app/flink";
1
+ import { FlinkApp, FlinkPlugin, log } from "@flink-app/flink";
2
2
  import { Stripe } from "stripe";
3
+ import { HandlebarsTemplateHandler } from "./handlers/HandlebarsTemplateHandler";
3
4
  import { stripePluginOptions } from "./schemas/stripePluginOptions";
4
5
  import { StripeAPI } from "./stripeAPI";
5
- import { HandlebarsTemplateHandler } from "./handlers/HandlebarsTemplateHandler";
6
6
  export * from "./stripePluginContext";
7
7
 
8
+ import { connectDoneTemplate } from "./templates/connect-done";
9
+ import { errorTemplate } from "./templates/error";
8
10
  import { masterTemplate } from "./templates/master";
11
+ import { payEnterCardTemplate } from "./templates/pay-enter-card";
12
+ import { paySelectCardTemplate } from "./templates/pay-select-card";
9
13
  import { setupCardTemplate } from "./templates/setup-card";
10
- import { styleTemplate } from "./templates/style";
11
14
  import { setupDoneTemplate } from "./templates/setup-done";
12
- import { errorTemplate } from "./templates/error";
13
- import { paySelectCardTemplate } from "./templates/pay-select-card";
14
- import { payEnterCardTemplate } from "./templates/pay-enter-card";
15
- import { connectDoneTemplate } from "./templates/connect-done";
15
+ import { styleTemplate } from "./templates/style";
16
16
 
17
17
  import { verify } from "jsonwebtoken";
18
- import { stripeAPIToken } from "./schemas/stripeAPIToken";
18
+ import connectSessionRepo from "./reposx/ConnectSessionRepo";
19
19
  import { setupCardTokenOptions } from "./schemas/customer/setupCardTokenOptions";
20
20
  import { confirmPaymentTokenOptions } from "./schemas/payment/confirmPaymentTokenOptions";
21
- import connectSessionRepo from "./reposx/ConnectSessionRepo";
21
+ import { stripeAPIToken } from "./schemas/stripeAPIToken";
22
22
  export const stripePlugin = (options: stripePluginOptions): FlinkPlugin => {
23
23
  if (options.paymentCallback == null) options.paymentCallback = () => {};
24
24
  if (options.stripeConnectCallback == null) options.stripeConnectCallback = () => {};
@@ -49,7 +49,7 @@ function init(app: FlinkApp<any>, options: stripePluginOptions) {
49
49
  if (options.baseUrl == null) options.baseUrl = "/stripe";
50
50
 
51
51
  log.info("Registered route GET " + options.baseUrl + "/customer/setup-card/:token");
52
- app.expressApp?.get(options.baseUrl + "/customer/setup-card/:token", (req, res) => {
52
+ app.expressApp?.get(options.baseUrl + "/customer/setup-card/:token", (req: any, res: any) => {
53
53
  try {
54
54
  const tokenData: stripeAPIToken<setupCardTokenOptions> = verify(req.params.token, options.JTW_TOKEN) as stripeAPIToken<setupCardTokenOptions>;
55
55
  if (tokenData.type != "setup_card") {
@@ -78,7 +78,7 @@ function init(app: FlinkApp<any>, options: stripePluginOptions) {
78
78
 
79
79
  log.info("Registered route GET " + options.baseUrl + "/customer/setup-card-done");
80
80
 
81
- app.expressApp?.get(options.baseUrl + "/customer/setup-card-done/", (req, res) => {
81
+ app.expressApp?.get(options.baseUrl + "/customer/setup-card-done/", (req: any, res: any) => {
82
82
  try {
83
83
  HandlebarsTemplateHandler(
84
84
  app.ctx.plugins.stripePlugin.templates.master,
@@ -97,7 +97,7 @@ function init(app: FlinkApp<any>, options: stripePluginOptions) {
97
97
  }
98
98
  });
99
99
 
100
- app.expressApp?.get(options.baseUrl + "/error", (req, res) => {
100
+ app.expressApp?.get(options.baseUrl + "/error", (req: any, res: any) => {
101
101
  try {
102
102
  HandlebarsTemplateHandler(
103
103
  app.ctx.plugins.stripePlugin.templates.master,
@@ -114,7 +114,7 @@ function init(app: FlinkApp<any>, options: stripePluginOptions) {
114
114
  });
115
115
 
116
116
  log.info("Registered route GET " + options.baseUrl + "/payment/confirm/:token");
117
- app.expressApp?.get(options.baseUrl + "/payment/confirm/:token", async (req, res) => {
117
+ app.expressApp?.get(options.baseUrl + "/payment/confirm/:token", async (req: any, res: any) => {
118
118
  try {
119
119
  const tokenData = verify(req.params.token, options.JTW_TOKEN) as stripeAPIToken<confirmPaymentTokenOptions>;
120
120
  if (tokenData.type != "payment") {
@@ -140,7 +140,7 @@ function init(app: FlinkApp<any>, options: stripePluginOptions) {
140
140
 
141
141
  log.info("Registered route GET " + options.baseUrl + "/payment/select-card/:token");
142
142
 
143
- app.expressApp?.get(options.baseUrl + "/payment/select-card/:token", async (req, res) => {
143
+ app.expressApp?.get(options.baseUrl + "/payment/select-card/:token", async (req: any, res: any) => {
144
144
  try {
145
145
  const tokenData = verify(req.params.token, options.JTW_TOKEN) as stripeAPIToken<confirmPaymentTokenOptions>;
146
146
  if (tokenData.type != "payment") {
@@ -184,7 +184,7 @@ function init(app: FlinkApp<any>, options: stripePluginOptions) {
184
184
  });
185
185
 
186
186
  log.info("Registered route GET " + options.baseUrl + "/payment/enter-card/:token");
187
- app.expressApp?.get(options.baseUrl + "/payment/enter-card/:token", async (req, res) => {
187
+ app.expressApp?.get(options.baseUrl + "/payment/enter-card/:token", async (req: any, res: any) => {
188
188
  try {
189
189
  const tokenData = verify(req.params.token, options.JTW_TOKEN) as stripeAPIToken<confirmPaymentTokenOptions>;
190
190
  if (tokenData.type != "payment") {
@@ -227,7 +227,7 @@ function init(app: FlinkApp<any>, options: stripePluginOptions) {
227
227
  });
228
228
 
229
229
  log.info("Registered route GET " + options.baseUrl + "/callback/:event");
230
- app.expressApp?.post(options.baseUrl + "/callback/:event", async (req, res) => {
230
+ app.expressApp?.post(options.baseUrl + "/callback/:event", async (req: any, res: any) => {
231
231
  if (req.params.event == "charge.succeeded") {
232
232
  const paymentIntentId = req.body?.data?.object?.payment_intent;
233
233
  if (paymentIntentId == null) {
@@ -257,7 +257,7 @@ function init(app: FlinkApp<any>, options: stripePluginOptions) {
257
257
  });
258
258
 
259
259
  log.info("Registered route GET " + options.baseUrl + "/connect");
260
- app.expressApp?.get(options.baseUrl + "/connect", async (req, res) => {
260
+ app.expressApp?.get(options.baseUrl + "/connect", async (req: any, res: any) => {
261
261
  const { code, state } = req.query;
262
262
  if (code && state) {
263
263
  const stripe = app.ctx.plugins.stripePlugin.stripeAPI.stripe as Stripe;
@@ -1,12 +1,10 @@
1
- import { createStripeCustomerOptions } from "../schemas/createStripeCustomerOptions";
2
- import { setupCardResponse } from "../schemas/customer/setupCardResponse";
1
+ import { hasPaymentMethodOptions } from "../schemas/customer/hasPaymentMethodOptions";
3
2
  import { setupCardOptions } from "../schemas/customer/setupCardOptions";
4
3
  import { setupCardTokenOptions } from "../schemas/customer/setupCardTokenOptions";
5
- import { hasPaymentMethodOptions } from "../schemas/customer/hasPaymentMethodOptions";
6
4
 
7
5
  import { sign } from "jsonwebtoken";
8
- import { stripeAPIToken } from "../schemas/stripeAPIToken";
9
6
  import { Stripe } from "stripe";
7
+ import { stripeAPIToken } from "../schemas/stripeAPIToken";
10
8
 
11
9
  export const createStripeCustomer = async (stripe: Stripe, options: Stripe.CustomerCreateParams): Promise<string> => {
12
10
  const resp = await stripe.customers.create(options);
package/tsconfig.json CHANGED
@@ -15,7 +15,7 @@
15
15
  "noEmit": false,
16
16
  "declaration": true,
17
17
  "experimentalDecorators": true,
18
- "checkJs": true,
18
+ "checkJs": false,
19
19
  "outDir": "dist"
20
20
  },
21
21
  "include": ["./src/*"],
@@ -1,11 +0,0 @@
1
- export interface createStripeCustomerOptions {
2
- userId: string;
3
- description?: string;
4
- email?: string;
5
- metaData?: createStripeCustomerMetaData;
6
- name?: string;
7
- phone?: string;
8
- }
9
- export interface createStripeCustomerMetaData {
10
- [key: string]: string;
11
- }
@@ -1,2 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });