@makeco/stripe-kit 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (263) hide show
  1. package/LICENSE.md +21 -0
  2. package/README.md +201 -0
  3. package/dist/cli-prompts/action.d.ts +5 -0
  4. package/dist/cli-prompts/action.d.ts.map +1 -0
  5. package/dist/cli-prompts/action.js +36 -0
  6. package/dist/cli-prompts/action.js.map +1 -0
  7. package/dist/cli-prompts/adapter.d.ts +9 -0
  8. package/dist/cli-prompts/adapter.d.ts.map +1 -0
  9. package/dist/cli-prompts/adapter.js +53 -0
  10. package/dist/cli-prompts/adapter.js.map +1 -0
  11. package/dist/cli-prompts/confirmation.d.ts +6 -0
  12. package/dist/cli-prompts/confirmation.d.ts.map +1 -0
  13. package/dist/cli-prompts/confirmation.js +27 -0
  14. package/dist/cli-prompts/confirmation.js.map +1 -0
  15. package/dist/cli-prompts/environment.d.ts +5 -0
  16. package/dist/cli-prompts/environment.d.ts.map +1 -0
  17. package/dist/cli-prompts/environment.js +43 -0
  18. package/dist/cli-prompts/environment.js.map +1 -0
  19. package/dist/cli-prompts/index.d.ts +5 -0
  20. package/dist/cli-prompts/index.d.ts.map +1 -0
  21. package/dist/cli-prompts/index.js +5 -0
  22. package/dist/cli-prompts/index.js.map +1 -0
  23. package/dist/cli.d.ts +3 -0
  24. package/dist/cli.d.ts.map +1 -0
  25. package/dist/cli.js +33 -0
  26. package/dist/cli.js.map +1 -0
  27. package/dist/commands/archive/archive.action.d.ts +5 -0
  28. package/dist/commands/archive/archive.action.d.ts.map +1 -0
  29. package/dist/commands/archive/archive.action.js +73 -0
  30. package/dist/commands/archive/archive.action.js.map +1 -0
  31. package/dist/commands/archive/archive.command.d.ts +3 -0
  32. package/dist/commands/archive/archive.command.d.ts.map +1 -0
  33. package/dist/commands/archive/archive.command.js +23 -0
  34. package/dist/commands/archive/archive.command.js.map +1 -0
  35. package/dist/commands/archive/archive.preflight.d.ts +13 -0
  36. package/dist/commands/archive/archive.preflight.d.ts.map +1 -0
  37. package/dist/commands/archive/archive.preflight.js +27 -0
  38. package/dist/commands/archive/archive.preflight.js.map +1 -0
  39. package/dist/commands/archive/index.d.ts +2 -0
  40. package/dist/commands/archive/index.d.ts.map +1 -0
  41. package/dist/commands/archive/index.js +2 -0
  42. package/dist/commands/archive/index.js.map +1 -0
  43. package/dist/commands/config/config.command.d.ts +3 -0
  44. package/dist/commands/config/config.command.d.ts.map +1 -0
  45. package/dist/commands/config/config.command.js +33 -0
  46. package/dist/commands/config/config.command.js.map +1 -0
  47. package/dist/commands/config/index.d.ts +2 -0
  48. package/dist/commands/config/index.d.ts.map +1 -0
  49. package/dist/commands/config/index.js +2 -0
  50. package/dist/commands/config/index.js.map +1 -0
  51. package/dist/commands/create/create.action.d.ts +5 -0
  52. package/dist/commands/create/create.action.d.ts.map +1 -0
  53. package/dist/commands/create/create.action.js +53 -0
  54. package/dist/commands/create/create.action.js.map +1 -0
  55. package/dist/commands/create/create.command.d.ts +3 -0
  56. package/dist/commands/create/create.command.d.ts.map +1 -0
  57. package/dist/commands/create/create.command.js +21 -0
  58. package/dist/commands/create/create.command.js.map +1 -0
  59. package/dist/commands/create/create.preflight.d.ts +13 -0
  60. package/dist/commands/create/create.preflight.d.ts.map +1 -0
  61. package/dist/commands/create/create.preflight.js +24 -0
  62. package/dist/commands/create/create.preflight.js.map +1 -0
  63. package/dist/commands/create/index.d.ts +2 -0
  64. package/dist/commands/create/index.d.ts.map +1 -0
  65. package/dist/commands/create/index.js +2 -0
  66. package/dist/commands/create/index.js.map +1 -0
  67. package/dist/commands/db/db.command.d.ts +3 -0
  68. package/dist/commands/db/db.command.d.ts.map +1 -0
  69. package/dist/commands/db/db.command.js +13 -0
  70. package/dist/commands/db/db.command.js.map +1 -0
  71. package/dist/commands/db/index.d.ts +4 -0
  72. package/dist/commands/db/index.d.ts.map +1 -0
  73. package/dist/commands/db/index.js +4 -0
  74. package/dist/commands/db/index.js.map +1 -0
  75. package/dist/commands/db/purge/index.d.ts +2 -0
  76. package/dist/commands/db/purge/index.d.ts.map +1 -0
  77. package/dist/commands/db/purge/index.js +2 -0
  78. package/dist/commands/db/purge/index.js.map +1 -0
  79. package/dist/commands/db/purge/purge.action.d.ts +3 -0
  80. package/dist/commands/db/purge/purge.action.d.ts.map +1 -0
  81. package/dist/commands/db/purge/purge.action.js +17 -0
  82. package/dist/commands/db/purge/purge.action.js.map +1 -0
  83. package/dist/commands/db/purge/purge.command.d.ts +3 -0
  84. package/dist/commands/db/purge/purge.command.d.ts.map +1 -0
  85. package/dist/commands/db/purge/purge.command.js +22 -0
  86. package/dist/commands/db/purge/purge.command.js.map +1 -0
  87. package/dist/commands/db/purge/purge.preflight.d.ts +12 -0
  88. package/dist/commands/db/purge/purge.preflight.d.ts.map +1 -0
  89. package/dist/commands/db/purge/purge.preflight.js +27 -0
  90. package/dist/commands/db/purge/purge.preflight.js.map +1 -0
  91. package/dist/commands/db/sync/index.d.ts +2 -0
  92. package/dist/commands/db/sync/index.d.ts.map +1 -0
  93. package/dist/commands/db/sync/index.js +2 -0
  94. package/dist/commands/db/sync/index.js.map +1 -0
  95. package/dist/commands/db/sync/sync.action.d.ts +3 -0
  96. package/dist/commands/db/sync/sync.action.d.ts.map +1 -0
  97. package/dist/commands/db/sync/sync.action.js +24 -0
  98. package/dist/commands/db/sync/sync.action.js.map +1 -0
  99. package/dist/commands/db/sync/sync.command.d.ts +3 -0
  100. package/dist/commands/db/sync/sync.command.d.ts.map +1 -0
  101. package/dist/commands/db/sync/sync.command.js +22 -0
  102. package/dist/commands/db/sync/sync.command.js.map +1 -0
  103. package/dist/commands/db/sync/sync.preflight.d.ts +12 -0
  104. package/dist/commands/db/sync/sync.preflight.d.ts.map +1 -0
  105. package/dist/commands/db/sync/sync.preflight.js +33 -0
  106. package/dist/commands/db/sync/sync.preflight.js.map +1 -0
  107. package/dist/commands/index.d.ts +8 -0
  108. package/dist/commands/index.d.ts.map +1 -0
  109. package/dist/commands/index.js +8 -0
  110. package/dist/commands/index.js.map +1 -0
  111. package/dist/commands/list/index.d.ts +4 -0
  112. package/dist/commands/list/index.d.ts.map +1 -0
  113. package/dist/commands/list/index.js +4 -0
  114. package/dist/commands/list/index.js.map +1 -0
  115. package/dist/commands/list/list.command.d.ts +3 -0
  116. package/dist/commands/list/list.command.d.ts.map +1 -0
  117. package/dist/commands/list/list.command.js +13 -0
  118. package/dist/commands/list/list.command.js.map +1 -0
  119. package/dist/commands/list/prices/index.d.ts +2 -0
  120. package/dist/commands/list/prices/index.d.ts.map +1 -0
  121. package/dist/commands/list/prices/index.js +2 -0
  122. package/dist/commands/list/prices/index.js.map +1 -0
  123. package/dist/commands/list/prices/prices.action.d.ts +5 -0
  124. package/dist/commands/list/prices/prices.action.d.ts.map +1 -0
  125. package/dist/commands/list/prices/prices.action.js +40 -0
  126. package/dist/commands/list/prices/prices.action.js.map +1 -0
  127. package/dist/commands/list/prices/prices.command.d.ts +3 -0
  128. package/dist/commands/list/prices/prices.command.d.ts.map +1 -0
  129. package/dist/commands/list/prices/prices.command.js +21 -0
  130. package/dist/commands/list/prices/prices.command.js.map +1 -0
  131. package/dist/commands/list/prices/prices.preflight.d.ts +13 -0
  132. package/dist/commands/list/prices/prices.preflight.d.ts.map +1 -0
  133. package/dist/commands/list/prices/prices.preflight.js +19 -0
  134. package/dist/commands/list/prices/prices.preflight.js.map +1 -0
  135. package/dist/commands/list/products/index.d.ts +2 -0
  136. package/dist/commands/list/products/index.d.ts.map +1 -0
  137. package/dist/commands/list/products/index.js +2 -0
  138. package/dist/commands/list/products/index.js.map +1 -0
  139. package/dist/commands/list/products/products.action.d.ts +5 -0
  140. package/dist/commands/list/products/products.action.d.ts.map +1 -0
  141. package/dist/commands/list/products/products.action.js +32 -0
  142. package/dist/commands/list/products/products.action.js.map +1 -0
  143. package/dist/commands/list/products/products.command.d.ts +3 -0
  144. package/dist/commands/list/products/products.command.d.ts.map +1 -0
  145. package/dist/commands/list/products/products.command.js +21 -0
  146. package/dist/commands/list/products/products.command.js.map +1 -0
  147. package/dist/commands/list/products/products.preflight.d.ts +13 -0
  148. package/dist/commands/list/products/products.preflight.d.ts.map +1 -0
  149. package/dist/commands/list/products/products.preflight.js +19 -0
  150. package/dist/commands/list/products/products.preflight.js.map +1 -0
  151. package/dist/commands/update/index.d.ts +2 -0
  152. package/dist/commands/update/index.d.ts.map +1 -0
  153. package/dist/commands/update/index.js +2 -0
  154. package/dist/commands/update/index.js.map +1 -0
  155. package/dist/commands/update/update.action.d.ts +3 -0
  156. package/dist/commands/update/update.action.d.ts.map +1 -0
  157. package/dist/commands/update/update.action.js +84 -0
  158. package/dist/commands/update/update.action.js.map +1 -0
  159. package/dist/commands/update/update.command.d.ts +3 -0
  160. package/dist/commands/update/update.command.d.ts.map +1 -0
  161. package/dist/commands/update/update.command.js +21 -0
  162. package/dist/commands/update/update.command.js.map +1 -0
  163. package/dist/commands/update/update.preflight.d.ts +12 -0
  164. package/dist/commands/update/update.preflight.d.ts.map +1 -0
  165. package/dist/commands/update/update.preflight.js +36 -0
  166. package/dist/commands/update/update.preflight.js.map +1 -0
  167. package/dist/commands/urls/index.d.ts +2 -0
  168. package/dist/commands/urls/index.d.ts.map +1 -0
  169. package/dist/commands/urls/index.js +2 -0
  170. package/dist/commands/urls/index.js.map +1 -0
  171. package/dist/commands/urls/urls.action.d.ts +4 -0
  172. package/dist/commands/urls/urls.action.d.ts.map +1 -0
  173. package/dist/commands/urls/urls.action.js +65 -0
  174. package/dist/commands/urls/urls.action.js.map +1 -0
  175. package/dist/commands/urls/urls.command.d.ts +6 -0
  176. package/dist/commands/urls/urls.command.d.ts.map +1 -0
  177. package/dist/commands/urls/urls.command.js +19 -0
  178. package/dist/commands/urls/urls.command.js.map +1 -0
  179. package/dist/definitions/action.constants.d.ts +14 -0
  180. package/dist/definitions/action.constants.d.ts.map +1 -0
  181. package/dist/definitions/action.constants.js +22 -0
  182. package/dist/definitions/action.constants.js.map +1 -0
  183. package/dist/definitions/config.schemas.d.ts +278 -0
  184. package/dist/definitions/config.schemas.d.ts.map +1 -0
  185. package/dist/definitions/config.schemas.js +30 -0
  186. package/dist/definitions/config.schemas.js.map +1 -0
  187. package/dist/definitions/context.types.d.ts +18 -0
  188. package/dist/definitions/context.types.d.ts.map +1 -0
  189. package/dist/definitions/context.types.js +2 -0
  190. package/dist/definitions/context.types.js.map +1 -0
  191. package/dist/definitions/database-adapter.schemas.d.ts +20 -0
  192. package/dist/definitions/database-adapter.schemas.d.ts.map +1 -0
  193. package/dist/definitions/database-adapter.schemas.js +18 -0
  194. package/dist/definitions/database-adapter.schemas.js.map +1 -0
  195. package/dist/definitions/env.constants.d.ts +9 -0
  196. package/dist/definitions/env.constants.d.ts.map +1 -0
  197. package/dist/definitions/env.constants.js +8 -0
  198. package/dist/definitions/env.constants.js.map +1 -0
  199. package/dist/definitions/index.d.ts +9 -0
  200. package/dist/definitions/index.d.ts.map +1 -0
  201. package/dist/definitions/index.js +9 -0
  202. package/dist/definitions/index.js.map +1 -0
  203. package/dist/definitions/stripe-price.schemas.d.ts +132 -0
  204. package/dist/definitions/stripe-price.schemas.d.ts.map +1 -0
  205. package/dist/definitions/stripe-price.schemas.js +50 -0
  206. package/dist/definitions/stripe-price.schemas.js.map +1 -0
  207. package/dist/definitions/stripe-product.schemas.d.ts +87 -0
  208. package/dist/definitions/stripe-product.schemas.d.ts.map +1 -0
  209. package/dist/definitions/stripe-product.schemas.js +42 -0
  210. package/dist/definitions/stripe-product.schemas.js.map +1 -0
  211. package/dist/definitions/utility.types.d.ts +4 -0
  212. package/dist/definitions/utility.types.d.ts.map +1 -0
  213. package/dist/definitions/utility.types.js +2 -0
  214. package/dist/definitions/utility.types.js.map +1 -0
  215. package/dist/index.d.ts +3 -0
  216. package/dist/index.d.ts.map +1 -0
  217. package/dist/index.js +3 -0
  218. package/dist/index.js.map +1 -0
  219. package/dist/utils/create-context.d.ts +6 -0
  220. package/dist/utils/create-context.d.ts.map +1 -0
  221. package/dist/utils/create-context.js +21 -0
  222. package/dist/utils/create-context.js.map +1 -0
  223. package/dist/utils/create-logger.d.ts +3 -0
  224. package/dist/utils/create-logger.d.ts.map +1 -0
  225. package/dist/utils/create-logger.js +38 -0
  226. package/dist/utils/create-logger.js.map +1 -0
  227. package/dist/utils/create-mappers.d.ts +3 -0
  228. package/dist/utils/create-mappers.d.ts.map +1 -0
  229. package/dist/utils/create-mappers.js +98 -0
  230. package/dist/utils/create-mappers.js.map +1 -0
  231. package/dist/utils/define-config.d.ts +3 -0
  232. package/dist/utils/define-config.d.ts.map +1 -0
  233. package/dist/utils/define-config.js +6 -0
  234. package/dist/utils/define-config.js.map +1 -0
  235. package/dist/utils/find-env-directories.d.ts +2 -0
  236. package/dist/utils/find-env-directories.d.ts.map +1 -0
  237. package/dist/utils/find-env-directories.js +84 -0
  238. package/dist/utils/find-env-directories.js.map +1 -0
  239. package/dist/utils/index.d.ts +12 -0
  240. package/dist/utils/index.d.ts.map +1 -0
  241. package/dist/utils/index.js +12 -0
  242. package/dist/utils/index.js.map +1 -0
  243. package/dist/utils/load-config.d.ts +6 -0
  244. package/dist/utils/load-config.d.ts.map +1 -0
  245. package/dist/utils/load-config.js +84 -0
  246. package/dist/utils/load-config.js.map +1 -0
  247. package/dist/utils/load-env.d.ts +3 -0
  248. package/dist/utils/load-env.d.ts.map +1 -0
  249. package/dist/utils/load-env.js +54 -0
  250. package/dist/utils/load-env.js.map +1 -0
  251. package/dist/utils/stripe-client.d.ts +3 -0
  252. package/dist/utils/stripe-client.d.ts.map +1 -0
  253. package/dist/utils/stripe-client.js +10 -0
  254. package/dist/utils/stripe-client.js.map +1 -0
  255. package/dist/utils/stripe-repository.d.ts +16 -0
  256. package/dist/utils/stripe-repository.d.ts.map +1 -0
  257. package/dist/utils/stripe-repository.js +73 -0
  258. package/dist/utils/stripe-repository.js.map +1 -0
  259. package/dist/utils/user-preferences.d.ts +10 -0
  260. package/dist/utils/user-preferences.d.ts.map +1 -0
  261. package/dist/utils/user-preferences.js +40 -0
  262. package/dist/utils/user-preferences.js.map +1 -0
  263. package/package.json +84 -0
