@forgecart/cli 1.0.0 → 1.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 (202) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +7 -7
  3. package/bin/forgecart.js +1 -1
  4. package/dist/package.json +50 -0
  5. package/dist/src/cli.d.ts.map +1 -0
  6. package/dist/{cli.js → src/cli.js} +8 -6
  7. package/dist/src/cli.js.map +1 -0
  8. package/dist/src/commands/delete.d.ts.map +1 -0
  9. package/dist/{commands → src/commands}/delete.js +8 -3
  10. package/dist/src/commands/delete.js.map +1 -0
  11. package/dist/src/commands/deploy.d.ts.map +1 -0
  12. package/dist/src/commands/deploy.js +243 -0
  13. package/dist/src/commands/deploy.js.map +1 -0
  14. package/dist/src/commands/env.d.ts.map +1 -0
  15. package/dist/{commands → src/commands}/env.js +70 -12
  16. package/dist/src/commands/env.js.map +1 -0
  17. package/dist/src/commands/init.d.ts.map +1 -0
  18. package/dist/{commands → src/commands}/init.js +103 -17
  19. package/dist/src/commands/init.js.map +1 -0
  20. package/dist/src/commands/list.d.ts.map +1 -0
  21. package/dist/{commands → src/commands}/list.js +6 -2
  22. package/dist/src/commands/list.js.map +1 -0
  23. package/dist/src/commands/login.d.ts +3 -0
  24. package/dist/src/commands/login.d.ts.map +1 -0
  25. package/dist/src/commands/login.js +120 -0
  26. package/dist/src/commands/login.js.map +1 -0
  27. package/dist/src/commands/logs.d.ts.map +1 -0
  28. package/dist/src/commands/logs.js +88 -0
  29. package/dist/src/commands/logs.js.map +1 -0
  30. package/dist/src/commands/scale.d.ts.map +1 -0
  31. package/dist/{commands → src/commands}/scale.js +7 -3
  32. package/dist/src/commands/scale.js.map +1 -0
  33. package/dist/src/commands/status.d.ts.map +1 -0
  34. package/dist/{commands → src/commands}/status.js +7 -2
  35. package/dist/src/commands/status.js.map +1 -0
  36. package/dist/src/commands/whoami.d.ts.map +1 -0
  37. package/dist/{commands → src/commands}/whoami.js +20 -7
  38. package/dist/src/commands/whoami.js.map +1 -0
  39. package/dist/{index.d.ts.map → src/index.d.ts.map} +1 -1
  40. package/dist/src/index.js.map +1 -0
  41. package/dist/src/lib/api-client.d.ts +34 -0
  42. package/dist/src/lib/api-client.d.ts.map +1 -0
  43. package/dist/src/lib/api-client.js +141 -0
  44. package/dist/src/lib/api-client.js.map +1 -0
  45. package/dist/{lib → src/lib}/archive.d.ts +2 -1
  46. package/dist/src/lib/archive.d.ts.map +1 -0
  47. package/dist/{lib → src/lib}/archive.js +27 -5
  48. package/dist/src/lib/archive.js.map +1 -0
  49. package/dist/src/lib/config-updater.d.ts +10 -0
  50. package/dist/src/lib/config-updater.d.ts.map +1 -0
  51. package/dist/src/lib/config-updater.js +34 -0
  52. package/dist/src/lib/config-updater.js.map +1 -0
  53. package/dist/src/lib/config.d.ts +53 -0
  54. package/dist/src/lib/config.d.ts.map +1 -0
  55. package/dist/src/lib/config.js +162 -0
  56. package/dist/src/lib/config.js.map +1 -0
  57. package/dist/src/lib/env-sync.d.ts +44 -0
  58. package/dist/src/lib/env-sync.d.ts.map +1 -0
  59. package/dist/src/lib/env-sync.js +207 -0
  60. package/dist/src/lib/env-sync.js.map +1 -0
  61. package/dist/src/lib/logger.d.ts.map +1 -0
  62. package/dist/src/lib/logger.js.map +1 -0
  63. package/dist/src/lib/nx-generator.d.ts +22 -0
  64. package/dist/src/lib/nx-generator.d.ts.map +1 -0
  65. package/dist/src/lib/nx-generator.js +345 -0
  66. package/dist/src/lib/nx-generator.js.map +1 -0
  67. package/dist/src/lib/standalone.d.ts +28 -0
  68. package/dist/src/lib/standalone.d.ts.map +1 -0
  69. package/dist/src/lib/standalone.js +107 -0
  70. package/dist/src/lib/standalone.js.map +1 -0
  71. package/dist/{types → src/types}/index.d.ts +10 -0
  72. package/dist/src/types/index.d.ts.map +1 -0
  73. package/dist/src/types/index.js.map +1 -0
  74. package/dist/src/utils/spinner.d.ts +16 -0
  75. package/dist/src/utils/spinner.d.ts.map +1 -0
  76. package/dist/src/utils/spinner.js +88 -0
  77. package/dist/src/utils/spinner.js.map +1 -0
  78. package/dist/src/utils/validation.d.ts.map +1 -0
  79. package/dist/{utils → src/utils}/validation.js +18 -2
  80. package/dist/src/utils/validation.js.map +1 -0
  81. package/dist/templates/application-additions/.forgecartignore +1 -1
  82. package/dist/templates/application-additions/Procfile +1 -1
  83. package/dist/templates/application-additions/src/app/app.module.ts +16 -0
  84. package/dist/templates/application-additions/src/services/forgecart.service.ts +62 -0
  85. package/dist/templates/application-additions/src/services/index.ts +2 -0
  86. package/dist/templates/application-additions/src/services/product-event-listener.service.ts +150 -0
  87. package/dist/templates/application-e2e-additions/src/support/global-setup.ts +16 -0
  88. package/dist/templates/application-e2e-additions/src/support/test-setup.ts +9 -0
  89. package/dist/templates/storefront-additions/.forgecartignore +30 -6
  90. package/dist/templates/storefront-additions/Procfile +1 -1
  91. package/dist/templates/storefront-additions/package.json +11 -0
  92. package/dist/templates/storefront-additions/postcss.config.js +5 -0
  93. package/dist/templates/storefront-additions/src/app/cart/page.tsx +77 -0
  94. package/dist/templates/storefront-additions/src/app/global.css +1 -0
  95. package/dist/templates/storefront-additions/src/app/layout.tsx +25 -0
  96. package/dist/templates/storefront-additions/src/app/page.tsx +43 -0
  97. package/dist/templates/storefront-additions/src/components/AddToCartButton.tsx +29 -0
  98. package/dist/templates/storefront-additions/src/components/CartItem.tsx +82 -0
  99. package/dist/templates/storefront-additions/src/components/Header.tsx +42 -0
  100. package/dist/templates/storefront-additions/src/components/ProductCard.tsx +57 -0
  101. package/dist/templates/storefront-additions/src/components/QuantitySelector.tsx +35 -0
  102. package/dist/templates/storefront-additions/src/context/CartContext.tsx +158 -0
  103. package/dist/templates/storefront-additions/src/lib/forgecart.ts +19 -8
  104. package/dist/templates/storefront-additions/tailwind.config.js +8 -0
  105. package/dist/templates/storefront-e2e-additions/playwright.config.ts +26 -0
  106. package/dist/templates/storefront-e2e-additions/src/example.spec.ts +11 -0
  107. package/dist/templates/workspace/.nxignore +2 -0
  108. package/package.json +6 -28
  109. package/templates/application-additions/.forgecartignore +1 -1
  110. package/templates/application-additions/Procfile +1 -1
  111. package/templates/application-additions/src/app/app.module.ts +16 -0
  112. package/templates/application-additions/src/services/forgecart.service.ts +62 -0
  113. package/templates/application-additions/src/services/index.ts +2 -0
  114. package/templates/application-additions/src/services/product-event-listener.service.ts +150 -0
  115. package/templates/application-e2e-additions/src/support/global-setup.ts +16 -0
  116. package/templates/application-e2e-additions/src/support/test-setup.ts +9 -0
  117. package/templates/storefront-additions/.forgecartignore +30 -6
  118. package/templates/storefront-additions/Procfile +1 -1
  119. package/templates/storefront-additions/package.json +11 -0
  120. package/templates/storefront-additions/postcss.config.js +5 -0
  121. package/templates/storefront-additions/src/app/cart/page.tsx +77 -0
  122. package/templates/storefront-additions/src/app/global.css +1 -0
  123. package/templates/storefront-additions/src/app/layout.tsx +25 -0
  124. package/templates/storefront-additions/src/app/page.tsx +43 -0
  125. package/templates/storefront-additions/src/components/AddToCartButton.tsx +29 -0
  126. package/templates/storefront-additions/src/components/CartItem.tsx +82 -0
  127. package/templates/storefront-additions/src/components/Header.tsx +42 -0
  128. package/templates/storefront-additions/src/components/ProductCard.tsx +57 -0
  129. package/templates/storefront-additions/src/components/QuantitySelector.tsx +35 -0
  130. package/templates/storefront-additions/src/context/CartContext.tsx +158 -0
  131. package/templates/storefront-additions/src/lib/forgecart.ts +19 -8
  132. package/templates/storefront-additions/tailwind.config.js +8 -0
  133. package/templates/storefront-e2e-additions/playwright.config.ts +26 -0
  134. package/templates/storefront-e2e-additions/src/example.spec.ts +11 -0
  135. package/templates/workspace/.nxignore +2 -0
  136. package/dist/cli.d.ts.map +0 -1
  137. package/dist/cli.js.map +0 -1
  138. package/dist/commands/delete.d.ts.map +0 -1
  139. package/dist/commands/delete.js.map +0 -1
  140. package/dist/commands/deploy.d.ts.map +0 -1
  141. package/dist/commands/deploy.js +0 -128
  142. package/dist/commands/deploy.js.map +0 -1
  143. package/dist/commands/env.d.ts.map +0 -1
  144. package/dist/commands/env.js.map +0 -1
  145. package/dist/commands/init.d.ts.map +0 -1
  146. package/dist/commands/init.js.map +0 -1
  147. package/dist/commands/list.d.ts.map +0 -1
  148. package/dist/commands/list.js.map +0 -1
  149. package/dist/commands/logs.d.ts.map +0 -1
  150. package/dist/commands/logs.js +0 -105
  151. package/dist/commands/logs.js.map +0 -1
  152. package/dist/commands/scale.d.ts.map +0 -1
  153. package/dist/commands/scale.js.map +0 -1
  154. package/dist/commands/status.d.ts.map +0 -1
  155. package/dist/commands/status.js.map +0 -1
  156. package/dist/commands/whoami.d.ts.map +0 -1
  157. package/dist/commands/whoami.js.map +0 -1
  158. package/dist/index.js.map +0 -1
  159. package/dist/lib/api-client.d.ts +0 -21
  160. package/dist/lib/api-client.d.ts.map +0 -1
  161. package/dist/lib/api-client.js +0 -220
  162. package/dist/lib/api-client.js.map +0 -1
  163. package/dist/lib/archive.d.ts.map +0 -1
  164. package/dist/lib/archive.js.map +0 -1
  165. package/dist/lib/config.d.ts +0 -12
  166. package/dist/lib/config.d.ts.map +0 -1
  167. package/dist/lib/config.js +0 -79
  168. package/dist/lib/config.js.map +0 -1
  169. package/dist/lib/logger.d.ts.map +0 -1
  170. package/dist/lib/logger.js.map +0 -1
  171. package/dist/lib/nx-generator.d.ts +0 -8
  172. package/dist/lib/nx-generator.d.ts.map +0 -1
  173. package/dist/lib/nx-generator.js +0 -146
  174. package/dist/lib/nx-generator.js.map +0 -1
  175. package/dist/templates/application-additions/src/services/price-fetcher.service.ts +0 -72
  176. package/dist/templates/storefront-additions/src/app/products/page.tsx +0 -78
  177. package/dist/types/index.d.ts.map +0 -1
  178. package/dist/types/index.js.map +0 -1
  179. package/dist/utils/spinner.d.ts +0 -4
  180. package/dist/utils/spinner.d.ts.map +0 -1
  181. package/dist/utils/spinner.js +0 -20
  182. package/dist/utils/spinner.js.map +0 -1
  183. package/dist/utils/validation.d.ts.map +0 -1
  184. package/dist/utils/validation.js.map +0 -1
  185. package/templates/application-additions/src/services/price-fetcher.service.ts +0 -72
  186. package/templates/storefront-additions/src/app/products/page.tsx +0 -78
  187. /package/dist/{cli.d.ts → src/cli.d.ts} +0 -0
  188. /package/dist/{commands → src/commands}/delete.d.ts +0 -0
  189. /package/dist/{commands → src/commands}/deploy.d.ts +0 -0
  190. /package/dist/{commands → src/commands}/env.d.ts +0 -0
  191. /package/dist/{commands → src/commands}/init.d.ts +0 -0
  192. /package/dist/{commands → src/commands}/list.d.ts +0 -0
  193. /package/dist/{commands → src/commands}/logs.d.ts +0 -0
  194. /package/dist/{commands → src/commands}/scale.d.ts +0 -0
  195. /package/dist/{commands → src/commands}/status.d.ts +0 -0
  196. /package/dist/{commands → src/commands}/whoami.d.ts +0 -0
  197. /package/dist/{index.d.ts → src/index.d.ts} +0 -0
  198. /package/dist/{index.js → src/index.js} +0 -0
  199. /package/dist/{lib → src/lib}/logger.d.ts +0 -0
  200. /package/dist/{lib → src/lib}/logger.js +0 -0
  201. /package/dist/{types → src/types}/index.js +0 -0
  202. /package/dist/{utils → src/utils}/validation.d.ts +0 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2022 Vendure
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 CHANGED
@@ -1,6 +1,6 @@
1
1
  # @forgecart/cli
