@forgecart/cli 1.0.0 → 1.0.1

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 (169) 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 +49 -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 +6 -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 +235 -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 +60 -9
  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 +51 -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 +4 -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 +6 -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 +4 -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 +18 -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/{lib → src/lib}/api-client.d.ts +11 -4
  42. package/dist/src/lib/api-client.d.ts.map +1 -0
  43. package/dist/src/lib/api-client.js +137 -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 +36 -0
  58. package/dist/src/lib/env-sync.d.ts.map +1 -0
  59. package/dist/src/lib/env-sync.js +118 -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 +20 -0
  64. package/dist/src/lib/nx-generator.d.ts.map +1 -0
  65. package/dist/src/lib/nx-generator.js +338 -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.map +1 -0
  75. package/dist/src/utils/spinner.js.map +1 -0
  76. package/dist/src/utils/validation.d.ts.map +1 -0
  77. package/dist/{utils → src/utils}/validation.js +18 -2
  78. package/dist/src/utils/validation.js.map +1 -0
  79. package/dist/templates/application-additions/.forgecartignore +1 -1
  80. package/dist/templates/application-additions/Procfile +1 -1
  81. package/dist/templates/application-additions/env.example +7 -0
  82. package/dist/templates/application-additions/src/app/app.module.ts +16 -0
  83. package/dist/templates/application-additions/src/services/forgecart.service.ts +62 -0
  84. package/dist/templates/application-additions/src/services/index.ts +2 -0
  85. package/dist/templates/application-additions/src/services/price-fetcher.service.ts +22 -23
  86. package/dist/templates/storefront-additions/.forgecartignore +30 -6
  87. package/dist/templates/storefront-additions/Procfile +1 -1
  88. package/dist/templates/storefront-additions/env.example +3 -0
  89. package/dist/templates/storefront-additions/package.json +11 -0
  90. package/dist/templates/storefront-additions/src/app/products/page.tsx +16 -28
  91. package/dist/templates/storefront-additions/src/lib/forgecart.ts +19 -8
  92. package/dist/templates/workspace/.nxignore +2 -0
  93. package/package.json +6 -28
  94. package/templates/application-additions/.forgecartignore +1 -1
  95. package/templates/application-additions/Procfile +1 -1
  96. package/templates/application-additions/env.example +7 -0
  97. package/templates/application-additions/src/app/app.module.ts +16 -0
  98. package/templates/application-additions/src/services/forgecart.service.ts +62 -0
  99. package/templates/application-additions/src/services/index.ts +2 -0
  100. package/templates/application-additions/src/services/price-fetcher.service.ts +22 -23
  101. package/templates/storefront-additions/.forgecartignore +30 -6
  102. package/templates/storefront-additions/Procfile +1 -1
  103. package/templates/storefront-additions/env.example +3 -0
  104. package/templates/storefront-additions/package.json +11 -0
  105. package/templates/storefront-additions/src/app/products/page.tsx +16 -28
  106. package/templates/storefront-additions/src/lib/forgecart.ts +19 -8
  107. package/templates/workspace/.nxignore +2 -0
  108. package/dist/cli.d.ts.map +0 -1
  109. package/dist/cli.js.map +0 -1
  110. package/dist/commands/delete.d.ts.map +0 -1
  111. package/dist/commands/delete.js.map +0 -1
  112. package/dist/commands/deploy.d.ts.map +0 -1
  113. package/dist/commands/deploy.js +0 -128
  114. package/dist/commands/deploy.js.map +0 -1
  115. package/dist/commands/env.d.ts.map +0 -1
  116. package/dist/commands/env.js.map +0 -1
  117. package/dist/commands/init.d.ts.map +0 -1
  118. package/dist/commands/init.js.map +0 -1
  119. package/dist/commands/list.d.ts.map +0 -1
  120. package/dist/commands/list.js.map +0 -1
  121. package/dist/commands/logs.d.ts.map +0 -1
  122. package/dist/commands/logs.js +0 -105
  123. package/dist/commands/logs.js.map +0 -1
  124. package/dist/commands/scale.d.ts.map +0 -1
  125. package/dist/commands/scale.js.map +0 -1
  126. package/dist/commands/status.d.ts.map +0 -1
  127. package/dist/commands/status.js.map +0 -1
  128. package/dist/commands/whoami.d.ts.map +0 -1
  129. package/dist/commands/whoami.js.map +0 -1
  130. package/dist/index.js.map +0 -1
  131. package/dist/lib/api-client.d.ts.map +0 -1
  132. package/dist/lib/api-client.js +0 -220
  133. package/dist/lib/api-client.js.map +0 -1
  134. package/dist/lib/archive.d.ts.map +0 -1
  135. package/dist/lib/archive.js.map +0 -1
  136. package/dist/lib/config.d.ts +0 -12
  137. package/dist/lib/config.d.ts.map +0 -1
  138. package/dist/lib/config.js +0 -79
  139. package/dist/lib/config.js.map +0 -1
  140. package/dist/lib/logger.d.ts.map +0 -1
  141. package/dist/lib/logger.js.map +0 -1
  142. package/dist/lib/nx-generator.d.ts +0 -8
  143. package/dist/lib/nx-generator.d.ts.map +0 -1
  144. package/dist/lib/nx-generator.js +0 -146
  145. package/dist/lib/nx-generator.js.map +0 -1
  146. package/dist/types/index.d.ts.map +0 -1
  147. package/dist/types/index.js.map +0 -1
  148. package/dist/utils/spinner.d.ts.map +0 -1
  149. package/dist/utils/spinner.js.map +0 -1
  150. package/dist/utils/validation.d.ts.map +0 -1
  151. package/dist/utils/validation.js.map +0 -1
  152. /package/dist/{cli.d.ts → src/cli.d.ts} +0 -0
  153. /package/dist/{commands → src/commands}/delete.d.ts +0 -0
  154. /package/dist/{commands → src/commands}/deploy.d.ts +0 -0
  155. /package/dist/{commands → src/commands}/env.d.ts +0 -0
  156. /package/dist/{commands → src/commands}/init.d.ts +0 -0
  157. /package/dist/{commands → src/commands}/list.d.ts +0 -0
  158. /package/dist/{commands → src/commands}/logs.d.ts +0 -0
  159. /package/dist/{commands → src/commands}/scale.d.ts +0 -0
  160. /package/dist/{commands → src/commands}/status.d.ts +0 -0
  161. /package/dist/{commands → src/commands}/whoami.d.ts +0 -0
  162. /package/dist/{index.d.ts → src/index.d.ts} +0 -0
  163. /package/dist/{index.js → src/index.js} +0 -0
  164. /package/dist/{lib → src/lib}/logger.d.ts +0 -0
  165. /package/dist/{lib → src/lib}/logger.js +0 -0
  166. /package/dist/{types → src/types}/index.js +0 -0
  167. /package/dist/{utils → src/utils}/spinner.d.ts +0 -0
  168. /package/dist/{utils → src/utils}/spinner.js +0 -0
  169. /package/dist/{utils → src/utils}/validation.d.ts +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"standalone.js","sourceRoot":"","sources":["../../../src/lib/standalone.ts"],"names":[],"mappings":"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"}
