@reeboot/strapi-payment-plugin 0.0.0 → 0.0.2

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 (81) hide show
  1. package/README.md +398 -66
  2. package/dist/_chunks/Analytics-C2GKvPDX.js +355 -0
  3. package/dist/_chunks/Analytics-Chydh3dg.mjs +355 -0
  4. package/dist/_chunks/App-BCbEuN6h.mjs +68 -0
  5. package/dist/_chunks/App-E2k2mo5p.js +70 -0
  6. package/dist/_chunks/Customers-B8BlQ1BO.mjs +273 -0
  7. package/dist/_chunks/Customers-D0O5ET5C.js +273 -0
  8. package/dist/_chunks/Dashboard-CuqclLak.js +180 -0
  9. package/dist/_chunks/Dashboard-D8-ifJqB.mjs +180 -0
  10. package/dist/_chunks/Orders-5WGSzPGo.js +308 -0
  11. package/dist/_chunks/Orders-ClJJaQrX.mjs +308 -0
  12. package/dist/_chunks/Payments-CIMyOC3n.js +489 -0
  13. package/dist/_chunks/Payments-CRnRBf48.mjs +489 -0
  14. package/dist/_chunks/Settings-BXMLePI_.js +357 -0
  15. package/dist/_chunks/Settings-TeAvV4RH.mjs +357 -0
  16. package/dist/_chunks/en-BJocyOVu.mjs +240 -0
  17. package/dist/_chunks/en-BkVAf_R4.js +240 -0
  18. package/dist/_chunks/index-BTk7a2T5.js +66 -0
  19. package/dist/_chunks/index-Bz8V_5zH.mjs +67 -0
  20. package/dist/admin/index.js +2 -63
  21. package/dist/admin/index.mjs +2 -63
  22. package/dist/admin/src/components/AnalyticsChart.d.ts +19 -0
  23. package/dist/admin/src/components/CustomerList.d.ts +21 -0
  24. package/dist/admin/src/components/OrderList.d.ts +27 -0
  25. package/dist/admin/src/components/PaymentCard.d.ts +39 -0
  26. package/dist/admin/src/components/PaymentList.d.ts +19 -0
  27. package/dist/admin/src/components/RefundModal.d.ts +15 -0
  28. package/dist/admin/src/pages/Analytics.d.ts +2 -0
  29. package/dist/admin/src/pages/Customers.d.ts +2 -0
  30. package/dist/admin/src/pages/Dashboard.d.ts +2 -0
  31. package/dist/admin/src/pages/HomePage.d.ts +1 -1
  32. package/dist/admin/src/pages/Orders.d.ts +2 -0
  33. package/dist/admin/src/pages/Payments.d.ts +2 -0
  34. package/dist/admin/src/pages/Settings.d.ts +2 -0
  35. package/dist/server/index.js +1827 -7101
  36. package/dist/server/index.mjs +1826 -7100
  37. package/dist/server/src/config/index.d.ts +2 -10
  38. package/dist/server/src/content-types/customer/index.d.ts +69 -0
  39. package/dist/server/src/content-types/index.d.ts +207 -1
  40. package/dist/server/src/content-types/order/index.d.ts +70 -0
  41. package/dist/server/src/content-types/payment/index.d.ts +69 -0
  42. package/dist/server/src/controllers/controller.d.ts +6 -9
  43. package/dist/server/src/controllers/index.d.ts +30 -35
  44. package/dist/server/src/controllers/stripe.d.ts +104 -0
  45. package/dist/server/src/index.d.ts +262 -110
  46. package/dist/server/src/middlewares/index.d.ts +19 -1
  47. package/dist/server/src/policies/index.d.ts +3 -1
  48. package/dist/server/src/routes/{admin-routes.d.ts → admin/index.d.ts} +4 -4
  49. package/dist/server/src/routes/content-api/index.d.ts +21 -0
  50. package/dist/server/src/routes/index.d.ts +10 -26
  51. package/dist/server/src/services/index.d.ts +2 -37
  52. package/dist/server/src/services/{stripeDriver.d.ts → stripe.d.ts} +52 -28
  53. package/dist/server/src/types/index.d.ts +179 -0
  54. package/package.json +20 -24
  55. package/dist/_chunks/App-BGle38NN.js +0 -1149
  56. package/dist/_chunks/App-DoUUpjp-.mjs +0 -1149
  57. package/dist/_chunks/en-B4KWt_jN.js +0 -4
  58. package/dist/_chunks/en-Byx4XI2L.mjs +0 -4
  59. package/dist/admin/src/components/Header.d.ts +0 -2
  60. package/dist/admin/src/components/NavigationMenu.d.ts +0 -2
  61. package/dist/admin/src/components/Sidebar.d.ts +0 -2
  62. package/dist/admin/src/components/TransactionDetailsModal.d.ts +0 -18
  63. package/dist/admin/src/components/TransactionList.d.ts +0 -18
  64. package/dist/admin/src/pages/ConfigurationPage.d.ts +0 -2
  65. package/dist/admin/src/pages/DashboardPage.d.ts +0 -2
  66. package/dist/admin/src/pages/ProductsPage.d.ts +0 -2
  67. package/dist/admin/src/pages/SubscriptionsPage.d.ts +0 -2
  68. package/dist/admin/src/pages/TransactionsPage.d.ts +0 -2
  69. package/dist/server/controllers/product.d.ts +0 -12
  70. package/dist/server/controllers/subscription.d.ts +0 -12
  71. package/dist/server/services/product.d.ts +0 -7
  72. package/dist/server/services/subscription.d.ts +0 -7
  73. package/dist/server/src/controllers/productController.d.ts +0 -9
  74. package/dist/server/src/controllers/subscriptionController.d.ts +0 -9
  75. package/dist/server/src/routes/content-api.d.ts +0 -12
  76. package/dist/server/src/routes/product-routes.d.ts +0 -13
  77. package/dist/server/src/routes/refund-routes.d.ts +0 -13
  78. package/dist/server/src/routes/subscription-routes.d.ts +0 -13
  79. package/dist/server/src/services/paypalDriver.d.ts +0 -7
  80. package/dist/server/src/services/service.d.ts +0 -33
  81. package/jest.config.js +0 -13