package/LICENSE.md ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 makeco-labs
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,201 @@
1
+ # stripe-kit
2
+
3
+ [![npm version](https://badge.fury.io/js/%40makeco%2Fstripe-kit.svg)](https://badge.fury.io/js/%40makeco%2Fstripe-kit)
4
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
5
+ [![GitHub issues](https://img.shields.io/github/issues/makeco/stripe-kit)](https://github.com/makeco/stripe-kit/issues)
6
+ [![GitHub stars](https://img.shields.io/github/stars/makeco/stripe-kit)](https://github.com/makeco/stripe-kit/stargazers)
7
+
8
+ An unofficial CLI tool for creating, archiving, updating Stripe products and prices and syncing them to your database.
9
+
10
+ ## Installation
11
+
12
+ ```bash
13
+ npm install @makeco/stripe-kit
14
+ ```
15
+
16
+ ## CLI Usage
17
+
18
+ ### Core Commands
19
+
20
+ ```bash
21
+ # Create subscription plans in Stripe
22
+ stripe-kit create -e dev -a postgres
23
+
24
+ # Archive subscription plans in Stripe
25
+ stripe-kit archive -e prod -a postgres
26
+
27
+ # Sync Stripe plans to database
28
+ stripe-kit db sync -e staging -a postgres
29
+
30
+ # Update existing Stripe plans
31
+ stripe-kit update -e prod -a postgres
32
+
33
+ # Database operations
34
+ stripe-kit db purge -e dev -a postgres
35
+ ```
36
+
37
+ ### Utility Commands
38
+
39
+ ```bash
40
+ # Show Stripe dashboard URLs
41
+ stripe-kit urls # Interactive selection (shows both live & test URLs)
42
+ stripe-kit urls -a # Show all URLs with labels
43
+
44
+ # List Stripe products
45
+ stripe-kit list products -e dev --all
46
+
47
+ # List Stripe prices
48
+ stripe-kit list prices -e dev --all
49
+
50
+ # View current user preferences
51
+ stripe-kit config
52
+ ```
53
+
54
+ ### Global Options
55
+
56
+ - `-c, --config <path>` - Path to stripe.config.ts file (defaults to ./stripe.config.ts)
57
+ - `-e, --env <environment>` - Target environment (test, dev, staging, prod)
58
+ - `-a, --adapter <name>` - Database adapter name
59
+
60
+ ## User Preferences
61
+
62
+ The CLI remembers your last used environment and adapter selections for faster workflow:
63
+
64
+ ```bash
65
+ # First time - you'll be prompted to select
66
+ stripe-kit create
67
+
68
+ # Subsequent runs - your last selection is pre-selected
69
+ stripe-kit archive # Uses your last environment/adapter as initial choice
70
+
71
+ # View current preferences
72
+ stripe-kit config
73
+ ```
74
+
75
+ Preferences are stored in `~/.config/@makeco/stripe-kit/config.json`
76
+
77
+ ## Subcommands
78
+
79
+ ### Database Operations
80
+
81
+ ```bash
82
+ # Show available database operations
83
+ stripe-kit db
84
+
85
+ # Purge database plans
86
+ stripe-kit db purge -e dev -a postgres
87
+
88
+ # Sync Stripe plans to database
89
+ stripe-kit db sync -e dev -a postgres
90
+ ```
91
+
92
+ ### List Operations
93
+
94
+ ```bash
95
+ # Show available list operations
96
+ stripe-kit list
97
+
98
+ # List products
99
+ stripe-kit list products -e dev --all
100
+
101
+ # List prices
102
+ stripe-kit list prices -e dev --all
103
+ ```
104
+
105
+ ## API Usage
106
+
107
+ ```typescript
108
+ import { defineConfig } from 'stripe-kit';
109
+
110
+ // Use the configuration helper
111
+ export default defineConfig({
112
+ plans: [
113
+ {
114
+ product: {
115
+ id: 'basic-plan',
116
+ name: 'Basic Plan',
117
+ description: 'Our basic subscription plan'
118
+ },
119
+ prices: [
120
+ {
121
+ id: 'basic-monthly',
122
+ nickname: 'Basic Monthly',
123
+ unitAmount: 999,
124
+ currency: 'usd',
125
+ recurring: { interval: 'month' }
126
+ }
127
+ ]
128
+ }
129
+ ],
130
+ adapters: {
131
+ postgres: {
132
+ // Your database adapter configuration
133
+ connectionString: process.env.DATABASE_URL
134
+ }
135
+ }
136
+ });
137
+ ```
138
+
139
+ ## Configuration
140
+
141
+ Create a `stripe.config.ts` file in your project root:
142
+
143
+ ```typescript
144
+ import { defineConfig } from 'stripe-kit';
145
+
146
+ export default defineConfig({
147
+ plans: [
148
+ {
149
+ product: {
150
+ id: 'pro-plan',
151
+ name: 'Pro Plan',
152
+ description: 'Professional features for growing teams'
153
+ },
154
+ prices: [
155
+ {
156
+ id: 'pro-monthly',
157
+ nickname: 'Pro Monthly',
158
+ unitAmount: 2999,
159
+ currency: 'usd',
160
+ recurring: { interval: 'month' }
161
+ },
162
+ {
163
+ id: 'pro-yearly',
164
+ nickname: 'Pro Yearly',
165
+ unitAmount: 29999,
166
+ currency: 'usd',
167
+ recurring: { interval: 'year' }
168
+ }
169
+ ]
170
+ }
171
+ ],
172
+ adapters: {
173
+ postgres: {
174
+ // Your PostgreSQL adapter configuration
175
+ connectionString: process.env.DATABASE_URL
176
+ }
177
+ },
178
+ // Optional: Custom mappers for your database schema
179
+ mappers: {
180
+ // Define how to map Stripe objects to your database schema
181
+ }
182
+ });
183
+ ```
184
+
185
+ ## Environment Variables
186
+
187
+ Create environment files for different stages:
188
+
189
+ ```bash
190
+ # .env.development
191
+ STRIPE_SECRET_KEY=sk_test_...
192
+ DATABASE_URL=postgresql://...
193
+
194
+ # .env.production
195
+ STRIPE_SECRET_KEY=sk_live_...
196
+ DATABASE_URL=postgresql://...
197
+ ```
198
+
199
+ ## Database Support
200
+
201
+ Supports PostgreSQL, MySQL, and SQLite via custom database adapters. The CLI automatically detects and uses your configured adapters.
@@ -0,0 +1,5 @@
1
+ import type { ActionKey } from '../definitions/index.js';
2
+ export declare function determineAction(input: {
3
+ actionInput?: string;
4
+ }): Promise<ActionKey>;
5
+ //# sourceMappingURL=action.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action.d.ts","sourceRoot":"","sources":["../../src/cli-prompts/action.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAMhD,wBAAsB,eAAe,CAAC,KAAK,EAAE;IAC3C,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,GAAG,OAAO,CAAC,SAAS,CAAC,CAyCrB"}
@@ -0,0 +1,36 @@
1
+ import chalk from 'chalk';
2
+ import prompts from 'prompts';
3
+ import { ACTION_DESCRIPTIONS, VALID_ACTIONS } from '../definitions/index.js';
4
+ export async function determineAction(input) {
5
+ const { actionInput } = input;
6
+ if (actionInput && VALID_ACTIONS.includes(actionInput)) {
7
+ const action = actionInput;
8
+ console.log(chalk.green(`Action specified via argument: ${chalk.bold(action)}`));
9
+ return action;
10
+ }
11
+ if (actionInput) {
12
+ console.log(chalk.yellow(`Invalid action specified: "${actionInput}". Prompting...`));
13
+ }
14
+ try {
15
+ const response = await prompts({
16
+ type: 'select',
17
+ name: 'value',
18
+ message: chalk.blue('Select the action to perform:'),
19
+ choices: VALID_ACTIONS.map((action) => ({
20
+ title: ACTION_DESCRIPTIONS[action],
21
+ value: action,
22
+ })),
23
+ initial: 0,
24
+ });
25
+ if (!response.value) {
26
+ process.exit(0);
27
+ }
28
+ console.log(chalk.green(`Action selected via prompt: ${chalk.bold(response.value)}`));
29
+ return response.value;
30
+ }
31
+ catch (error) {
32
+ console.error(chalk.red('Error during action prompt:'), error);
33
+ process.exit(1);
34
+ }
35
+ }
36
+ //# sourceMappingURL=action.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action.js","sourceRoot":"","sources":["../../src/cli-prompts/action.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,OAAO,MAAM,SAAS,CAAC;AAE9B,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAKpE,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,KAErC;IACC,MAAM,EAAE,WAAW,EAAE,GAAG,KAAK,CAAC;IAE9B,IAAI,WAAW,IAAI,aAAa,CAAC,QAAQ,CAAC,WAAwB,CAAC,EAAE,CAAC;QACpE,MAAM,MAAM,GAAG,WAAwB,CAAC;QACxC,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,KAAK,CAAC,kCAAkC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CACpE,CAAC;QACF,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,MAAM,CAAC,8BAA8B,WAAW,iBAAiB,CAAC,CACzE,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC;YAC7B,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,+BAA+B,CAAC;YACpD,OAAO,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;gBACtC,KAAK,EAAE,mBAAmB,CAAC,MAAM,CAAC;gBAClC,KAAK,EAAE,MAAM;aACd,CAAC,CAAC;YACH,OAAO,EAAE,CAAC;SACX,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;YACpB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,KAAK,CAAC,+BAA+B,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CACzE,CAAC;QACF,OAAO,QAAQ,CAAC,KAAK,CAAC;IACxB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,6BAA6B,CAAC,EAAE,KAAK,CAAC,CAAC;QAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { DatabaseAdapter } from '../definitions/index.js';
2
+ export declare function determineAdapter(input: {
3
+ adapterInput: string | undefined;
4
+ availableAdapters: Record<string, DatabaseAdapter>;
5
+ }): Promise<{
6
+ name: string;
7
+ adapter: DatabaseAdapter;
8
+ }>;
9
+ //# sourceMappingURL=adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../src/cli-prompts/adapter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAUrD,wBAAsB,gBAAgB,CAAC,KAAK,EAAE;IAC5C,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;CACpD,GAAG,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,eAAe,CAAA;CAAE,CAAC,CA4EtD"}
@@ -0,0 +1,53 @@
1
+ import chalk from 'chalk';
2
+ import prompts from 'prompts';
3
+ import { getLastUsedAdapter, saveUserPreference } from '../utils/index.js';
4
+ export async function determineAdapter(input) {
5
+ const { adapterInput, availableAdapters } = input;
6
+ const adapterNames = Object.keys(availableAdapters);
7
+ if (adapterNames.length === 0) {
8
+ console.error(chalk.red('No adapters found in configuration'));
9
+ process.exit(1);
10
+ }
11
+ if (adapterNames.length === 1) {
12
+ const adapterName = adapterNames[0];
13
+ console.log(chalk.green(`Auto-selected adapter: ${chalk.bold(adapterName)}`));
14
+ return { name: adapterName, adapter: availableAdapters[adapterName] };
15
+ }
16
+ if (adapterInput) {
17
+ if (availableAdapters[adapterInput]) {
18
+ console.log(chalk.green(`Adapter specified via flag: ${chalk.bold(adapterInput)}`));
19
+ saveUserPreference('defaultAdapter', adapterInput);
20
+ return { name: adapterInput, adapter: availableAdapters[adapterInput] };
21
+ }
22
+ console.log(chalk.yellow(`Invalid adapter specified: "${adapterInput}". Available: ${adapterNames.join(', ')}`));
23
+ }
24
+ const lastUsedAdapter = getLastUsedAdapter();
25
+ const initialIndex = lastUsedAdapter && adapterNames.includes(lastUsedAdapter)
26
+ ? adapterNames.indexOf(lastUsedAdapter)
27
+ : 0;
28
+ try {
29
+ const response = await prompts({
30
+ type: 'select',
31
+ name: 'value',
32
+ message: chalk.blue(lastUsedAdapter && adapterNames.includes(lastUsedAdapter)
33
+ ? `Select the database adapter (last used: ${chalk.bold(lastUsedAdapter)}):`
34
+ : 'Select the database adapter:'),
35
+ choices: adapterNames.map((name) => ({
36
+ title: name.charAt(0).toUpperCase() + name.slice(1),
37
+ value: name,
38
+ })),
39
+ initial: initialIndex,
40
+ });
41
+ if (!response.value) {
42
+ process.exit(0);
43
+ }
44
+ console.log(chalk.green(`Adapter selected via prompt: ${chalk.bold(response.value)}`));
45
+ saveUserPreference('defaultAdapter', response.value);
46
+ return { name: response.value, adapter: availableAdapters[response.value] };
47
+ }
48
+ catch (error) {
49
+ console.error(chalk.red('Error during adapter prompt:'), error);
50
+ process.exit(1);
51
+ }
52
+ }
53
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../src/cli-prompts/adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { EnvironmentKey } from '../definitions/index.js';
2
+ export declare function requireProductionConfirmation(input: {
3
+ action: string;
4
+ env: EnvironmentKey;
5
+ }): Promise<void>;
6
+ //# sourceMappingURL=confirmation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"confirmation.d.ts","sourceRoot":"","sources":["../../src/cli-prompts/confirmation.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAOrD,wBAAsB,6BAA6B,CAAC,KAAK,EAAE;IACzD,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,cAAc,CAAC;CACrB,GAAG,OAAO,CAAC,IAAI,CAAC,CAmChB"}
@@ -0,0 +1,27 @@
1
+ import chalk from 'chalk';
2
+ import prompts from 'prompts';
3
+ import { ENVIRONMENTS } from '../definitions/index.js';
4
+ export async function requireProductionConfirmation(input) {
5
+ const { action, env } = input;
6
+ if (env !== ENVIRONMENTS.PROD) {
7
+ return;
8
+ }
9
+ console.log(chalk.red.bold(`\nWARNING: You are about to perform a ${action.toUpperCase()} operation on PRODUCTION Stripe!`));
10
+ console.log(chalk.yellow('This operation may affect the production Stripe configuration.'));
11
+ try {
12
+ const response = await prompts({
13
+ type: 'confirm',
14
+ name: 'value',
15
+ message: chalk.red(`Are you absolutely sure you want to ${action} in PRODUCTION Stripe?`),
16
+ initial: false,
17
+ });
18
+ if (!response.value) {
19
+ process.exit(0);
20
+ }
21
+ }
22
+ catch (error) {
23
+ console.error(chalk.red('Error during confirmation prompt:'), error);
24
+ process.exit(1);
25
+ }
26
+ }
27
+ //# sourceMappingURL=confirmation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"confirmation.js","sourceRoot":"","sources":["../../src/cli-prompts/confirmation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,OAAO,MAAM,SAAS,CAAC;AAE9B,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAM9C,MAAM,CAAC,KAAK,UAAU,6BAA6B,CAAC,KAGnD;IACC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC;IAE9B,IAAI,GAAG,KAAK,YAAY,CAAC,IAAI,EAAE,CAAC;QAC9B,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CAAC,IAAI,CACZ,yCAAyC,MAAM,CAAC,WAAW,EAAE,kCAAkC,CAChG,CACF,CAAC;IACF,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,MAAM,CACV,gEAAgE,CACjE,CACF,CAAC;IAEF,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC;YAC7B,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,KAAK,CAAC,GAAG,CAChB,uCAAuC,MAAM,wBAAwB,CACtE;YACD,OAAO,EAAE,KAAK;SACf,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;YACpB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,mCAAmC,CAAC,EAAE,KAAK,CAAC,CAAC;QACrE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { EnvironmentKey } from '../definitions/index.js';
2
+ export declare function determineEnvironment(input: {
3
+ envInput?: EnvironmentKey;
4
+ }): Promise<EnvironmentKey>;
5
+ //# sourceMappingURL=environment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"environment.d.ts","sourceRoot":"","sources":["../../src/cli-prompts/environment.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAOpD,wBAAsB,oBAAoB,CAAC,KAAK,EAAE;IAChD,QAAQ,CAAC,EAAE,cAAc,CAAC;CAC3B,GAAG,OAAO,CAAC,cAAc,CAAC,CAuD1B"}
@@ -0,0 +1,43 @@
1
+ import chalk from 'chalk';
2
+ import prompts from 'prompts';
3
+ import { VALID_ENVIRONMENTS } from '../definitions/index.js';
4
+ import { getLastUsedEnvironment, saveUserPreference } from '../utils/index.js';
5
+ export async function determineEnvironment(input) {
6
+ const { envInput } = input;
7
+ if (envInput && VALID_ENVIRONMENTS.includes(envInput)) {
8
+ console.log(chalk.green(`Environment specified via flag: ${chalk.bold(envInput)}`));
9
+ saveUserPreference('defaultEnvironment', envInput);
10
+ return envInput;
11
+ }
12
+ const lastUsedEnv = getLastUsedEnvironment();
13
+ const initialIndex = lastUsedEnv
14
+ ? VALID_ENVIRONMENTS.indexOf(lastUsedEnv)
15
+ : 0;
16
+ try {
17
+ const response = await prompts({
18
+ type: 'select',
19
+ name: 'value',
20
+ message: chalk.blue(lastUsedEnv
21
+ ? `Select the target environment (last used: ${chalk.bold(lastUsedEnv)}):`
22
+ : 'Select the target environment:'),
23
+ choices: [
24
+ { title: 'Test', value: 'test' },
25
+ { title: 'Development', value: 'dev' },
26
+ { title: 'Staging', value: 'staging' },
27
+ { title: 'Production', value: 'prod' },
28
+ ],
29
+ initial: initialIndex >= 0 ? initialIndex : 0,
30
+ });
31
+ if (!response.value) {
32
+ process.exit(0);
33
+ }
34
+ console.log(chalk.green(`Environment selected via prompt: ${chalk.bold(response.value)}`));
35
+ saveUserPreference('defaultEnvironment', response.value);
36
+ return response.value;
37
+ }
38
+ catch (error) {
39
+ console.error(chalk.red('Error during environment prompt:'), error);
40
+ process.exit(1);
41
+ }
42
+ }
43
+ //# sourceMappingURL=environment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"environment.js","sourceRoot":"","sources":["../../src/cli-prompts/environment.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,OAAO,MAAM,SAAS,CAAC;AAE9B,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAKrE,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,KAE1C;IACC,MAAM,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;IAG3B,IAAI,QAAQ,IAAI,kBAAkB,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QACtD,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,KAAK,CAAC,mCAAmC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CACvE,CAAC;QAEF,kBAAkB,CAAC,oBAAoB,EAAE,QAAQ,CAAC,CAAC;QACnD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAGD,MAAM,WAAW,GAAG,sBAAsB,EAAE,CAAC;IAC7C,MAAM,YAAY,GAAG,WAAW;QAC9B,CAAC,CAAC,kBAAkB,CAAC,OAAO,CAAC,WAAW,CAAC;QACzC,CAAC,CAAC,CAAC,CAAC;IAEN,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC;YAC7B,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,KAAK,CAAC,IAAI,CACjB,WAAW;gBACT,CAAC,CAAC,6CAA6C,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI;gBAC1E,CAAC,CAAC,gCAAgC,CACrC;YACD,OAAO,EAAE;gBACP,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;gBAChC,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,EAAE;gBACtC,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE;gBACtC,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE;aACvC;YACD,OAAO,EAAE,YAAY,IAAI,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;SAC9C,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;YACpB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,KAAK,CACT,oCAAoC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CACjE,CACF,CAAC;QAGF,kBAAkB,CAAC,oBAAoB,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;QAEzD,OAAO,QAAQ,CAAC,KAAK,CAAC;IACxB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,kCAAkC,CAAC,EAAE,KAAK,CAAC,CAAC;QACpE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -0,0 +1,5 @@
1
+ export * from './action.js';
2
+ export * from './adapter.js';
3
+ export * from './confirmation.js';
4
+ export * from './environment.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli-prompts/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC"}
@@ -0,0 +1,5 @@
1
+ export * from './action.js';
2
+ export * from './adapter.js';
3
+ export * from './confirmation.js';
4
+ export * from './environment.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli-prompts/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
package/dist/cli.js ADDED
@@ -0,0 +1,33 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from 'commander';
3
+ import { archive, config, create, db, list, sync, update, urls, } from './commands/index.js';
4
+ process.on('SIGINT', () => process.exit(0));
5
+ process.on('SIGTERM', () => process.exit(0));
6
+ process.on('uncaughtException', (error) => {
7
+ console.error('❌ Uncaught exception:', error.message);
8
+ process.exit(1);
9
+ });
10
+ process.on('unhandledRejection', (reason) => {
11
+ console.error('❌ Unhandled rejection:', reason);
12
+ process.exit(1);
13
+ });
14
+ const packageVersion = '0.1.0';
15
+ function main() {
16
+ const program = new Command()
17
+ .name('stripe-kit')
18
+ .description('CLI to manage Stripe subscription plans')
19
+ .version(packageVersion, '-v, --version', 'display the version number')
20
+ .option('-c, --config <path>', 'Path to stripe.config.ts file (defaults to ./stripe.config.ts)');
21
+ program
22
+ .addCommand(create)
23
+ .addCommand(archive)
24
+ .addCommand(config)
25
+ .addCommand(sync)
26
+ .addCommand(update)
27
+ .addCommand(db)
28
+ .addCommand(list)
29
+ .addCommand(urls);
30
+ program.parse();
31
+ }
32
+ main();
33
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,OAAO,EACL,OAAO,EACP,MAAM,EACN,MAAM,EACN,EAAE,EACF,IAAI,EACJ,IAAI,EACJ,MAAM,EACN,IAAI,GACL,MAAM,YAAY,CAAC;AAGpB,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5C,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AAG7C,OAAO,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAAC,KAAK,EAAE,EAAE;IACxC,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AAEH,OAAO,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAAC,MAAM,EAAE,EAAE;IAC1C,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,MAAM,CAAC,CAAC;IAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AAEH,MAAM,cAAc,GAAG,OAAO,CAAC;AAE/B,SAAS,IAAI;IACX,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE;SAC1B,IAAI,CAAC,YAAY,CAAC;SAClB,WAAW,CAAC,yCAAyC,CAAC;SACtD,OAAO,CAAC,cAAc,EAAE,eAAe,EAAE,4BAA4B,CAAC;SACtE,MAAM,CACL,qBAAqB,EACrB,gEAAgE,CACjE,CAAC;IAGJ,OAAO;SACJ,UAAU,CAAC,MAAM,CAAC;SAClB,UAAU,CAAC,OAAO,CAAC;SACnB,UAAU,CAAC,MAAM,CAAC;SAClB,UAAU,CAAC,IAAI,CAAC;SAChB,UAAU,CAAC,MAAM,CAAC;SAClB,UAAU,CAAC,EAAE,CAAC;SACd,UAAU,CAAC,IAAI,CAAC;SAChB,UAAU,CAAC,IAAI,CAAC,CAAC;IAEpB,OAAO,CAAC,KAAK,EAAE,CAAC;AAClB,CAAC;AAED,IAAI,EAAE,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { Context } from '../../definitions/index.js';
2
+ export declare function archiveStripeSubscriptionPlans(ctx: Context, input: {
3
+ internalProductIds: string[];
4
+ }): Promise<void>;
5
+ //# sourceMappingURL=archive.action.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"archive.action.d.ts","sourceRoot":"","sources":["../../../src/commands/archive/archive.action.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AA4F7C,wBAAsB,8BAA8B,CAClD,GAAG,EAAE,OAAO,EACZ,KAAK,EAAE;IACL,kBAAkB,EAAE,MAAM,EAAE,CAAC;CAC9B,GACA,OAAO,CAAC,IAAI,CAAC,CAkBf"}
@@ -0,0 +1,73 @@
1
+ import { findStripeProduct, listStripePrices } from '../../utils/index.js';
2
+ async function archiveStripeProducts(ctx, input) {
3
+ const { internalProductIds } = input;
4
+ if (!internalProductIds.length) {
5
+ ctx.logger.info('No product IDs provided for archiving');
6
+ return;
7
+ }
8
+ let archivedCount = 0;
9
+ for (const internalProductId of internalProductIds) {
10
+ try {
11
+ const product = await findStripeProduct(ctx, { internalProductId });
12
+ if (!product) {
13
+ ctx.logger.info(`Product not found in Stripe: ${internalProductId}`);
14
+ continue;
15
+ }
16
+ await ctx.stripeClient.products.update(product.id, {
17
+ active: false,
18
+ });
19
+ ctx.logger.info(`Archived product in Stripe: ${product.id} (Internal ID: ${internalProductId})`);
20
+ archivedCount++;
21
+ }
22
+ catch (error) {
23
+ ctx.logger.error({
24
+ message: 'Error archiving product in Stripe',
25
+ error,
26
+ internalProductId,
27
+ });
28
+ }
29
+ }
30
+ if (archivedCount === 0) {
31
+ ctx.logger.info('No products were archived in Stripe');
32
+ }
33
+ }
34
+ async function archiveStripePrices(ctx, input) {
35
+ const { internalProductIds } = input;
36
+ if (!internalProductIds.length) {
37
+ ctx.logger.info('No product IDs provided for archiving');
38
+ return;
39
+ }
40
+ const prices = await listStripePrices(ctx, { showAll: false });
41
+ const pricesToArchive = prices.filter((price) => internalProductIds.includes(price.metadata?.[ctx.config.metadata.productIdField] ?? ''));
42
+ if (pricesToArchive.length === 0) {
43
+ ctx.logger.info('No prices to archive in Stripe');
44
+ return;
45
+ }
46
+ for (const price of pricesToArchive) {
47
+ try {
48
+ await ctx.stripeClient.prices.update(price.id, {
49
+ active: false,
50
+ });
51
+ ctx.logger.info(`Archived price in Stripe: ${price.id}`);
52
+ }
53
+ catch (error) {
54
+ ctx.logger.error({
55
+ message: 'Error archiving price in Stripe',
56
+ error,
57
+ priceId: price.id,
58
+ });
59
+ }
60
+ }
61
+ }
62
+ export async function archiveStripeSubscriptionPlans(ctx, input) {
63
+ const { internalProductIds } = input;
64
+ if (internalProductIds.length === 0) {
65
+ ctx.logger.info('No product IDs provided for archiving');
66
+ return;
67
+ }
68
+ ctx.logger.info(`Archiving ${internalProductIds.length} subscription plans in Stripe...`);
69
+ await archiveStripeProducts(ctx, { internalProductIds });
70
+ await archiveStripePrices(ctx, { internalProductIds });
71
+ ctx.logger.info(`Successfully archived ${internalProductIds.length} subscription plans in Stripe`);
72
+ }
73
+ //# sourceMappingURL=archive.action.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"archive.action.js","sourceRoot":"","sources":["../../../src/commands/archive/archive.action.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const archive: Command;
3
+ //# sourceMappingURL=archive.command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"archive.command.d.ts","sourceRoot":"","sources":["../../../src/commands/archive/archive.command.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,eAAO,MAAM,OAAO,SA0BhB,CAAC"}
@@ -0,0 +1,23 @@
1
+ import chalk from 'chalk';
2
+ import { Command } from 'commander';
3
+ import { archiveStripeSubscriptionPlans } from './archive.action.js';
4
+ import { runArchivePreflight } from './archive.preflight.js';
5
+ export const archive = new Command()
6
+ .name('archive')
7
+ .description('Archive Stripe subscription plans')
8
+ .option('-e, --env <environment>', 'Target environment (test, dev, staging, prod)')
9
+ .option('-a, --adapter <name>', 'Database adapter name')
10
+ .action(async (options, command) => {
11
+ try {
12
+ const { ctx, productIdsToArchive } = await runArchivePreflight(options, command);
13
+ await archiveStripeSubscriptionPlans(ctx, {
14
+ internalProductIds: productIdsToArchive,
15
+ });
16
+ console.log(chalk.green('\nOperation completed successfully.'));
17
+ }
18
+ catch (error) {
19
+ console.error(chalk.red(`\nOperation failed: ${error}`));
20
+ process.exit(1);
21
+ }
22
+ });
23
+ //# sourceMappingURL=archive.command.js.map