@@ -29,16 +29,26 @@ export interface Deployment {
29
29
  export interface ChannelInfo {
30
30
  id: string;
31
31
  code: string;
32
+ name: string;
33
+ domain: string;
34
+ hasApplication: boolean;
35
+ applicationName: string | null;
32
36
  }
33
37
  export interface DeploymentEnv {
34
38
  key: string;
35
39
  value: string;
36
40
  }
41
+ export interface DeploymentLogEntry {
42
+ timestamp: string;
43
+ message: string;
44
+ type: string;
45
+ }
37
46
  export interface InitOptions {
38
47
  projectName?: string;
39
48
  channelToken?: string;
40
49
  withApplication?: boolean;
41
50
  apiUrl?: string;
51
+ nxVersion?: string;
42
52
  }
43
53
  export interface DeployOptions {
44
54
  type?: DeploymentType;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAA;IACf,YAAY,EAAE,MAAM,CAAA;IACpB,MAAM,EAAE,MAAM,CAAA;IACd,cAAc,EAAE,OAAO,CAAA;IACvB,cAAc,EAAE,MAAM,CAAA;IACtB,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB;AAED,oBAAY,cAAc;IACxB,UAAU,eAAe;IACzB,WAAW,gBAAgB;CAC5B;AAED,oBAAY,gBAAgB;IAC1B,OAAO,YAAY;IACnB,OAAO,YAAY;IACnB,OAAO,YAAY;IACnB,KAAK,UAAU;IACf,OAAO,YAAY;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,cAAc,CAAA;IACpB,MAAM,EAAE,gBAAgB,CAAA;IACxB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;CAC5B;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,cAAc,EAAE,OAAO,CAAA;IACvB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAA;CAC/B;AAED,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;CACb;AAED,MAAM,WAAW,WAAW;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,cAAc,CAAA;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,cAAc,CAAA;IACpB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,cAAc,CAAA;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,cAAc,CAAA;IACpB,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,cAAc,CAAA;IACpB,GAAG,EAAE,MAAM,CAAA;CACZ;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,cAAc,CAAA;IACpB,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,cAAc,CAAA;IACpB,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":"AASA,MAAM,CAAN,IAAY,cAGX;AAHD,WAAY,cAAc;IACxB,2CAAyB,CAAA;IACzB,6CAA2B,CAAA;AAC7B,CAAC,EAHW,cAAc,KAAd,cAAc,QAGzB;AAED,MAAM,CAAN,IAAY,gBAMX;AAND,WAAY,gBAAgB;IAC1B,uCAAmB,CAAA;IACnB,uCAAmB,CAAA;IACnB,uCAAmB,CAAA;IACnB,mCAAe,CAAA;IACf,uCAAmB,CAAA;AACrB,CAAC,EANW,gBAAgB,KAAhB,gBAAgB,QAM3B"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spinner.d.ts","sourceRoot":"","sources":["../../../src/utils/spinner.ts"],"names":[],"mappings":"AAAA,OAAY,EAAE,GAAG,EAAE,MAAM,KAAK,CAAA;AAE9B,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAK/C;AAED,wBAAsB,WAAW,CAAC,CAAC,EACjC,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAChB,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GACnB,OAAO,CAAC,CAAC,CAAC,CAWZ"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spinner.js","sourceRoot":"","sources":["../../../src/utils/spinner.ts"],"names":[],"mappings":"AAAA,OAAO,GAAY,MAAM,KAAK,CAAA;AAE9B,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,OAAO,GAAG,CAAC;QACT,IAAI;QACJ,OAAO,EAAE,MAAM;KAChB,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,IAAY,EACZ,WAAmB,EACnB,QAAgB,EAChB,EAAoB;IAEpB,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,CAAA;IAE3C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,EAAE,EAAE,CAAA;QACzB,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA;QAC5B,OAAO,MAAM,CAAA;IACf,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QACtB,MAAM,KAAK,CAAA;IACb,CAAC;AACH,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../../src/utils/validation.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAElD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGxD;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CA+CpE;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAG3D;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAElD;AAED,wBAAgB,aAAa,CAC3B,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,MAAM,GACrB,OAAO,CAMT;AAED,wBAAgB,cAAc,CAC5B,WAAW,EAAE,MAAM,EACnB,eAAe,EAAE,MAAM,GACtB,OAAO,CAMT;AAED,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG;IACrD,IAAI,EAAE,cAAc,CAAA;IACpB,IAAI,EAAE,MAAM,CAAA;CACb,GAAG,IAAI,CAcP"}
@@ -34,6 +34,20 @@ export function detectProjectType(dir) {
34
34
  // Ignore parse errors
35
35
  }
36
36
  }
37
+ // Check for Nx monorepo NestJS project (no nest-cli.json or local package.json)
38
+ // Look for src/main.ts with NestJS imports
39
+ const mainTs = path.join(dir, 'src', 'main.ts');
40
+ if (fs.existsSync(mainTs)) {
41
+ try {
42
+ const content = fs.readFileSync(mainTs, 'utf-8');
43
+ if (content.includes('@nestjs/core') || content.includes('NestFactory')) {
44
+ return DeploymentType.APPLICATION;
45
+ }
46
+ }
47
+ catch {
48
+ // Ignore read errors
49
+ }
50
+ }
37
51
  return null;
38
52
  }