@@ -10,150 +10,302 @@ declare const _default: {
10
10
  strapi: import("@strapi/types/dist/core").Strapi;
11
11
  }) => void;
12
12
  config: {
13
- stripe: {
14
- secretKey: string;
15
- publishableKey: string;
16
- webhookSecret: string;
17
- };
18
- paypal: {
19
- clientId: string;
20
- clientSecret: string;
21
- webhookId: string;
22
- };
13
+ default: {};
14
+ validator(): void;
23
15
  };
24
16
  controllers: {
25
- controller: {
26
- initiatePayment(ctx: any): Promise<void>;
27
- processWebhook(ctx: any): Promise<void>;
28
- refundPayment(ctx: any): Promise<void>;
29
- getPaymentDetails(ctx: any): Promise<void>;
30
- getTransactions(ctx: any): Promise<void>;
31
- saveConfiguration(ctx: any): Promise<void>;
32
- getConfigStatus(ctx: any): Promise<void>;
33
- };
34
- productController: {
35
- find(ctx: import("koa").Context): Promise<void>;
36
- findOne(ctx: import("koa").Context): Promise<import("koa").Context>;
37
- create(ctx: import("koa").Context): Promise<void>;
38
- update(ctx: import("koa").Context): Promise<void>;
39
- delete(ctx: import("koa").Context): Promise<void>;
40
- };
41
- subscriptionController: {
42
- find(ctx: import("koa").Context): Promise<void>;
43
- findOne(ctx: import("koa").Context): Promise<import("koa").Context>;
44
- create(ctx: import("koa").Context): Promise<void>;
45
- update(ctx: import("koa").Context): Promise<void>;
46
- delete(ctx: import("koa").Context): Promise<void>;
47
- };
48
- product: {
49
- find(ctx: import("koa").Context): Promise<void>;
50
- findOne(ctx: import("koa").Context): Promise<import("koa").Context>;
51
- create(ctx: import("koa").Context): Promise<void>;
52
- update(ctx: import("koa").Context): Promise<void>;
53
- delete(ctx: import("koa").Context): Promise<void>;
17
+ controller: ({ strapi }: {
18
+ strapi: import("@strapi/types/dist/core").Strapi;
19
+ }) => {
20
+ index(ctx: any): void;
54
21
  };
55
- subscription: {
56
- find(ctx: import("koa").Context): Promise<void>;
57
- findOne(ctx: import("koa").Context): Promise<import("koa").Context>;
58
- create(ctx: import("koa").Context): Promise<void>;
59
- update(ctx: import("koa").Context): Promise<void>;
60
- delete(ctx: import("koa").Context): Promise<void>;
22
+ stripe: {
23
+ createPaymentIntent(ctx: import("koa").Context): Promise<import("koa").Context>;
24
+ confirmPayment(ctx: import("koa").Context): Promise<import("koa").Context>;
25
+ createCustomer(ctx: import("koa").Context): Promise<import("koa").Context>;
26
+ retrieveCustomer(ctx: import("koa").Context): Promise<import("koa").Context>;
27
+ createRefund(ctx: import("koa").Context): Promise<import("koa").Context>;
28
+ handleWebhook(ctx: import("koa").Context): Promise<import("koa").Context>;
29
+ getServiceStatus(ctx: import("koa").Context): Promise<void>;
30
+ getPaymentDetails(ctx: import("koa").Context): Promise<any>;
31
+ listPayments(ctx: import("koa").Context): Promise<void>;
32
+ listCustomers(ctx: import("koa").Context): Promise<void>;
33
+ createOrder(ctx: import("koa").Context): Promise<import("koa").Context>;
34
+ getOrderDetails(ctx: import("koa").Context): Promise<import("koa").Context>;
35
+ listOrders(ctx: import("koa").Context): Promise<void>;
36
+ getDashboardData(ctx: import("koa").Context): Promise<void>;
37
+ getPaymentReports(ctx: import("koa").Context): Promise<void>;
38
+ getPluginConfig(ctx: import("koa").Context): Promise<void>;
39
+ updatePluginConfig(ctx: import("koa").Context): Promise<void>;
40
+ getAnalytics(ctx: import("koa").Context): Promise<void>;
41
+ adminCreateRefund(ctx: import("koa").Context): Promise<import("koa").Context>;
42
+ adminListPayments(ctx: import("koa").Context): Promise<void>;
43
+ adminListCustomers(ctx: import("koa").Context): Promise<void>;
44
+ adminListOrders(ctx: import("koa").Context): Promise<void>;
45
+ testWebhook(ctx: import("koa").Context): Promise<void>;
46
+ initializePayment(ctx: import("koa").Context): Promise<void>;
47
+ createSamplePayment(ctx: import("koa").Context): Promise<void>;
61
48
  };
62
49
  };
63
50
  routes: {
64
- adminRoutes: {
51
+ 'content-api': {
65
52
  type: string;
66
- routes: {
53
+ routes: ({
67
54
  method: string;
68
55
  path: string;
69
56
  handler: string;
70
57
  config: {
71
- policies: any[];
72
58
  auth: boolean;
73
- };
74
- }[];
75
- };
76
- productRoutes: {
77
- type: string;
78
- routes: {
79
- method: string;
80
- path: string;
81
- handler: string; /**
82
- * Plugin server methods
83
- */
84
- config: {
85
59
  policies: any[];
86
- auth: boolean;
87
60
  };
88
- }[];
89
- };
90
- subscriptionRoutes: {
91
- type: string;
92
- routes: {
61
+ } | {
93
62
  method: string;
94
63
  path: string;
95
64
  handler: string;
96
65
  config: {
97
66
  policies: any[];
98
- auth: boolean;
67
+ auth?: undefined;
99
68
  };
100
- }[];
69
+ })[];
101
70
  };
102
- refundRoutes: {
71
+ /**
72
+ * Plugin server methods
73
+ */
74
+ admin: {
103
75
  type: string;
104
76
  routes: {
105
77
  method: string;
106
78
  path: string;
107
79
  handler: string;
108
80
  config: {
109
- policies: any[];
110
- auth: boolean;
81
+ policies: string[];
82
+ middlewares: any[];
111
83
  };
112
84
  }[];
113
85
  };
114
86
  };
115
87
  services: {
116
- service: {
117
- initializePayment(gateway: any, amount: any, currency: any, orderId: any, options: any): Promise<any>;
118
- processWebhook(gateway: any, payload: any, signature: any): Promise<any>;
119
- refundPayment(gateway: any, transactionId: any, amount: any, options: any): Promise<any>;
120
- getPaymentDetails(gateway: any, transactionId: any): Promise<any>;
121
- getTransactions(gateway: any, status: any, limit: any, offset: any): Promise<{
122
- data: {
123
- id: string;
124
- amount: number;
125
- currency: string;
126
- status: string;
127
- date: string;
128
- customer: string;
129
- paymentMethod: string;
130
- gateway: any;
131
- }[];
132
- meta: {
133
- total: number;
134
- limit: any;
135
- offset: any;
88
+ stripe: ({ strapi }: {
89
+ strapi: import("@strapi/types/dist/core").Strapi;
90
+ }) => import("./services/stripe").StripeService;
91
+ };
92
+ contentTypes: {
93
+ customer: {
94
+ schema: {
95
+ kind: string;
96
+ collectionName: string;
97
+ info: {
98
+ singularName: string;
99
+ pluralName: string;
100
+ displayName: string;
101
+ description: string;
136
102
  };
137
- }>;
138
- saveConfiguration(configData: any): Promise<{
139
- success: boolean;
140
- message: string;
141
- data: any;
142
- }>;
143
- getConfigStatus(): Promise<{
144
- stripe: boolean;
145
- paypal: boolean;
146
- }>;
103
+ options: {
104
+ draftAndPublish: boolean;
105
+ };
106
+ pluginOptions: {
107
+ i18n: {
108
+ localized: boolean;
109
+ };
110
+ };
111
+ attributes: {
112
+ email: {
113
+ type: string;
114
+ unique: boolean;
115
+ required: boolean;
116
+ configurable: boolean;
117
+ };
118
+ stripe_customer_id: {
119
+ type: string;
120
+ unique: boolean;
121
+ required: boolean;
122
+ configurable: boolean;
123
+ };
124
+ first_name: {
125
+ type: string;
126
+ required: boolean;
127
+ configurable: boolean;
128
+ };
129
+ last_name: {
130
+ type: string;
131
+ required: boolean;
132
+ configurable: boolean;
133
+ };
134
+ phone: {
135
+ type: string;
136
+ configurable: boolean;
137
+ };
138
+ address: {
139
+ type: string;
140
+ configurable: boolean;
141
+ };
142
+ metadata: {
143
+ type: string;
144
+ configurable: boolean;
145
+ };
146
+ orders: {
147
+ type: string;
148
+ relation: string;
149
+ target: string;
150
+ mappedBy: string;
151
+ };
152
+ payments: {
153
+ type: string;
154
+ relation: string;
155
+ target: string;
156
+ mappedBy: string;
157
+ };
158
+ };
159
+ };
147
160
  };
148
- product: ({ strapi, }: {
149
- strapi: import("@strapi/types/dist/core").Strapi;
150
- }) => Partial<import("@strapi/types/dist/core/core-api/service").Base> & import("@strapi/types/dist/core/core-api/service").Generic & import("@strapi/types/dist/core/core-api/service").Base;
151
- subscription: ({ strapi, }: {
152
- strapi: import("@strapi/types/dist/core").Strapi;
153
- }) => Partial<import("@strapi/types/dist/core/core-api/service").Base> & import("@strapi/types/dist/core/core-api/service").Generic & import("@strapi/types/dist/core/core-api/service").Base;
161
+ order: {
162
+ schema: {
163
+ kind: string;
164
+ collectionName: string;
165
+ info: {
166
+ singularName: string;
167
+ pluralName: string;
168
+ displayName: string;
169
+ description: string;
170
+ };
171
+ options: {
172
+ draftAndPublish: boolean;
173
+ };
174
+ pluginOptions: {
175
+ i18n: {
176
+ localized: boolean;
177
+ };
178
+ };
179
+ attributes: {
180
+ order_number: {
181
+ type: string;
182
+ unique: boolean;
183
+ required: boolean;
184
+ configurable: boolean;
185
+ };
186
+ total_amount: {
187
+ type: string;
188
+ required: boolean;
189
+ min: number;
190
+ configurable: boolean;
191
+ default: number;
192
+ };
193
+ currency: {
194
+ type: string;
195
+ required: boolean;
196
+ default: string;
197
+ configurable: boolean;
198
+ };
199
+ status: {
200
+ type: string;
201
+ enum: string[];
202
+ required: boolean;
203
+ default: string;
204
+ configurable: boolean;
205
+ };
206
+ customer: {
207
+ type: string;
208
+ relation: string;
209
+ target: string;
210
+ inversedBy: string;
211
+ };
212
+ payments: {
213
+ type: string;
214
+ relation: string;
215
+ target: string;
216
+ mappedBy: string;
217
+ };
218
+ items: {
219
+ type: string;
220
+ required: boolean;
221
+ configurable: boolean;
222
+ };
223
+ metadata: {
224
+ type: string;
225
+ configurable: boolean;
226
+ };
227
+ };
228
+ };
229
+ };
230
+ /**
231
+ * Plugin server methods
232
+ */
233
+ payment: {
234
+ schema: {
235
+ kind: string;
236
+ collectionName: string;
237
+ info: {
238
+ singularName: string;
239
+ pluralName: string;
240
+ displayName: string;
241
+ description: string;
242
+ };
243
+ options: {
244
+ draftAndPublish: boolean;
245
+ };
246
+ pluginOptions: {
247
+ i18n: {
248
+ localized: boolean;
249
+ };
250
+ };
251
+ attributes: {
252
+ stripe_payment_intent_id: {
253
+ type: string;
254
+ unique: boolean;
255
+ required: boolean;
256
+ configurable: boolean;
257
+ };
258
+ amount: {
259
+ type: string;
260
+ required: boolean;
261
+ min: number;
262
+ configurable: boolean;
263
+ default: number;
264
+ };
265
+ currency: {
266
+ type: string;
267
+ required: boolean;
268
+ default: string;
269
+ configurable: boolean;
270
+ };
271
+ status: {
272
+ type: string;
273
+ enum: string[];
274
+ required: boolean;
275
+ default: string;
276
+ configurable: boolean;
277
+ };
278
+ payment_method: {
279
+ type: string;
280
+ configurable: boolean;
281
+ };
282
+ metadata: {
283
+ type: string;
284
+ configurable: boolean;
285
+ };
286
+ customer: {
287
+ type: string;
288
+ relation: string;
289
+ target: string;
290
+ inversedBy: string;
291
+ };
292
+ order: {
293
+ type: string;
294
+ relation: string;
295
+ target: string;
296
+ inversedBy: string;
297
+ };
298
+ };
299
+ };
300
+ };
301
+ };
302
+ policies: {
303
+ isAuthenticated: (ctx: any) => boolean;
304
+ };
305
+ middlewares: {
306
+ 'webhook-validator': (ctx: import("koa").Context, next: () => Promise<any>) => Promise<import("koa").Context>;
307
+ rateLimiter: (ctx: import("koa").Context, next: () => Promise<any>) => Promise<any>;
308
+ inputSanitizer: (ctx: import("koa").Context, next: () => Promise<any>) => Promise<void>;
154
309
  };
155
- contentTypes: {};
156
- policies: {};
157
- middlewares: {};
158
310
  };
159
311
  export default _default;
@@ -1,2 +1,20 @@
1
- declare const _default: {};
1
+ import type { Context } from 'koa';
2
+ /**
3
+ * Webhook validator middleware for Stripe webhooks
4
+ * This middleware validates the webhook signature and handles raw body parsing
5
+ */
6
+ declare const _default: {
7
+ /**
8
+ * Webhook signature validator
9
+ */
10
+ 'webhook-validator': (ctx: Context, next: () => Promise<any>) => Promise<Context>;
11
+ /**
12
+ * Rate limiter middleware for sensitive operations
13
+ */
14
+ rateLimiter: (ctx: Context, next: () => Promise<any>) => Promise<any>;
15
+ /**
16
+ * Input sanitization middleware
17
+ */
18
+ inputSanitizer: (ctx: Context, next: () => Promise<any>) => Promise<void>;
19
+ };
2
20
  export default _default;
@@ -1,2 +1,4 @@
1
- declare const _default: {};
1
+ declare const _default: {
2
+ isAuthenticated: (ctx: any) => boolean;
3
+ };
2
4
  export default _default;
@@ -1,13 +1,13 @@
1
- declare const _default: {
1
+ declare const routes: {
2
2
  type: string;
3
3
  routes: {
4
4
  method: string;
5
5
  path: string;
6
6
  handler: string;
7
7
  config: {
8
- policies: any[];
9
- auth: boolean;
8
+ policies: string[];
9
+ middlewares: any[];
10
10
  };
11
11
  }[];
12
12
  };
13
- export default _default;
13
+ export default routes;
@@ -0,0 +1,21 @@
1
+ declare const routes: {
2
+ type: string;
3
+ routes: ({
4
+ method: string;
5
+ path: string;
6
+ handler: string;
7
+ config: {
8
+ auth: boolean;
9
+ policies: any[];
10
+ };
11
+ } | {
12
+ method: string;
13
+ path: string;
14
+ handler: string;
15
+ config: {
16
+ policies: any[];
17
+ auth?: undefined;
18
+ };
19
+ })[];
20
+ };
21
+ export default routes;
@@ -1,51 +1,35 @@
1
- declare const _default: {
2
- adminRoutes: {
1
+ declare const routes: {
2
+ 'content-api': {
3
3
  type: string;
4
- routes: {
4
+ routes: ({
5
5
  method: string;
6
6
  path: string;
7
7
  handler: string;
8
8
  config: {
9
- policies: any[];
10
9
  auth: boolean;
11
- };
12
- }[];
13
- };
14
- productRoutes: {
15
- type: string;
16
- routes: {
17
- method: string;
18
- path: string;
19
- handler: string;
20
- config: {
21
10
  policies: any[];
22
- auth: boolean;
23
11
  };
24
- }[];
25
- };
26
- subscriptionRoutes: {
27
- type: string;
28
- routes: {
12
+ } | {
29
13
  method: string;
30
14
  path: string;
31
15
  handler: string;
32
16
  config: {
33
17
  policies: any[];
34
- auth: boolean;
18
+ auth?: undefined;
35
19
  };
36
- }[];
20
+ })[];
37
21
  };
38
- refundRoutes: {
22
+ admin: {
39
23
  type: string;
40
24
  routes: {
41
25
  method: string;
42
26
  path: string;
43
27
  handler: string;
44
28
  config: {
45
- policies: any[];
46
- auth: boolean;
29
+ policies: string[];
30
+ middlewares: any[];
47
31
  };
48
32
  }[];
49
33
  };
50
34
  };
51
- export default _default;
35
+ export default routes;
@@ -1,41 +1,6 @@
1
1
  declare const _default: {
2
- service: {
3
- initializePayment(gateway: any, amount: any, currency: any, orderId: any, options: any): Promise<any>;
4
- processWebhook(gateway: any, payload: any, signature: any): Promise<any>;
5
- refundPayment(gateway: any, transactionId: any, amount: any, options: any): Promise<any>;
6
- getPaymentDetails(gateway: any, transactionId: any): Promise<any>;
7
- getTransactions(gateway: any, status: any, limit: any, offset: any): Promise<{
8
- data: {
9
- id: string;
10
- amount: number;
11
- currency: string;
12
- status: string;
13
- date: string;
14
- customer: string;
15
- paymentMethod: string;
16
- gateway: any;
17
- }[];
18
- meta: {
19
- total: number;
20
- limit: any;
21
- offset: any;
22
- };
23
- }>;
24
- saveConfiguration(configData: any): Promise<{
25
- success: boolean;
26
- message: string;
27
- data: any;
28
- }>;
29
- getConfigStatus(): Promise<{
30
- stripe: boolean;
31
- paypal: boolean;
32
- }>;
33
- };
34
- product: ({ strapi, }: {
2
+ stripe: ({ strapi }: {
35
3
  strapi: import("@strapi/types/dist/core").Strapi;
36
- }) => Partial<import("@strapi/types/dist/core/core-api/service").Base> & import("@strapi/types/dist/core/core-api/service").Generic & import("@strapi/types/dist/core/core-api/service").Base;
37
- subscription: ({ strapi, }: {
38
- strapi: import("@strapi/types/dist/core").Strapi;
39
- }) => Partial<import("@strapi/types/dist/core/core-api/service").Base> & import("@strapi/types/dist/core/core-api/service").Generic & import("@strapi/types/dist/core/core-api/service").Base;
4
+ }) => import("./stripe").StripeService;
40
5
  };
41
6
  export default _default;