@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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/lib/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import { ForgecartApiClient } from './api-client.js';
2
+ import { DeploymentType } from '../types/index.js';
3
+ export { DeploymentType };
4
+ interface EnvVar {
5
+ key: string;
6
+ value: string;
7
+ }
8
+ /**
9
+ * Parse a .env file and return key-value pairs
10
+ */
11
+ export declare function parseEnvFile(filePath: string): EnvVar[];
12
+ /**
13
+ * Get the .env file path for a deployment type
14
+ */
15
+ export declare function getEnvFilePath(type: DeploymentType): string | null;
16
+ /**
17
+ * Sync environment variables from a .env file to the deployment
18
+ * Shows diff and asks for confirmation before applying
19
+ */
20
+ export declare function syncEnvToDeployment(apiClient: ForgecartApiClient, type: DeploymentType, options?: {
21
+ skipConfirm?: boolean;
22
+ }): Promise<{
23
+ synced: number;
24
+ removed: number;
25
+ skipped: boolean;
26
+ }>;
27
+ /**
28
+ * Sync environment variables for all deployments
29
+ */
30
+ export declare function syncAllEnvToDeployments(apiClient: ForgecartApiClient, options?: {
31
+ skipConfirm?: boolean;
32
+ }): Promise<{
33
+ storefront: {
34
+ synced: number;
35
+ removed: number;
36
+ skipped: boolean;
37
+ };
38
+ application: {
39
+ synced: number;
40
+ removed: number;
41
+ skipped: boolean;
42
+ };
43
+ }>;
44
+ //# sourceMappingURL=env-sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-sync.d.ts","sourceRoot":"","sources":["../../../src/lib/env-sync.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AACpD,OAAO,EAAE,cAAc,EAAiB,MAAM,mBAAmB,CAAA;AAIjE,OAAO,EAAE,cAAc,EAAE,CAAA;AAEzB,UAAU,MAAM;IACd,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;CACd;AAQD;;GAEG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAkCvD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,cAAc,GAAG,MAAM,GAAG,IAAI,CAqBlE;AA+ED;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,SAAS,EAAE,kBAAkB,EAC7B,IAAI,EAAE,cAAc,EACpB,OAAO,GAAE;IAAE,WAAW,CAAC,EAAE,OAAO,CAAA;CAAO,GACtC,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CAqEhE;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAC3C,SAAS,EAAE,kBAAkB,EAC7B,OAAO,GAAE;IAAE,WAAW,CAAC,EAAE,OAAO,CAAA;CAAO,GACtC,OAAO,CAAC;IACT,UAAU,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAA;IACjE,WAAW,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAA;CACnE,CAAC,CAyBD"}
@@ -0,0 +1,207 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ import * as readline from 'readline';
4
+ import logger from './logger.js';
5
+ import { DeploymentType } from '../types/index.js';
6
+ import { readConfig, findProjectRoot } from './config.js';
7
+ // Re-export DeploymentType for convenience
8
+ export { DeploymentType };
9
+ /**
10
+ * Parse a .env file and return key-value pairs
11
+ */
12
+ export function parseEnvFile(filePath) {
13
+ if (!fs.existsSync(filePath)) {
14
+ return [];
15
+ }
16
+ const content = fs.readFileSync(filePath, 'utf-8');
17
+ const vars = [];
18
+ for (const line of content.split('\n')) {
19
+ // Skip empty lines and comments
20
+ const trimmed = line.trim();
21
+ if (!trimmed || trimmed.startsWith('#')) {
22
+ continue;
23
+ }
24
+ // Parse key=value
25
+ const match = trimmed.match(/^([A-Za-z_][A-Za-z0-9_]*)=(.*)$/);
26
+ if (match) {
27
+ const key = match[1];
28
+ let value = match[2];
29
+ // Remove surrounding quotes if present
30
+ if ((value.startsWith('"') && value.endsWith('"')) ||
31
+ (value.startsWith("'") && value.endsWith("'"))) {
32
+ value = value.slice(1, -1);
33
+ }
34
+ vars.push({ key, value });
35
+ }
36
+ }
37
+ return vars;
38
+ }
39
+ /**
40
+ * Get the .env file path for a deployment type
41
+ */
42
+ export function getEnvFilePath(type) {
43
+ const projectRoot = findProjectRoot();
44
+ if (!projectRoot) {
45
+ return null;
46
+ }
47
+ const config = readConfig();
48
+ if (!config) {
49
+ return null;
50
+ }
51
+ let appPath;
52
+ if (type === DeploymentType.STOREFRONT) {
53
+ appPath = config.storefrontPath || 'apps/storefront';
54
+ }
55
+ else if (type === DeploymentType.APPLICATION) {
56
+ appPath = config.applicationPath || 'apps/application';
57
+ }
58
+ else {
59
+ return null;
60
+ }
61
+ return path.join(projectRoot, appPath, '.env');
62
+ }
63
+ /**
64
+ * Calculate diff between local .env and remote deployment env
65
+ */
66
+ function calculateEnvDiff(localVars, remoteVars) {
67
+ const localMap = new Map(localVars.map((v) => [v.key, v.value]));
68
+ const remoteMap = new Map(remoteVars.map((v) => [v.key, v.value]));
69
+ const diff = { added: [], changed: [], removed: [] };
70
+ // Find added and changed
71
+ for (const [key, value] of localMap) {
72
+ const remoteValue = remoteMap.get(key);
73
+ if (remoteValue === undefined) {
74
+ diff.added.push({ key, value });
75
+ }
76
+ else if (remoteValue !== value) {
77
+ diff.changed.push({ key, oldValue: remoteValue, newValue: value });
78
+ }
79
+ }
80
+ // Find removed
81
+ for (const [key, value] of remoteMap) {
82
+ if (!localMap.has(key)) {
83
+ diff.removed.push({ key, value });
84
+ }
85
+ }
86
+ return diff;
87
+ }
88
+ /**
89
+ * Display diff to user
90
+ */
91
+ function displayEnvDiff(type, diff) {
92
+ console.log(`\nEnvironment variable changes for ${type}:\n`);
93
+ if (diff.added.length === 0 &&
94
+ diff.changed.length === 0 &&
95
+ diff.removed.length === 0) {
96
+ console.log(' No changes detected.\n');
97
+ return;
98
+ }
99
+ for (const { key, value } of diff.added) {
100
+ console.log(` + ${key}=${value}`);
101
+ }
102
+ for (const { key, oldValue, newValue } of diff.changed) {
103
+ console.log(` ~ ${key}=${newValue}`);
104
+ console.log(` (was: ${oldValue})`);
105
+ }
106
+ for (const { key } of diff.removed) {
107
+ console.log(` - ${key} (will be removed)`);
108
+ }
109
+ console.log();
110
+ }
111
+ /**
112
+ * Prompt user for confirmation
113
+ */
114
+ async function promptConfirm(message) {
115
+ const rl = readline.createInterface({
116
+ input: process.stdin,
117
+ output: process.stdout,
118
+ });
119
+ return new Promise((resolve) => {
120
+ rl.question(`${message} (y/n): `, (answer) => {
121
+ rl.close();
122
+ resolve(answer.toLowerCase() === 'y' || answer.toLowerCase() === 'yes');
123
+ });
124
+ });
125
+ }
126
+ /**
127
+ * Sync environment variables from a .env file to the deployment
128
+ * Shows diff and asks for confirmation before applying
129
+ */
130
+ export async function syncEnvToDeployment(apiClient, type, options = {}) {
131
+ // 1. Read local .env
132
+ const envFilePath = getEnvFilePath(type);
133
+ if (!envFilePath) {
134
+ logger.warn(`Could not find .env file path for ${type}`);
135
+ return { synced: 0, removed: 0, skipped: true };
136
+ }
137
+ if (!fs.existsSync(envFilePath)) {
138
+ logger.debug(`No .env file found at ${envFilePath}`);
139
+ return { synced: 0, removed: 0, skipped: true };
140
+ }
141
+ const localVars = parseEnvFile(envFilePath);
142
+ // 2. Fetch remote env vars
143
+ let remoteVars;
144
+ try {
145
+ remoteVars = await apiClient.getDeploymentEnv(type);
146
+ }
147
+ catch (error) {
148
+ logger.warn(`Could not fetch remote env vars: ${error}`);
149
+ remoteVars = [];
150
+ }
151
+ // 3. Calculate diff
152
+ const diff = calculateEnvDiff(localVars, remoteVars);
153
+ // 4. Display diff
154
+ displayEnvDiff(type, diff);
155
+ if (diff.added.length === 0 &&
156
+ diff.changed.length === 0 &&
157
+ diff.removed.length === 0) {
158
+ return { synced: 0, removed: 0, skipped: false };
159
+ }
160
+ // 5. Confirm (unless skipped)
161
+ if (!options.skipConfirm) {
162
+ const confirmed = await promptConfirm('Apply changes?');
163
+ if (!confirmed) {
164
+ console.log('Skipped.\n');
165
+ return { synced: 0, removed: 0, skipped: true };
166
+ }
167
+ }
168
+ // 6. Apply changes
169
+ const toSet = [
170
+ ...diff.added,
171
+ ...diff.changed.map((c) => ({ key: c.key, value: c.newValue })),
172
+ ];
173
+ const toRemove = diff.removed.map((r) => r.key);
174
+ try {
175
+ if (toSet.length > 0) {
176
+ await apiClient.setDeploymentEnv(type, toSet);
177
+ logger.debug(`Set ${toSet.length} environment variables`);
178
+ }
179
+ if (toRemove.length > 0) {
180
+ await apiClient.unsetDeploymentEnv(type, toRemove);
181
+ logger.debug(`Removed ${toRemove.length} environment variables`);
182
+ }
183
+ }
184
+ catch (error) {
185
+ logger.warn(`Error applying environment changes: ${error}`);
186
+ return { synced: 0, removed: 0, skipped: false };
187
+ }
188
+ return { synced: toSet.length, removed: toRemove.length, skipped: false };
189
+ }
190
+ /**
191
+ * Sync environment variables for all deployments
192
+ */
193
+ export async function syncAllEnvToDeployments(apiClient, options = {}) {
194
+ const config = readConfig();
195
+ const results = {
196
+ storefront: { synced: 0, removed: 0, skipped: false },
197
+ application: { synced: 0, removed: 0, skipped: false },
198
+ };
199
+ // Always sync storefront
200
+ results.storefront = await syncEnvToDeployment(apiClient, DeploymentType.STOREFRONT, options);
201
+ // Only sync application if it exists
202
+ if (config?.hasApplication) {
203
+ results.application = await syncEnvToDeployment(apiClient, DeploymentType.APPLICATION, options);
204
+ }
205
+ return results;
206
+ }
207
+ //# sourceMappingURL=env-sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-sync.js","sourceRoot":"","sources":["../../../src/lib/env-sync.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../../src/lib/logger.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,MAAM;oBACD,MAAM;uBAIH,MAAM;oBAIT,MAAM;qBAIL,MAAM;qBAIN,MAAM;mBAMR,MAAM;;qBAQJ,MAAM;kBAMT,MAAM,EAAE;oBAMN,MAAM,SAAS,MAAM;mBAItB,MAAM;CActB,CAAA;AAED,eAAe,MAAM,CAAA"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../../src/lib/logger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ export declare const DEFAULT_NX_VERSION = "21.2.0";
2
+ export declare function createNxWorkspace(projectName: string, targetDir: string, nxVersion?: string): Promise<boolean>;
3
+ export declare function generateNextApp(appName: string, projectRoot: string): Promise<boolean>;
4
+ export declare function generateNestApp(appName: string, projectRoot: string): Promise<boolean>;
5
+ export declare function installDependency(packageName: string, projectRoot: string, dev?: boolean): Promise<boolean>;
6
+ export declare function runNxBuild(appName: string, projectRoot: string): Promise<boolean>;
7
+ export declare function runNxBuildMany(appNames: string[], projectRoot: string): Promise<boolean>;
8
+ export declare function copyTemplateFiles(templateDir: string, targetDir: string, overwrite?: boolean): void;
9
+ export declare function addPackageScripts(projectRoot: string, withApplication: boolean): void;
10
+ export declare function getCliTemplatesDir(): string;
11
+ /**
12
+ * Create .env file with actual values from init config
13
+ */
14
+ export declare function createEnvFile(targetDir: string, type: 'storefront' | 'application', config: {
15
+ channelToken: string;
16
+ apiUrl: string;
17
+ }): void;
18
+ /**
19
+ * Append .env patterns to .gitignore if not already present
20
+ */
21
+ export declare function appendEnvPatternsToGitignore(projectRoot: string): void;
22
+ //# sourceMappingURL=nx-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nx-generator.d.ts","sourceRoot":"","sources":["../../../src/lib/nx-generator.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,kBAAkB,WAAW,CAAA;AAsE1C,wBAAsB,iBAAiB,CACrC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,SAAS,GAAE,MAA2B,GACrC,OAAO,CAAC,OAAO,CAAC,CA2DlB;AAED,wBAAsB,eAAe,CACnC,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,OAAO,CAAC,CAmDlB;AAED,wBAAsB,eAAe,CACnC,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,OAAO,CAAC,CA+ClB;AAED,wBAAsB,iBAAiB,CACrC,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,GAAG,UAAQ,GACV,OAAO,CAAC,OAAO,CAAC,CAgBlB;AAED,wBAAsB,UAAU,CAC9B,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,OAAO,CAAC,CAgBlB;AAED,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,EAAE,EAClB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,OAAO,CAAC,CAiBlB;AAED,wBAAgB,iBAAiB,CAC/B,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,SAAS,UAAO,GACf,IAAI,CAqBN;AAoBD,wBAAgB,iBAAiB,CAC/B,WAAW,EAAE,MAAM,EACnB,eAAe,EAAE,OAAO,GACvB,IAAI,CA+BN;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAwB3C;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,YAAY,GAAG,aAAa,EAClC,MAAM,EAAE;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC/C,IAAI,CA2BN;AAED;;GAEG;AACH,wBAAgB,4BAA4B,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAyBtE"}
@@ -0,0 +1,345 @@
1
+ import { spawn } from 'child_process';
2
+ import * as path from 'path';
3
+ import * as fs from 'fs';
4
+ import logger from './logger.js';
5
+ export const DEFAULT_NX_VERSION = '21.2.0';
6
+ async function runCommand(command, args, cwd, silent = false) {
7
+ return new Promise((resolve) => {
8
+ const child = spawn(command, args, {
9
+ cwd,
10
+ shell: true,
11
+ // Use 'ignore' for stdin to prevent waiting for input, inherit stdout/stderr
12
+ stdio: silent ? 'pipe' : ['ignore', 'inherit', 'inherit'],
13
+ env: {
14
+ ...process.env,
15
+ NX_DAEMON: 'false', // Disable Nx daemon to avoid cross-project issues
16
+ CI: 'true', // Tell Nx we're in CI mode to avoid interactive prompts
17
+ },
18
+ });
19
+ let output = '';
20
+ let error = '';
21
+ if (silent) {
22
+ child.stdout?.on('data', (data) => {
23
+ output += data.toString();
24
+ });
25
+ child.stderr?.on('data', (data) => {
26
+ error += data.toString();
27
+ });
28
+ }
29
+ child.on('close', (code) => {
30
+ resolve({
31
+ success: code === 0,
32
+ output,
33
+ error,
34
+ });
35
+ });
36
+ child.on('error', (err) => {
37
+ resolve({
38
+ success: false,
39
+ output,
40
+ error: err.message,
41
+ });
42
+ });
43
+ });
44
+ }
45
+ /**
46
+ * Get the NX version from the project's package.json
47
+ */
48
+ function getNxVersion(projectRoot) {
49
+ const packageJsonPath = path.join(projectRoot, 'package.json');
50
+ const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));
51
+ // nx version is in devDependencies
52
+ const nxVersion = packageJson.devDependencies?.nx || packageJson.dependencies?.nx;
53
+ // Remove ^ or ~ prefix if present
54
+ return nxVersion?.replace(/^[\^~]/, '') || 'latest';
55
+ }
56
+ export async function createNxWorkspace(projectName, targetDir, nxVersion = DEFAULT_NX_VERSION) {
57
+ logger.info(`Creating NX workspace: ${projectName} (NX v${nxVersion})`);
58
+ const result = await runCommand('npx', [
59
+ `create-nx-workspace@${nxVersion}`,
60
+ projectName,
61
+ '--preset=apps',
62
+ '--nxCloud=skip',
63
+ '--packageManager=npm',
64
+ ], targetDir);
65
+ if (!result.success) {
66
+ logger.error('Failed to create NX workspace');
67
+ return false;
68
+ }
69
+ // Create tsconfig.base.json if it doesn't exist (required by @nx/next generator)
70
+ const projectPath = path.join(targetDir, projectName);
71
+ const tsconfigPath = path.join(projectPath, 'tsconfig.base.json');
72
+ if (!fs.existsSync(tsconfigPath)) {
73
+ const tsconfigContent = {
74
+ compileOnSave: false,
75
+ compilerOptions: {
76
+ rootDir: '.',
77
+ sourceMap: true,
78
+ declaration: false,
79
+ moduleResolution: 'node',
80
+ emitDecoratorMetadata: true,
81
+ experimentalDecorators: true,
82
+ importHelpers: true,
83
+ target: 'es2015',
84
+ module: 'esnext',
85
+ lib: ['es2020', 'dom'],
86
+ skipLibCheck: true,
87
+ skipDefaultLibCheck: true,
88
+ baseUrl: '.',
89
+ paths: {},
90
+ },
91
+ exclude: ['node_modules', 'tmp'],
92
+ };
93
+ fs.writeFileSync(tsconfigPath, JSON.stringify(tsconfigContent, null, 2));
94
+ logger.info('Created tsconfig.base.json');
95
+ }
96
+ // Copy workspace-level templates (like .nxignore)
97
+ const templatesDir = getCliTemplatesDir();
98
+ const workspaceTemplatesDir = path.join(templatesDir, 'workspace');
99
+ if (fs.existsSync(workspaceTemplatesDir)) {
100
+ copyTemplateFiles(workspaceTemplatesDir, projectPath);
101
+ logger.debug('Copied workspace templates');
102
+ }
103
+ return true;
104
+ }
105
+ export async function generateNextApp(appName, projectRoot) {
106
+ // Get the NX version from the workspace package.json
107
+ const nxVersion = getNxVersion(projectRoot);
108
+ // Install all required @nx/* plugins at the SAME version to avoid conflicts
109
+ logger.info('Installing @nx plugins...');
110
+ const plugins = [
111
+ `@nx/next@${nxVersion}`,
112
+ `@nx/react@${nxVersion}`,
113
+ `@nx/jest@${nxVersion}`,
114
+ `@nx/playwright@${nxVersion}`,
115
+ `@nx/eslint@${nxVersion}`,
116
+ ];
117
+ const installResult = await runCommand('npm', ['install', '--save-dev', ...plugins], projectRoot);
118
+ if (!installResult.success) {
119
+ logger.error('Failed to install @nx plugins');
120
+ return false;
121
+ }
122
+ logger.info(`Generating Next.js application: ${appName}`);
123
+ const result = await runCommand('npx', [
124
+ 'nx',
125
+ 'g',
126
+ '@nx/next:application',
127
+ appName,
128
+ '--directory=apps/' + appName,
129
+ '--style=css',
130
+ '--appDir=true',
131
+ '--linter=eslint',
132
+ '--e2eTestRunner=playwright',
133
+ '--unitTestRunner=jest',
134
+ '--src=true',
135
+ ], projectRoot);
136
+ if (!result.success) {
137
+ logger.error('Failed to generate Next.js application');
138
+ return false;
139
+ }
140
+ return true;
141
+ }
142
+ export async function generateNestApp(appName, projectRoot) {
143
+ // Get the NX version from the workspace package.json
144
+ const nxVersion = getNxVersion(projectRoot);
145
+ // Install all required @nx/* plugins at the SAME version to avoid conflicts
146
+ logger.info('Installing @nx plugins...');
147
+ const plugins = [
148
+ `@nx/nest@${nxVersion}`,
149
+ `@nx/node@${nxVersion}`,
150
+ `@nx/jest@${nxVersion}`,
151
+ `@nx/eslint@${nxVersion}`,
152
+ ];
153
+ const installResult = await runCommand('npm', ['install', '--save-dev', ...plugins], projectRoot);
154
+ if (!installResult.success) {
155
+ logger.error('Failed to install @nx plugins');
156
+ return false;
157
+ }
158
+ logger.info(`Generating NestJS application: ${appName}`);
159
+ const result = await runCommand('npx', [
160
+ 'nx',
161
+ 'g',
162
+ '@nx/nest:application',
163
+ '--name=' + appName,
164
+ '--directory=apps/' + appName,
165
+ '--linter=eslint',
166
+ '--e2eTestRunner=jest',
167
+ '--unitTestRunner=jest',
168
+ ], projectRoot);
169
+ if (!result.success) {
170
+ logger.error('Failed to generate NestJS application');
171
+ return false;
172
+ }
173
+ return true;
174
+ }
175
+ export async function installDependency(packageName, projectRoot, dev = false) {
176
+ logger.info(`Installing ${packageName}`);
177
+ const args = ['install', packageName];
178
+ if (dev) {
179
+ args.push('--save-dev');
180
+ }
181
+ const result = await runCommand('npm', args, projectRoot);
182
+ if (!result.success) {
183
+ logger.error(`Failed to install ${packageName}`);
184
+ return false;
185
+ }
186
+ return true;
187
+ }
188
+ export async function runNxBuild(appName, projectRoot) {
189
+ logger.info(`Building ${appName}`);
190
+ // Use npm run to ensure correct project context
191
+ const result = await runCommand('npm', ['run', `build:${appName}`], projectRoot);
192
+ if (!result.success) {
193
+ logger.error(`Failed to build ${appName}`);
194
+ return false;
195
+ }
196
+ return true;
197
+ }
198
+ export async function runNxBuildMany(appNames, projectRoot) {
199
+ logger.info(`Building ${appNames.join(', ')}`);
200
+ // Use nx run-many to build multiple projects
201
+ const projects = appNames.join(',');
202
+ const result = await runCommand('npx', ['nx', 'run-many', '--target=build', `--projects=${projects}`], projectRoot);
203
+ if (!result.success) {
204
+ logger.error(`Failed to build projects`);
205
+ return false;
206
+ }
207
+ return true;
208
+ }
209
+ export function copyTemplateFiles(templateDir, targetDir, overwrite = true) {
210
+ if (!fs.existsSync(templateDir)) {
211
+ return;
212
+ }
213
+ const files = getAllFiles(templateDir);
214
+ for (const file of files) {
215
+ const relativePath = path.relative(templateDir, file);
216
+ const targetPath = path.join(targetDir, relativePath);
217
+ const targetDirPath = path.dirname(targetPath);
218
+ if (!fs.existsSync(targetDirPath)) {
219
+ fs.mkdirSync(targetDirPath, { recursive: true });
220
+ }
221
+ if (overwrite || !fs.existsSync(targetPath)) {
222
+ fs.copyFileSync(file, targetPath);
223
+ logger.debug(`Copied: ${relativePath}`);
224
+ }
225
+ }
226
+ }
227
+ function getAllFiles(dir) {
228
+ const files = [];
229
+ const items = fs.readdirSync(dir, { withFileTypes: true });
230
+ for (const item of items) {
231
+ const fullPath = path.join(dir, item.name);
232
+ if (item.isDirectory()) {
233
+ files.push(...getAllFiles(fullPath));
234
+ }
235
+ else {
236
+ files.push(fullPath);
237
+ }
238
+ }
239
+ return files;
240
+ }
241
+ export function addPackageScripts(projectRoot, withApplication) {
242
+ const packageJsonPath = path.join(projectRoot, 'package.json');
243
+ if (!fs.existsSync(packageJsonPath)) {
244
+ logger.warn('package.json not found, skipping scripts addition');
245
+ return;
246
+ }
247
+ const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));
248
+ packageJson.scripts = {
249
+ ...packageJson.scripts,
250
+ start: 'nx run storefront:dev',
251
+ dev: 'npm start',
252
+ 'dev:storefront': 'nx run storefront:dev',
253
+ build: 'nx run-many --target=build',
254
+ 'build:storefront': 'nx run storefront:build',
255
+ test: 'nx run-many --target=test',
256
+ lint: 'nx run-many --target=lint',
257
+ e2e: 'nx run storefront-e2e:e2e',
258
+ };
259
+ if (withApplication) {
260
+ packageJson.scripts['start:all'] =
261
+ 'npx nx run-many --targets=dev,serve --projects=storefront,application --parallel';
262
+ packageJson.scripts['dev:application'] = 'nx run application:serve';
263
+ packageJson.scripts['build:application'] = 'nx run application:build';
264
+ }
265
+ fs.writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2));
266
+ logger.info('Added convenience scripts to package.json');
267
+ }
268
+ export function getCliTemplatesDir() {
269
+ // When running from CLI package, templates can be in different locations:
270
+ // 1. Development: apps/cli/templates (relative to src/lib)
271
+ // 2. Installed: dist/templates (relative to dist/lib)
272
+ const currentFileUrl = new URL(import.meta.url);
273
+ const currentFilePath = currentFileUrl.pathname;
274
+ const libDir = path.dirname(currentFilePath);
275
+ // Try dist/templates first (installed package)
276
+ const distTemplatesPath = path.resolve(libDir, '..', 'templates');
277
+ if (fs.existsSync(distTemplatesPath)) {
278
+ return distTemplatesPath;
279
+ }
280
+ // Try apps/cli/templates (development)
281
+ const devTemplatesPath = path.resolve(libDir, '..', '..', 'templates');
282
+ if (fs.existsSync(devTemplatesPath)) {
283
+ return devTemplatesPath;
284
+ }
285
+ // Fallback - try to find templates directory
286
+ logger.warn('Templates directory not found, using fallback path');
287
+ return devTemplatesPath;
288
+ }
289
+ /**
290
+ * Create .env file with actual values from init config
291
+ */
292
+ export function createEnvFile(targetDir, type, config) {
293
+ const envPath = path.join(targetDir, '.env');
294
+ let content;
295
+ if (type === 'storefront') {
296
+ content = `# ForgeCart API Configuration
297
+ NEXT_PUBLIC_FORGECART_API_URL=${config.apiUrl}
298
+ NEXT_PUBLIC_FORGECART_CHANNEL_TOKEN=${config.channelToken}
299
+ `;
300
+ }
301
+ else {
302
+ content = `# Server Configuration
303
+ PORT=8080
304
+ NODE_ENV=development
305
+
306
+ # ForgeCart API Configuration
307
+ FORGECART_API_URL=${config.apiUrl}
308
+ FORGECART_CHANNEL_TOKEN=${config.channelToken}
309
+
310
+ # ForgeCart Admin Credentials (optional - for event listeners)
311
+ # If not set, product event listeners will be skipped
312
+ # FORGECART_ADMIN_USERNAME=your-admin-username
313
+ # FORGECART_ADMIN_PASSWORD=your-admin-password
314
+ `;
315
+ }
316
+ fs.writeFileSync(envPath, content);
317
+ logger.debug(`Created .env in ${targetDir}`);
318
+ }
319
+ /**
320
+ * Append .env patterns to .gitignore if not already present
321
+ */
322
+ export function appendEnvPatternsToGitignore(projectRoot) {
323
+ const gitignorePath = path.join(projectRoot, '.gitignore');
324
+ const envPatterns = `
325
+ # Environment files
326
+ .env
327
+ .env.local
328
+ .env.*.local
329
+ `;
330
+ if (fs.existsSync(gitignorePath)) {
331
+ const content = fs.readFileSync(gitignorePath, 'utf-8');
332
+ // Check if .env patterns are already present
333
+ if (!content.includes('# Environment files') &&
334
+ !content.includes('.env.local')) {
335
+ fs.appendFileSync(gitignorePath, envPatterns);
336
+ logger.debug('Added .env patterns to .gitignore');
337
+ }
338
+ }
339
+ else {
340
+ // Create .gitignore with env patterns
341
+ fs.writeFileSync(gitignorePath, envPatterns.trim() + '\n');
342
+ logger.debug('Created .gitignore with .env patterns');
343
+ }
344
+ }
345
+ //# sourceMappingURL=nx-generator.js.map