39
53
  export function validateChannelToken(token) {
@@ -45,11 +59,13 @@ export function isNxWorkspace(dir) {
45
59
  }
46
60
  export function hasStorefront(projectRoot, storefrontPath) {
47
61
  const fullPath = path.join(projectRoot, storefrontPath);
48
- return fs.existsSync(fullPath) && detectProjectType(fullPath) === DeploymentType.STOREFRONT;
62
+ return (fs.existsSync(fullPath) &&
63
+ detectProjectType(fullPath) === DeploymentType.STOREFRONT);
49
64
  }
50
65
  export function hasApplication(projectRoot, applicationPath) {
51
66
  const fullPath = path.join(projectRoot, applicationPath);
52
- return fs.existsSync(fullPath) && detectProjectType(fullPath) === DeploymentType.APPLICATION;
67
+ return (fs.existsSync(fullPath) &&
68
+ detectProjectType(fullPath) === DeploymentType.APPLICATION);
53
69
  }
54
70
  export function getCurrentAppDir(projectRoot) {
55
71
  const cwd = process.cwd();
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../../src/utils/validation.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- # ForgéCart deployment ignore file
1
+ # ForgeCart deployment ignore file
2
2
  # Files and directories listed here will not be uploaded during deployment
3
3
 
4
4
  # Dependencies (will be installed during build)
@@ -1 +1 @@
1
- web: npm run start:prod
1
+ web: node main.js
@@ -0,0 +1,7 @@
1
+ # Server Configuration
2
+ PORT=3030
3
+ NODE_ENV=development
4
+
5
+ # ForgeCart API Configuration
6
+ FORGECART_API_URL=http://localhost:3000
7
+ FORGECART_CHANNEL_TOKEN=your-channel-token-here
@@ -0,0 +1,16 @@
1
+ import { Module } from '@nestjs/common';
2
+ import { ConfigModule } from '@nestjs/config';
3
+ import { AppController } from './app.controller';
4
+ import { AppService } from './app.service';
5
+ import { ForgeCartService, PriceFetcherService } from '../services';
6
+
7
+ @Module({
8
+ imports: [
9
+ ConfigModule.forRoot({
10
+ isGlobal: true,
11
+ }),
12
+ ],
13
+ controllers: [AppController],
14
+ providers: [AppService, ForgeCartService, PriceFetcherService],
15
+ })
16
+ export class AppModule {}
@@ -0,0 +1,62 @@
1
+ import { Injectable, OnModuleInit, OnModuleDestroy } from '@nestjs/common'
2
+ import { ConfigService } from '@nestjs/config'
3
+ import { ForgeCartSDK } from '@forgecart/sdk'
4
+
5
+ /**
6
+ * ForgeCart SDK Service
7
+ *
8
+ * Singleton service that manages the ForgeCart SDK instance.
9
+ * The SDK is initialized once on module init to maintain
10
+ * persistent socket connections for real-time features.
11
+ */
12
+ @Injectable()
13
+ export class ForgeCartService implements OnModuleInit, OnModuleDestroy {
14
+ private sdk: ForgeCartSDK | null = null
15
+
16
+ constructor(private configService: ConfigService) {}
17
+
18
+ onModuleInit(): void {
19
+ const endpoint = this.configService.get<string>('FORGECART_API_URL')
20
+ const token = this.configService.get<string>('FORGECART_CHANNEL_TOKEN')
21
+
22
+ if (!token) {
23
+ throw new Error('FORGECART_CHANNEL_TOKEN environment variable is required')
24
+ }
25
+
26
+ this.sdk = new ForgeCartSDK({
27
+ endpoint: endpoint || 'http://localhost:3000',
28
+ token,
29
+ })
30
+ }
31
+
32
+ onModuleDestroy(): void {
33
+ if (this.sdk) {
34
+ this.sdk.dispose()
35
+ }
36
+ this.sdk = null
37
+ }
38
+
39
+ /**
40
+ * Get the ForgeCart SDK instance
41
+ */
42
+ getSDK(): ForgeCartSDK {
43
+ if (!this.sdk) {
44
+ throw new Error('ForgeCart SDK not initialized')
45
+ }
46
+ return this.sdk
47
+ }
48
+
49
+ /**
50
+ * Access Shop API operations
51
+ */
52
+ get shop() {
53
+ return this.getSDK().shop
54
+ }
55
+
56
+ /**
57
+ * Access Admin API operations (requires admin token)
58
+ */
59
+ get admin() {
60
+ return this.getSDK().admin
61
+ }
62
+ }
@@ -0,0 +1,2 @@
1
+ export { ForgeCartService } from './forgecart.service'
2
+ export { PriceFetcherService } from './price-fetcher.service'
@@ -1,43 +1,39 @@
1
- import { Injectable, OnModuleInit } from '@nestjs/common'
2
- import { ForgecartClient } from '@forgecart/sdk'
3
-
4
- // Example service demonstrating ForgéCart SDK integration
5
- // This can be used for custom backend tasks like:
6
- // - Scheduled price updates
7
- // - Inventory synchronization
8
- // - Custom order processing
9
- // - Third-party integrations
1
+ import { Injectable } from '@nestjs/common'
2
+ import { ForgeCartService } from './forgecart.service'
10
3
 
4
+ /**
5
+ * Example service demonstrating ForgeCart SDK integration
6
+ *
7
+ * This can be used for custom backend tasks like:
8
+ * - Scheduled price updates
9
+ * - Inventory synchronization
10
+ * - Custom order processing
11
+ * - Third-party integrations
12
+ */
11
13
  @Injectable()
12
- export class PriceFetcherService implements OnModuleInit {
13
- private client: ForgecartClient
14
-
15
- onModuleInit() {
16
- this.client = new ForgecartClient({
17
- channelToken: process.env.FORGECART_CHANNEL_TOKEN || '',
18
- apiUrl: process.env.FORGECART_API_URL || 'https://api.forgecart.com',
19
- })
20
- }
14
+ export class PriceFetcherService {
15
+ constructor(private readonly forgeCart: ForgeCartService) {}
21
16
 
22
17
  async getProductPrices(productIds: string[]): Promise<
23
18
  Array<{
24
19
  productId: string
25
20
  name: string
26
21
  price: number
27
- currencyCode: string
28
22
  }>
29
23
  > {
30
24
  const prices = []
31
25
 
32
26
  for (const productId of productIds) {
33
27
  try {
34
- const product = await this.client.shop.products.get(productId)
28
+ const result = await this.forgeCart.shop.products.product({
29
+ id: productId,
30
+ })
31
+ const product = result.product
35
32
  if (product && product.variants?.[0]) {
36
33
  prices.push({
37
34
  productId,
38
35
  name: product.name,
39
36
  price: product.variants[0].price,
40
- currencyCode: product.variants[0].currencyCode,
41
37
  })
42
38
  }
43
39
  } catch (error) {
@@ -55,11 +51,14 @@ export class PriceFetcherService implements OnModuleInit {
55
51
  let errors = 0
56
52
 
57
53
  try {
58
- const products = await this.client.shop.products.list({ take: 100 })
54
+ const result = await this.forgeCart.shop.products.products({
55
+ options: { take: 100 },
56
+ })
59
57
 
60
- for (const product of products.items || []) {
58
+ for (const product of result.products.items || []) {
61
59
  // Here you would implement your custom sync logic
62
60
  // e.g., update external ERP, sync with warehouse system, etc.
61
+ console.log(`Syncing product: ${product.name}`)
63
62
  synced++
64
63
  }
65
64
  } catch (error) {
@@ -1,8 +1,8 @@
1
- # ForgéCart deployment ignore file
1
+ # ForgeCart deployment ignore file
2
2
  # Files and directories listed here will not be uploaded during deployment
3
3
 
4
- # Dependencies (will be installed during build)
5
- node_modules/
4
+ # Dependencies - only exclude root node_modules (standalone has its own)
5
+ /node_modules/
6
6
 
7
7
  # Development files
8
8
  .git/
@@ -18,9 +18,17 @@ node_modules/
18
18
  *.swp
19
19
  *.swo
20
20
 
21
- # Build artifacts (we build on the server)
22
- .next/
23
- out/
21
+ # Build artifacts - exclude root level only (standalone has nested .next that must be kept)
22
+ /.next/cache/
23
+ /.next/server/
24
+ /.next/types/
25
+ /.next/trace
26
+ /.next/trace-build
27
+ /.next/dev/
28
+ /.next/build/
29
+ /.next/diagnostics/
30
+ # Keep .next/standalone/ and everything inside it
31
+ /out/
24
32
 
25
33
  # Test files
26
34
  __tests__/
@@ -29,6 +37,22 @@ __tests__/
29
37
  *.spec.ts
30
38
  *.spec.tsx
31
39
  coverage/
40
+ specs/
41
+
42
+ # Source files - not needed for runtime
43
+ src/
44
+
45
+ # Config files not needed at runtime
46
+ tsconfig.json
47
+ tsconfig.spec.json
48
+ project.json
49
+ jest.config.cts
50
+ eslint.config.mjs
51
+ postcss.config.js
52
+ tailwind.config.js
53
+ .swcrc
54
+ index.d.ts
55
+ next-env.d.ts
32
56
 
33
57
  # Documentation
34
58
  README.md
@@ -1 +1 @@
1
- web: npm run start
1
+ web: node .next/standalone/apps/storefront/server.js
@@ -0,0 +1,3 @@
1
+ # ForgeCart API Configuration
2
+ NEXT_PUBLIC_FORGECART_API_URL=http://localhost:3000
3
+ NEXT_PUBLIC_FORGECART_CHANNEL_TOKEN=your-channel-token-here
@@ -0,0 +1,11 @@
1
+ {
2
+ "name": "storefront",
3
+ "version": "1.0.0",
4
+ "private": true,
5
+ "engines": {
6
+ "node": ">=20.0.0"
7
+ },
8
+ "scripts": {
9
+ "start": "node .next/standalone/apps/storefront/server.js"
10
+ }
11
+ }
@@ -1,34 +1,21 @@
1
+ import { ProductList, Product } from '@forgecart/sdk/shop'
1
2
  import forgecart from '../../lib/forgecart'
2
3
 
3
- // Example product page using ForgéCart SDK
4
- // This demonstrates how to fetch and display products
5
-
6
- interface Product {
7
- id: string
8
- name: string
9
- slug: string
10
- description: string
11
- featuredAsset?: {
12
- preview: string
13
- }
14
- variants: Array<{
15
- id: string
16
- name: string
17
- price: number
18
- currencyCode: string
19
- }>
20
- }
21
-
22
- async function getProducts(): Promise<Product[]> {
4
+ async function getProducts(): Promise<ProductList> {
23
5
  try {
24
- // Fetch products from ForgéCart API
25
- const result = await forgecart.shop.products.list({
26
- take: 12,
6
+ // Fetch products from ForgeCart API
7
+ const result = await forgecart.shop.products.products({
8
+ options: {
9
+ take: 10,
10
+ },
27
11
  })
28
- return result.items || []
12
+ return (result.products as ProductList) || { items: [], totalItems: 0 }
29
13
  } catch (error) {
30
14
  console.error('Failed to fetch products:', error)
31
- return []
15
+ return {
16
+ items: [] as Product[],
17
+ totalItems: 0,
18
+ }
32
19
  }
33
20
  }
34
21
 
@@ -39,13 +26,14 @@ export default async function ProductsPage() {
39
26
  <div className="container mx-auto px-4 py-8">
40
27
  <h1 className="text-3xl font-bold mb-8">Products</h1>
41
28
 
42
- {products.length === 0 ? (
29
+ {products.items.length === 0 ? (
43
30
  <p className="text-gray-600">
44
- No products found. Make sure your ForgéCart channel is configured correctly.
31
+ No products found. Make sure your ForgeCart channel is configured
32
+ correctly.
45
33
  </p>
46
34
  ) : (
47
35
  <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-6">
48
- {products.map((product) => (
36
+ {products.items.map((product: Product) => (
49
37
  <div
50
38
  key={product.id}
51
39
  className="border rounded-lg overflow-hidden shadow-sm hover:shadow-md transition-shadow"
@@ -1,11 +1,22 @@
1
- import { ForgecartClient } from '@forgecart/sdk'
1
+ import { ForgeCartSDK } from '@forgecart/sdk'
2
2
 
3
- // Initialize the ForgéCart SDK client
4
- // The channel token is read from environment variables
5
- export const forgecart = new ForgecartClient({
6
- channelToken: process.env.FORGECART_CHANNEL_TOKEN || '',
7
- apiUrl: process.env.FORGECART_API_URL || 'https://api.forgecart.com',
8
- })
3
+ // Singleton instance of the ForgeCart SDK
4
+ // Initialized once to maintain socket connection
5
+ let sdkInstance: ForgeCartSDK | null = null
6
+
7
+ export function getForgeCartSDK(): ForgeCartSDK {
8
+ if (!sdkInstance) {
9
+ sdkInstance = new ForgeCartSDK({
10
+ endpoint:
11
+ process.env.NEXT_PUBLIC_FORGECART_API_URL ||
12
+ 'https://api.forgecart.com',
13
+ token: process.env.NEXT_PUBLIC_FORGECART_CHANNEL_TOKEN || '',
14
+ })
15
+ }
16
+ return sdkInstance
17
+ }
18
+
19
+ // Export singleton instance for convenience
20
+ export const forgecart = getForgeCartSDK()
9
21
 
10
- // Export for use in server components
11
22
  export default forgecart
@@ -0,0 +1,2 @@
1
+ # ForgeCart deployment directories - exclude from Nx project detection
2
+ .forgecart
package/package.json CHANGED
@@ -1,42 +1,20 @@
1
1
  {
2
2
  "name": "@forgecart/cli",
3
- "version": "1.0.0",
3
+ "version": "1.0.1",
4
4
  "type": "module",
5
- "description": "CLI tool for deploying applications to ForgéCart",
5
+ "description": "CLI tool for deploying applications to ForgeCart",
6
6
  "main": "dist/index.js",
7
7
  "bin": {
8
8
  "forgecart": "./bin/forgecart.js"
9
9
  },
10
- "scripts": {
11
- "build": "tsc",
12
- "dev": "ts-node --esm src/index.ts",
13
- "prepublishOnly": "npm run build"
10
+ "dependencies": {
11
+ "@forgecart/sdk": "1.2.1"
14
12
  },
15
13
  "files": [
16
14
  "dist",
17
15
  "bin",
18
16
  "templates"
19
17
  ],
20
- "dependencies": {
21
- "archiver": "^7.0.1",
22
- "chalk": "^5.3.0",
23
- "cli-table3": "^0.6.5",
24
- "commander": "^12.1.0",
25
- "form-data": "^4.0.0",
26
- "graphql": "^16.8.1",
27
- "graphql-request": "^6.1.0",
28
- "inquirer": "^9.2.23",
29
- "node-fetch": "^3.3.2",
30
- "ora": "^8.0.1",
31
- "ws": "^8.17.1"
32
- },
33
- "devDependencies": {
34
- "@types/archiver": "^6.0.2",
35
- "@types/inquirer": "^9.0.7",
36
- "@types/node": "^20.11.5",
37
- "@types/ws": "^8.5.10",
38
- "typescript": "^5.9.3"
39
- },
40
18
  "engines": {
41
19
  "node": ">=18.0.0"
42
20
  },
@@ -47,6 +25,6 @@
47
25
  "paas",
48
26
  "nodejs"
49
27
  ],
50
- "author": "ForgéCart",
28
+ "author": "ForgeCart",
51
29
  "license": "MIT"
52
- }
30
+ }
@@ -1,4 +1,4 @@
1
- # ForgéCart deployment ignore file
1
+ # ForgeCart deployment ignore file
2
2
  # Files and directories listed here will not be uploaded during deployment
3
3
 
4
4
  # Dependencies (will be installed during build)
@@ -1 +1 @@
1
- web: npm run start:prod
1
+ web: node main.js
@@ -0,0 +1,7 @@
1
+ # Server Configuration
2
+ PORT=3030
3
+ NODE_ENV=development
4
+
5
+ # ForgeCart API Configuration
6
+ FORGECART_API_URL=http://localhost:3000
7
+ FORGECART_CHANNEL_TOKEN=your-channel-token-here
@@ -0,0 +1,16 @@
1
+ import { Module } from '@nestjs/common';
2
+ import { ConfigModule } from '@nestjs/config';
3
+ import { AppController } from './app.controller';
4
+ import { AppService } from './app.service';
5
+ import { ForgeCartService, PriceFetcherService } from '../services';
6
+
7
+ @Module({
8
+ imports: [
9
+ ConfigModule.forRoot({
10
+ isGlobal: true,
11
+ }),
12
+ ],
13
+ controllers: [AppController],
14
+ providers: [AppService, ForgeCartService, PriceFetcherService],
15
+ })
16
+ export class AppModule {}
@@ -0,0 +1,62 @@
1
+ import { Injectable, OnModuleInit, OnModuleDestroy } from '@nestjs/common'
2
+ import { ConfigService } from '@nestjs/config'
3
+ import { ForgeCartSDK } from '@forgecart/sdk'
4
+
5
+ /**
6
+ * ForgeCart SDK Service
7
+ *
8
+ * Singleton service that manages the ForgeCart SDK instance.
9
+ * The SDK is initialized once on module init to maintain
10
+ * persistent socket connections for real-time features.
11
+ */
12
+ @Injectable()
13
+ export class ForgeCartService implements OnModuleInit, OnModuleDestroy {
14
+ private sdk: ForgeCartSDK | null = null
15
+
16
+ constructor(private configService: ConfigService) {}
17
+
18
+ onModuleInit(): void {
19
+ const endpoint = this.configService.get<string>('FORGECART_API_URL')
20
+ const token = this.configService.get<string>('FORGECART_CHANNEL_TOKEN')
21
+
22
+ if (!token) {
23
+ throw new Error('FORGECART_CHANNEL_TOKEN environment variable is required')
24
+ }
25
+
26
+ this.sdk = new ForgeCartSDK({
27
+ endpoint: endpoint || 'http://localhost:3000',
28
+ token,
29
+ })
30
+ }
31
+
32
+ onModuleDestroy(): void {
33
+ if (this.sdk) {
34
+ this.sdk.dispose()
35
+ }
36
+ this.sdk = null
37
+ }
38
+
39
+ /**
40
+ * Get the ForgeCart SDK instance
41
+ */
42
+ getSDK(): ForgeCartSDK {
43
+ if (!this.sdk) {
44
+ throw new Error('ForgeCart SDK not initialized')
45
+ }
46
+ return this.sdk
47
+ }
48
+
49
+ /**
50
+ * Access Shop API operations
51
+ */
52
+ get shop() {
53
+ return this.getSDK().shop
54
+ }
55
+
56
+ /**
57
+ * Access Admin API operations (requires admin token)
58
+ */
59
+ get admin() {
60
+ return this.getSDK().admin
61
+ }
62
+ }
@@ -0,0 +1,2 @@
1
+ export { ForgeCartService } from './forgecart.service'
2
+ export { PriceFetcherService } from './price-fetcher.service'