2
2
 
3
- CLI tool for deploying applications to ForgéCart's PaaS platform.
3
+ CLI tool for deploying applications to ForgeCart's PaaS platform.
4
4
 
5
5
  ## Installation
6
6
 
@@ -25,12 +25,12 @@ npm install -g @forgecart/cli
25
25
 
26
26
  ### `forgecart init [name]`
27
27
 
28
- Create a new ForgéCart project.
28
+ Create a new ForgeCart project.
29
29
 
30
30
  Options:
31
- - `-t, --token <token>` - ForgéCart channel token
31
+ - `-t, --token <token>` - ForgeCart channel token
32
32
  - `-a, --application` - Include NestJS backend application
33
- - `--api-url <url>` - ForgéCart API URL (default: https://api.forgecart.com)
33
+ - `--api-url <url>` - ForgeCart API URL (default: https://api.forgecart.com)
34
34
 
35
35
  ### `forgecart init:application`
36
36
 
@@ -103,7 +103,7 @@ After running `forgecart init`, your project will have the following structure:
103
103
  ```
104
104
  my-store/
105
105
  ├── .forgecart/
106
- │ └── config.json # ForgéCart configuration
106
+ │ └── config.json # ForgeCart configuration
107
107
  ├── nx.json # NX workspace configuration
108
108
  ├── package.json # Root package.json
109
109
  ├── tsconfig.base.json # TypeScript configuration
@@ -164,7 +164,7 @@ forgecart env unset storefront MY_VAR
164
164
  3. The CLI will:
165
165
  - Build your application using NX
166
166
  - Create a deployment archive
167
- - Upload and deploy to ForgéCart
167
+ - Upload and deploy to ForgeCart
168
168
  - Wait for the deployment to be ready
169
169
  4. View your live application at the provided URL
170
170
 
@@ -172,7 +172,7 @@ forgecart env unset storefront MY_VAR
172
172
 
173
173
  - Node.js >= 18.0.0
174
174
  - npm or yarn
175
- - A ForgéCart account with a valid channel token
175
+ - A ForgeCart account with a valid channel token
176
176
 
177
177
  ## License
178
178
 
package/bin/forgecart.js CHANGED
@@ -1,3 +1,3 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- import('../dist/index.js');
3
+ import('../dist/src/index.js')
@@ -0,0 +1,50 @@
1
+ {
2
+ "name": "@forgecart/cli",
3
+ "version": "1.1.0",
4
+ "type": "module",
5
+ "description": "CLI tool for deploying applications to ForgeCart",
6
+ "main": "dist/index.js",
7
+ "bin": {
8
+ "forgecart": "./bin/forgecart.js"
9
+ },
10
+ "dependencies": {
11
+ "@forgecart/sdk": "workspace:*",
12
+ "@nestjs/common": "11.1.6",
13
+ "archiver": "7.0.1",
14
+ "axios": "1.12.2",
15
+ "chalk": "5.6.2",
16
+ "change-case-all": "2.1.0",
17
+ "cli-table3": "0.6.5",
18
+ "commander": "12.1.0",
19
+ "form-data": "4.0.4",
20
+ "graphql": "16.11.0",
21
+ "graphql-request": "6.1.0",
22
+ "inquirer": "9.3.8",
23
+ "open": "10.2.0",
24
+ "ora": "8.2.0",
25
+ "rxjs": "7.8.2",
26
+ "shiki": "3.20.0",
27
+ "ws": "8.18.3",
28
+ "@jest/globals": "30.1.2",
29
+ "tslib": "2.4.1"
30
+ },
31
+ "files": [
32
+ "dist",
33
+ "bin",
34
+ "templates"
35
+ ],
36
+ "engines": {
37
+ "node": ">=18.0.0"
38
+ },
39
+ "keywords": [
40
+ "forgecart",
41
+ "cli",
42
+ "deploy",
43
+ "paas",
44
+ "nodejs"
45
+ ],
46
+ "author": "ForgeCart",
47
+ "license": "MIT",
48
+ "types": "./src/index.d.ts",
49
+ "module": "./src/index.js"
50
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAgBnC,wBAAgB,aAAa,IAAI,OAAO,CAsBvC"}
@@ -1,20 +1,22 @@
1
1
  import { Command } from 'commander';
2
- import { createInitCommand, createInitApplicationCommand } from './commands/init.js';
3
- import { createDeployCommand } from './commands/deploy.js';
4
- import { createListCommand } from './commands/list.js';
5
- import { createStatusCommand } from './commands/status.js';
6
2
  import { createDeleteCommand } from './commands/delete.js';
7
- import { createScaleCommand } from './commands/scale.js';
3
+ import { createDeployCommand } from './commands/deploy.js';
8
4
  import { createEnvCommand } from './commands/env.js';
5
+ import { createInitApplicationCommand, createInitCommand, } from './commands/init.js';
6
+ import { createListCommand } from './commands/list.js';
7
+ import { createLoginCommand } from './commands/login.js';
9
8
  import { createLogsCommand } from './commands/logs.js';
9
+ import { createScaleCommand } from './commands/scale.js';
10
+ import { createStatusCommand } from './commands/status.js';
10
11
  import { createWhoamiCommand } from './commands/whoami.js';
11
12
  export function createProgram() {
12
13
  const program = new Command();
13
14
  program
14
15
  .name('forgecart')
15
- .description('CLI tool for deploying applications to ForgéCart')
16
+ .description('CLI tool for deploying applications to ForgeCart')
16
17
  .version('1.0.0');
17
18
  // Add commands
19
+ program.addCommand(createLoginCommand());
18
20
  program.addCommand(createInitCommand());
19
21
  program.addCommand(createInitApplicationCommand());
20
22
  program.addCommand(createDeployCommand());
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAEnC,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAA;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAA;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AACpD,OAAO,EACL,4BAA4B,EAC5B,iBAAiB,GAClB,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAA;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAA;AAE1D,MAAM,UAAU,aAAa;IAC3B,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAA;IAE7B,OAAO;SACJ,IAAI,CAAC,WAAW,CAAC;SACjB,WAAW,CAAC,kDAAkD,CAAC;SAC/D,OAAO,CAAC,OAAO,CAAC,CAAA;IAEnB,eAAe;IACf,OAAO,CAAC,UAAU,CAAC,kBAAkB,EAAE,CAAC,CAAA;IACxC,OAAO,CAAC,UAAU,CAAC,iBAAiB,EAAE,CAAC,CAAA;IACvC,OAAO,CAAC,UAAU,CAAC,4BAA4B,EAAE,CAAC,CAAA;IAClD,OAAO,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC,CAAA;IACzC,OAAO,CAAC,UAAU,CAAC,iBAAiB,EAAE,CAAC,CAAA;IACvC,OAAO,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC,CAAA;IACzC,OAAO,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC,CAAA;IACzC,OAAO,CAAC,UAAU,CAAC,kBAAkB,EAAE,CAAC,CAAA;IACxC,OAAO,CAAC,UAAU,CAAC,gBAAgB,EAAE,CAAC,CAAA;IACtC,OAAO,CAAC,UAAU,CAAC,iBAAiB,EAAE,CAAC,CAAA;IACvC,OAAO,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC,CAAA;IAEzC,OAAO,OAAO,CAAA;AAChB,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete.d.ts","sourceRoot":"","sources":["../../../src/commands/delete.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAQnC,wBAAgB,mBAAmB,IAAI,OAAO,CAU7C"}
@@ -1,7 +1,7 @@
1
1
  import { Command } from 'commander';
2
2
  import inquirer from 'inquirer';
3
3
  import logger from '../lib/logger.js';
4
- import { requireConfig } from '../lib/config.js';
4
+ import { requireConfig, requireAuth } from '../lib/config.js';
5
5
  import { ForgecartApiClient } from '../lib/api-client.js';
6
6
  import { DeploymentType } from '../types/index.js';
7
7
  import { withSpinner } from '../utils/spinner.js';
@@ -17,12 +17,15 @@ export function createDeleteCommand() {
17
17
  }
18
18
  async function deleteDeployment(type, options) {
19
19
  // Validate type
20
- if (type !== DeploymentType.STOREFRONT && type !== DeploymentType.APPLICATION) {
20
+ if (type !== DeploymentType.STOREFRONT &&
21
+ type !== DeploymentType.APPLICATION) {
21
22
  logger.error('Invalid deployment type. Use "storefront" or "application".');
22
23
  process.exit(1);
23
24
  }
25
+ // Check authentication first
26
+ const authToken = requireAuth();
24
27
  const config = requireConfig();
25
- const apiClient = new ForgecartApiClient(config.apiUrl, config.channelToken);
28
+ const apiClient = new ForgecartApiClient(config.apiUrl, config.channelToken, authToken);
26
29
  // Check if deployment exists
27
30
  const deployment = await apiClient.getDeployment(type);
28
31
  if (!deployment) {
@@ -41,6 +44,7 @@ async function deleteDeployment(type, options) {
41
44
  ]);
42
45
  if (!confirm) {
43
46
  logger.info('Deletion cancelled');
47
+ apiClient.dispose();
44
48
  return;
45
49
  }
46
50
  }
@@ -51,5 +55,6 @@ async function deleteDeployment(type, options) {
51
55
  throw new Error('Deletion failed');
52
56
  }
53
57
  });
58
+ apiClient.dispose();
54
59
  }
55
60
  //# sourceMappingURL=delete.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete.js","sourceRoot":"","sources":["../../../src/commands/delete.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,QAAQ,MAAM,UAAU,CAAA;AAC/B,OAAO,MAAM,MAAM,kBAAkB,CAAA;AACrC,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAEjD,MAAM,UAAU,mBAAmB;IACjC,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC;SAC9B,WAAW,CAAC,qBAAqB,CAAC;SAClC,QAAQ,CAAC,QAAQ,EAAE,6CAA6C,CAAC;SACjE,MAAM,CAAC,aAAa,EAAE,0BAA0B,CAAC;SACjD,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,OAA4B,EAAE,EAAE;QAC3D,MAAM,gBAAgB,CAAC,IAAsB,EAAE,OAAO,CAAC,CAAA;IACzD,CAAC,CAAC,CAAA;IAEJ,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,KAAK,UAAU,gBAAgB,CAC7B,IAAoB,EACpB,OAA4B;IAE5B,gBAAgB;IAChB,IACE,IAAI,KAAK,cAAc,CAAC,UAAU;QAClC,IAAI,KAAK,cAAc,CAAC,WAAW,EACnC,CAAC;QACD,MAAM,CAAC,KAAK,CAAC,6DAA6D,CAAC,CAAA;QAC3E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,6BAA6B;IAC7B,MAAM,SAAS,GAAG,WAAW,EAAE,CAAA;IAE/B,MAAM,MAAM,GAAG,aAAa,EAAE,CAAA;IAC9B,MAAM,SAAS,GAAG,IAAI,kBAAkB,CACtC,MAAM,CAAC,MAAM,EACb,MAAM,CAAC,YAAY,EACnB,SAAS,CACV,CAAA;IAED,6BAA6B;IAC7B,MAAM,UAAU,GAAG,MAAM,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC,CAAA;IACtD,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,CAAC,KAAK,CAAC,MAAM,IAAI,mBAAmB,CAAC,CAAA;QAC3C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,mBAAmB;IACnB,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACnB,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;YACxC;gBACE,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE,SAAS;gBACf,OAAO,EAAE,uCAAuC,IAAI,4CAA4C;gBAChG,OAAO,EAAE,KAAK;aACf;SACF,CAAC,CAAA;QAEF,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAA;YACjC,SAAS,CAAC,OAAO,EAAE,CAAA;YACnB,OAAM;QACR,CAAC;IACH,CAAC;IAED,oBAAoB;IACpB,MAAM,WAAW,CACf,YAAY,IAAI,gBAAgB,EAChC,GAAG,IAAI,qBAAqB,EAC5B,oBAAoB,IAAI,aAAa,EACrC,KAAK,IAAI,EAAE;QACT,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAA;QACtD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAA;QACpC,CAAC;IACH,CAAC,CACF,CAAA;IAED,SAAS,CAAC,OAAO,EAAE,CAAA;AACrB,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../../src/commands/deploy.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAoBnC,wBAAgB,mBAAmB,IAAI,OAAO,CAS7C"}
@@ -0,0 +1,243 @@
1
+ import * as path from 'path';
2
+ import * as fs from 'fs';
3
+ import { Command } from 'commander';
4
+ import logger from '../lib/logger.js';
5
+ import { requireConfig, getProjectRoot, requireAuth } from '../lib/config.js';
6
+ import { ForgecartApiClient } from '../lib/api-client.js';
7
+ import { createArchive, getIgnoreFileForType } from '../lib/archive.js';
8
+ import { runNxBuild, runNxBuildMany } from '../lib/nx-generator.js';
9
+ import { prepareStandaloneDeployment, prepareApplicationDeployment, } from '../lib/standalone.js';
10
+ import { getCurrentAppDir } from '../utils/validation.js';
11
+ import { withSpinner, withSpinnerAndLogs } from '../utils/spinner.js';
12
+ import { DeploymentType } from '../types/index.js';
13
+ import { parseEnvFile } from '../lib/env-sync.js';
14
+ export function createDeployCommand() {
15
+ const cmd = new Command('deploy')
16
+ .description('Deploy the current application')
17
+ .option('--skip-build', 'Skip the build step')
18
+ .action(async (options) => {
19
+ await deploy(options);
20
+ });
21
+ return cmd;
22
+ }
23
+ /**
24
+ * Gets all deployable applications based on config.
25
+ */
26
+ function getDeployableApps(projectRoot, config) {
27
+ const apps = [];
28
+ // Storefront is always deployable if path is configured
29
+ const storefrontPath = path.join(projectRoot, config.storefrontPath || 'apps/storefront');
30
+ apps.push({ type: DeploymentType.STOREFRONT, appDir: storefrontPath });
31
+ // Application is deployable if hasApplication is true in config
32
+ if (config.hasApplication) {
33
+ const applicationPath = path.join(projectRoot, config.applicationPath || 'apps/application');
34
+ apps.push({ type: DeploymentType.APPLICATION, appDir: applicationPath });
35
+ }
36
+ return apps;
37
+ }
38
+ /**
39
+ * Deploys a single application.
40
+ */
41
+ async function deploySingleApp(apiClient, deployType, appDir, projectRoot, skipBuild) {
42
+ const prefix = `[${deployType}]`;
43
+ // Read env vars from .env file (used for both create and deploy)
44
+ const envFilePath = path.join(appDir, '.env');
45
+ let envVars;
46
+ let envVarsMap;
47
+ if (fs.existsSync(envFilePath)) {
48
+ const parsed = parseEnvFile(envFilePath);
49
+ if (parsed.length > 0) {
50
+ envVars = parsed;
51
+ envVarsMap = Object.fromEntries(parsed.map((v) => [v.key, v.value]));
52
+ logger.info(`${prefix} Found ${parsed.length} env vars in .env`);
53
+ }
54
+ }
55
+ // Check/create deployment (with env vars for first deploy)
56
+ let deployment = await withSpinner(`${prefix} Checking deployment status...`, `${prefix} Deployment ready`, `${prefix} Failed to check deployment`, async () => {
57
+ let dep = await apiClient.getDeployment(deployType);
58
+ if (!dep) {
59
+ logger.info(`${prefix} Creating new deployment...`);
60
+ dep = await apiClient.createDeployment(deployType, envVars);
61
+ }
62
+ return dep;
63
+ });
64
+ // Clean up old .deploy directory if exists (legacy cleanup)
65
+ const oldDeployDir = path.join(appDir, '.deploy');
66
+ if (fs.existsSync(oldDeployDir)) {
67
+ fs.rmSync(oldDeployDir, { recursive: true });
68
+ }
69
+ // Build the app
70
+ if (!skipBuild) {
71
+ await withSpinner(`${prefix} Building...`, `${prefix} Build completed`, `${prefix} Build failed`, async () => {
72
+ const success = await runNxBuild(deployType, projectRoot);
73
+ if (!success) {
74
+ throw new Error('Build failed');
75
+ }
76
+ });
77
+ }
78
+ else {
79
+ logger.info(`${prefix} Skipping build step`);
80
+ }
81
+ // Prepare deployment based on type
82
+ let archiveSourceDir = appDir;
83
+ let includeEnvFile = false;
84
+ if (deployType === DeploymentType.STOREFRONT) {
85
+ await withSpinner(`${prefix} Preparing standalone deployment...`, `${prefix} Standalone prepared`, `${prefix} Failed to prepare standalone`, async () => {
86
+ await prepareStandaloneDeployment(appDir);
87
+ });
88
+ }
89
+ else if (deployType === DeploymentType.APPLICATION) {
90
+ archiveSourceDir = await withSpinner(`${prefix} Preparing application deployment...`, `${prefix} Application prepared`, `${prefix} Failed to prepare application`, async () => {
91
+ return prepareApplicationDeployment(appDir, projectRoot);
92
+ });
93
+ // Do not include .env file in archive - use CLI env sync instead
94
+ includeEnvFile = false;
95
+ }
96
+ // Create archive
97
+ const zipBuffer = await withSpinner(`${prefix} Creating deployment archive...`, `${prefix} Archive created`, `${prefix} Failed to create archive`, async () => {
98
+ const ignoreFile = getIgnoreFileForType();
99
+ return createArchive({
100
+ sourceDir: archiveSourceDir,
101
+ ignoreFile,
102
+ includeEnvFile,
103
+ });
104
+ });
105
+ logger.info(`${prefix} Archive size: ${(zipBuffer.length / 1024 / 1024).toFixed(2)} MB`);
106
+ // Upload and deploy (with env vars for subsequent deploys)
107
+ deployment = await withSpinner(`${prefix} Uploading and deploying...`, `${prefix} Deployment successful`, `${prefix} Deployment failed`, async () => {
108
+ return apiClient.uploadAndDeploy(deployType, zipBuffer, envVarsMap);
109
+ });
110
+ // Subscribe to deployment logs (backend auto-detects staging vs runtime)
111
+ const logSubscription = apiClient.subscribeToDeploymentLogs(deployType);
112
+ // Wait for deployment to be ready with log streaming
113
+ await withSpinnerAndLogs(`${prefix} Waiting for deployment to be ready...`, `${prefix} Deployment is live`, `${prefix} Deployment check failed`, async () => {
114
+ let attempts = 0;
115
+ const maxAttempts = 60; // 5 minutes max
116
+ while (attempts < maxAttempts) {
117
+ const status = await apiClient.refreshDeploymentStatus(deployType);
118
+ if (status?.status === 'RUNNING') {
119
+ deployment = status;
120
+ return;
121
+ }
122
+ if (status?.status === 'ERROR') {
123
+ throw new Error(status.errorMessage || 'Deployment failed');
124
+ }
125
+ await new Promise((resolve) => setTimeout(resolve, 5000));
126
+ attempts++;
127
+ }
128
+ throw new Error('Deployment timed out');
129
+ }, logSubscription);
130
+ return deployment;
131
+ }
132
+ async function deploy(options) {
133
+ logger.title('ForgeCart Deployment');
134
+ // Check authentication first
135
+ const authToken = requireAuth();
136
+ // Get config and validate
137
+ const config = requireConfig();
138
+ const projectRoot = getProjectRoot();
139
+ // Initialize API client
140
+ const apiClient = new ForgecartApiClient(config.apiUrl, config.channelToken, authToken);
141
+ // Validate token
142
+ await withSpinner('Validating channel token...', 'Channel token validated', 'Invalid channel token', async () => {
143
+ const isValid = await apiClient.validateChannelToken();
144
+ if (!isValid) {
145
+ throw new Error('Invalid channel token');
146
+ }
147
+ });
148
+ // Check if we're in a specific app directory
149
+ const currentApp = getCurrentAppDir(projectRoot);
150
+ if (currentApp) {
151
+ // Deploy single app from its directory
152
+ const appDir = path.join(projectRoot, `apps/${currentApp.type}`);
153
+ logger.info(`Detected ${currentApp.type} application`);
154
+ const deployment = await deploySingleApp(apiClient, currentApp.type, appDir, projectRoot, options.skipBuild ?? false);
155
+ // Success message
156
+ logger.newline();
157
+ logger.box(`Deployment successful!
158
+
159
+ Type: ${deployment.type}
160
+ Status: ${deployment.status}
161
+ URL: ${deployment.url}
162
+
163
+ View logs with:
164
+ forgecart logs ${deployment.type}`);
165
+ apiClient.dispose();
166
+ return;
167
+ }
168
+ // In project root - find all deployable apps
169
+ const apps = getDeployableApps(projectRoot, config);
170
+ if (apps.length === 0) {
171
+ logger.error('No deployable applications found. Please run from apps/storefront or apps/application directory.');
172
+ process.exit(1);
173
+ }
174
+ if (apps.length === 1) {
175
+ // Single app found - deploy it
176
+ const app = apps[0];
177
+ logger.info(`Deploying ${app.type}`);
178
+ const deployment = await deploySingleApp(apiClient, app.type, app.appDir, projectRoot, options.skipBuild ?? false);
179
+ // Success message
180
+ logger.newline();
181
+ logger.box(`Deployment successful!
182
+
183
+ Type: ${deployment.type}
184
+ Status: ${deployment.status}
185
+ URL: ${deployment.url}
186
+
187
+ View logs with:
188
+ forgecart logs ${deployment.type}`);
189
+ }
190
+ else {
191
+ // Multiple apps found
192
+ logger.info(`Found ${apps.length} applications to deploy: ${apps.map((a) => a.type).join(', ')}`);
193
+ logger.newline();
194
+ // Clean up ALL staging directories before any builds start
195
+ for (const app of apps) {
196
+ const oldDeployDir = path.join(app.appDir, '.deploy');
197
+ if (fs.existsSync(oldDeployDir)) {
198
+ fs.rmSync(oldDeployDir, { recursive: true });
199
+ }
200
+ }
201
+ // Only delete the staging subdirectory, not the entire .forgecart (which contains config.json)
202
+ const stagingDir = path.join(projectRoot, '.forgecart', 'application-deploy');
203
+ if (fs.existsSync(stagingDir)) {
204
+ fs.rmSync(stagingDir, { recursive: true });
205
+ }
206
+ // Build all apps at once using nx run-many
207
+ if (!options.skipBuild) {
208
+ await withSpinner('Building all applications...', 'All builds completed', 'Build failed', async () => {
209
+ const success = await runNxBuildMany(apps.map((a) => a.type), projectRoot);
210
+ if (!success) {
211
+ throw new Error('Build failed');
212
+ }
213
+ });
214
+ }
215
+ // Deploy apps SEQUENTIALLY (application first, then storefront)
216
+ const orderedApps = [...apps].sort((a) => a.type === DeploymentType.APPLICATION ? -1 : 1);
217
+ const results = [];
218
+ for (const app of orderedApps) {
219
+ logger.info(`Deploying ${app.type}...`);
220
+ const deployment = await deploySingleApp(apiClient, app.type, app.appDir, projectRoot, true // skipBuild - already built above
221
+ );
222
+ results.push(deployment);
223
+ logger.newline();
224
+ }
225
+ // Success message for all deployments
226
+ logger.newline();
227
+ const summaryLines = results
228
+ .map((dep) => `${dep.type}:
229
+ Status: ${dep.status}
230
+ URL: ${dep.url}`)
231
+ .join('\n\n');
232
+ logger.box(`All deployments successful!
233
+
234
+ ${summaryLines}
235
+
236
+ View logs with:
237
+ forgecart logs storefront
238
+ forgecart logs application`);
239
+ }
240
+ // Dispose API client to close any open connections
241
+ apiClient.dispose();
242
+ }
243
+ //# sourceMappingURL=deploy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../../src/commands/deploy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../../src/commands/env.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAanC,wBAAgB,gBAAgB,IAAI,OAAO,CAkC1C"}
@@ -1,13 +1,13 @@
1
1
  import { Command } from 'commander';
2
2
  import Table from 'cli-table3';
3
3
  import logger from '../lib/logger.js';
4
- import { requireConfig } from '../lib/config.js';
4
+ import { requireConfig, requireAuth } from '../lib/config.js';
5
5
  import { ForgecartApiClient } from '../lib/api-client.js';
6
6
  import { DeploymentType } from '../types/index.js';
7
7
  import { withSpinner } from '../utils/spinner.js';
8
+ import { syncEnvToDeployment, syncAllEnvToDeployments, getEnvFilePath, } from '../lib/env-sync.js';
8
9
  export function createEnvCommand() {
9
- const cmd = new Command('env')
10
- .description('Manage environment variables');
10
+ const cmd = new Command('env').description('Manage environment variables');
11
11
  cmd
12
12
  .command('get <type>')
13
13
  .description('Get environment variables for a deployment')
@@ -26,21 +26,29 @@ export function createEnvCommand() {
26
26
  .action(async (type, key) => {
27
27
  await unsetEnv(type, key);
28
28
  });
29
+ cmd
30
+ .command('push [type]')
31
+ .description('Push environment variables from .env file to deployment. If no type specified, pushes for all apps.')
32
+ .action(async (type) => {
33
+ await pushEnv(type);
34
+ });
29
35
  return cmd;
30
36
  }
31
37
  async function getEnv(type) {
32
38
  // Validate type
33
- if (type !== DeploymentType.STOREFRONT && type !== DeploymentType.APPLICATION) {
39
+ if (type !== DeploymentType.STOREFRONT &&
40
+ type !== DeploymentType.APPLICATION) {
34
41
  logger.error('Invalid deployment type. Use "storefront" or "application".');
35
42
  process.exit(1);
36
43
  }
37
44
  const config = requireConfig();
38
- const apiClient = new ForgecartApiClient(config.apiUrl, config.channelToken);
45
+ const apiClient = new ForgecartApiClient(config.apiUrl, config.channelToken, requireAuth());
39
46
  const env = await withSpinner(`Fetching environment variables for ${type}...`, 'Environment variables retrieved', 'Failed to fetch environment variables', async () => {
40
47
  return apiClient.getDeploymentEnv(type);
41
48
  });
42
49
  if (env.length === 0) {
43
50
  logger.info(`No environment variables set for ${type}`);
51
+ apiClient.dispose();
44
52
  return;
45
53
  }
46
54
  const table = new Table({
@@ -59,10 +67,12 @@ async function getEnv(type) {
59
67
  table.push([item.key, displayValue]);
60
68
  }
61
69
  console.log(table.toString());
70
+ apiClient.dispose();
62
71
  }
63
72
  async function setEnv(type, key, value) {
64
73
  // Validate type
65
- if (type !== DeploymentType.STOREFRONT && type !== DeploymentType.APPLICATION) {
74
+ if (type !== DeploymentType.STOREFRONT &&
75
+ type !== DeploymentType.APPLICATION) {
66
76
  logger.error('Invalid deployment type. Use "storefront" or "application".');
67
77
  process.exit(1);
68
78
  }
@@ -72,29 +82,77 @@ async function setEnv(type, key, value) {
72
82
  process.exit(1);
73
83
  }
74
84
  const config = requireConfig();
75
- const apiClient = new ForgecartApiClient(config.apiUrl, config.channelToken);
85
+ const apiClient = new ForgecartApiClient(config.apiUrl, config.channelToken, requireAuth());
76
86
  await withSpinner(`Setting ${key} for ${type}...`, `${key} set successfully`, `Failed to set ${key}`, async () => {
77
- const success = await apiClient.setDeploymentEnv(type, key, value);
87
+ // Use bulk API with single variable
88
+ const success = await apiClient.setDeploymentEnv(type, [{ key, value }]);
78
89
  if (!success) {
79
90
  throw new Error('Failed to set environment variable');
80
91
  }
81
92
  });
82
- logger.info('Note: The deployment may need to be restarted for changes to take effect.');
93
+ logger.info('Note: The deployment will be restarted automatically for changes to take effect.');
94
+ apiClient.dispose();
83
95
  }
84
96
  async function unsetEnv(type, key) {
85
97
  // Validate type
86
- if (type !== DeploymentType.STOREFRONT && type !== DeploymentType.APPLICATION) {
98
+ if (type !== DeploymentType.STOREFRONT &&
99
+ type !== DeploymentType.APPLICATION) {
87
100
  logger.error('Invalid deployment type. Use "storefront" or "application".');
88
101
  process.exit(1);
89
102
  }
90
103
  const config = requireConfig();
91
- const apiClient = new ForgecartApiClient(config.apiUrl, config.channelToken);
104
+ const apiClient = new ForgecartApiClient(config.apiUrl, config.channelToken, requireAuth());
92
105
  await withSpinner(`Removing ${key} from ${type}...`, `${key} removed successfully`, `Failed to remove ${key}`, async () => {
93
- const success = await apiClient.unsetDeploymentEnv(type, key);
106
+ // Use bulk API with single key
107
+ const success = await apiClient.unsetDeploymentEnv(type, [key]);
94
108
  if (!success) {
95
109
  throw new Error('Failed to remove environment variable');
96
110
  }
97
111
  });
98
112
  logger.info('Note: The deployment may need to be restarted for changes to take effect.');
113
+ apiClient.dispose();
114
+ }
115
+ async function pushEnv(type) {
116
+ // Validate type if provided
117
+ if (type &&
118
+ type !== DeploymentType.STOREFRONT &&
119
+ type !== DeploymentType.APPLICATION) {
120
+ logger.error('Invalid deployment type. Use "storefront" or "application".');
121
+ process.exit(1);
122
+ }
123
+ const config = requireConfig();
124
+ const apiClient = new ForgecartApiClient(config.apiUrl, config.channelToken, requireAuth());
125
+ if (type) {
126
+ // Push for specific type
127
+ const envFilePath = getEnvFilePath(type);
128
+ if (!envFilePath) {
129
+ logger.error(`Could not find .env file path for ${type}`);
130
+ process.exit(1);
131
+ }
132
+ logger.info(`Pushing environment variables from ${envFilePath}`);
133
+ const result = await withSpinner(`Syncing environment variables for ${type}...`, `Environment variables synced`, `Failed to sync environment variables`, async () => {
134
+ return syncEnvToDeployment(apiClient, type);
135
+ });
136
+ logger.info(`Synced ${result.synced} variable(s)${result.removed > 0 ? `, removed ${result.removed}` : ''}`);
137
+ }
138
+ else {
139
+ // Push for all types
140
+ logger.info('Pushing environment variables for all deployments');
141
+ const results = await withSpinner('Syncing environment variables...', 'Environment variables synced', 'Failed to sync environment variables', async () => {
142
+ return syncAllEnvToDeployments(apiClient);
143
+ });
144
+ if (results.storefront.synced > 0 || results.storefront.removed > 0) {
145
+ logger.info(`Storefront: ${results.storefront.synced} synced${results.storefront.removed > 0 ? `, ${results.storefront.removed} removed` : ''}`);
146
+ }
147
+ if (results.application.synced > 0 || results.application.removed > 0) {
148
+ logger.info(`Application: ${results.application.synced} synced${results.application.removed > 0 ? `, ${results.application.removed} removed` : ''}`);
149
+ }
150
+ const totalSynced = results.storefront.synced + results.application.synced;
151
+ if (totalSynced === 0) {
152
+ logger.info('No .env files found or no variables to sync');
153
+ }
154
+ }
155
+ logger.info('Note: The deployment may need to be restarted for changes to take effect.');
156
+ apiClient.dispose();
99
157
  }
100
158
  //# sourceMappingURL=env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../../../src/commands/env.ts"],"names":[],"mappings":"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"}