@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.
- package/LICENSE +21 -0
- package/README.md +7 -7
- package/bin/forgecart.js +1 -1
- package/dist/package.json +49 -0
- package/dist/src/cli.d.ts.map +1 -0
- package/dist/{cli.js → src/cli.js} +8 -6
- package/dist/src/cli.js.map +1 -0
- package/dist/src/commands/delete.d.ts.map +1 -0
- package/dist/{commands → src/commands}/delete.js +6 -3
- package/dist/src/commands/delete.js.map +1 -0
- package/dist/src/commands/deploy.d.ts.map +1 -0
- package/dist/src/commands/deploy.js +235 -0
- package/dist/src/commands/deploy.js.map +1 -0
- package/dist/src/commands/env.d.ts.map +1 -0
- package/dist/{commands → src/commands}/env.js +60 -9
- package/dist/src/commands/env.js.map +1 -0
- package/dist/src/commands/init.d.ts.map +1 -0
- package/dist/{commands → src/commands}/init.js +51 -17
- package/dist/src/commands/init.js.map +1 -0
- package/dist/src/commands/list.d.ts.map +1 -0
- package/dist/{commands → src/commands}/list.js +4 -2
- package/dist/src/commands/list.js.map +1 -0
- package/dist/src/commands/login.d.ts +3 -0
- package/dist/src/commands/login.d.ts.map +1 -0
- package/dist/src/commands/login.js +120 -0
- package/dist/src/commands/login.js.map +1 -0
- package/dist/src/commands/logs.d.ts.map +1 -0
- package/dist/src/commands/logs.js +88 -0
- package/dist/src/commands/logs.js.map +1 -0
- package/dist/src/commands/scale.d.ts.map +1 -0
- package/dist/{commands → src/commands}/scale.js +6 -3
- package/dist/src/commands/scale.js.map +1 -0
- package/dist/src/commands/status.d.ts.map +1 -0
- package/dist/{commands → src/commands}/status.js +4 -2
- package/dist/src/commands/status.js.map +1 -0
- package/dist/src/commands/whoami.d.ts.map +1 -0
- package/dist/{commands → src/commands}/whoami.js +18 -7
- package/dist/src/commands/whoami.js.map +1 -0
- package/dist/{index.d.ts.map → src/index.d.ts.map} +1 -1
- package/dist/src/index.js.map +1 -0
- package/dist/{lib → src/lib}/api-client.d.ts +11 -4
- package/dist/src/lib/api-client.d.ts.map +1 -0
- package/dist/src/lib/api-client.js +137 -0
- package/dist/src/lib/api-client.js.map +1 -0
- package/dist/{lib → src/lib}/archive.d.ts +2 -1
- package/dist/src/lib/archive.d.ts.map +1 -0
- package/dist/{lib → src/lib}/archive.js +27 -5
- package/dist/src/lib/archive.js.map +1 -0
- package/dist/src/lib/config-updater.d.ts +10 -0
- package/dist/src/lib/config-updater.d.ts.map +1 -0
- package/dist/src/lib/config-updater.js +34 -0
- package/dist/src/lib/config-updater.js.map +1 -0
- package/dist/src/lib/config.d.ts +53 -0
- package/dist/src/lib/config.d.ts.map +1 -0
- package/dist/src/lib/config.js +162 -0
- package/dist/src/lib/config.js.map +1 -0
- package/dist/src/lib/env-sync.d.ts +36 -0
- package/dist/src/lib/env-sync.d.ts.map +1 -0
- package/dist/src/lib/env-sync.js +118 -0
- package/dist/src/lib/env-sync.js.map +1 -0
- package/dist/src/lib/logger.d.ts.map +1 -0
- package/dist/src/lib/logger.js.map +1 -0
- package/dist/src/lib/nx-generator.d.ts +20 -0
- package/dist/src/lib/nx-generator.d.ts.map +1 -0
- package/dist/src/lib/nx-generator.js +338 -0
- package/dist/src/lib/nx-generator.js.map +1 -0
- package/dist/src/lib/standalone.d.ts +28 -0
- package/dist/src/lib/standalone.d.ts.map +1 -0
- package/dist/src/lib/standalone.js +107 -0
- package/dist/src/lib/standalone.js.map +1 -0
- package/dist/{types → src/types}/index.d.ts +10 -0
- package/dist/src/types/index.d.ts.map +1 -0
- package/dist/src/types/index.js.map +1 -0
- package/dist/src/utils/spinner.d.ts.map +1 -0
- package/dist/src/utils/spinner.js.map +1 -0
- package/dist/src/utils/validation.d.ts.map +1 -0
- package/dist/{utils → src/utils}/validation.js +18 -2
- package/dist/src/utils/validation.js.map +1 -0
- package/dist/templates/application-additions/.forgecartignore +1 -1
- package/dist/templates/application-additions/Procfile +1 -1
- package/dist/templates/application-additions/env.example +7 -0
- package/dist/templates/application-additions/src/app/app.module.ts +16 -0
- package/dist/templates/application-additions/src/services/forgecart.service.ts +62 -0
- package/dist/templates/application-additions/src/services/index.ts +2 -0
- package/dist/templates/application-additions/src/services/price-fetcher.service.ts +22 -23
- package/dist/templates/storefront-additions/.forgecartignore +30 -6
- package/dist/templates/storefront-additions/Procfile +1 -1
- package/dist/templates/storefront-additions/env.example +3 -0
- package/dist/templates/storefront-additions/package.json +11 -0
- package/dist/templates/storefront-additions/src/app/products/page.tsx +16 -28
- package/dist/templates/storefront-additions/src/lib/forgecart.ts +19 -8
- package/dist/templates/workspace/.nxignore +2 -0
- package/package.json +6 -28
- package/templates/application-additions/.forgecartignore +1 -1
- package/templates/application-additions/Procfile +1 -1
- package/templates/application-additions/env.example +7 -0
- package/templates/application-additions/src/app/app.module.ts +16 -0
- package/templates/application-additions/src/services/forgecart.service.ts +62 -0
- package/templates/application-additions/src/services/index.ts +2 -0
- package/templates/application-additions/src/services/price-fetcher.service.ts +22 -23
- package/templates/storefront-additions/.forgecartignore +30 -6
- package/templates/storefront-additions/Procfile +1 -1
- package/templates/storefront-additions/env.example +3 -0
- package/templates/storefront-additions/package.json +11 -0
- package/templates/storefront-additions/src/app/products/page.tsx +16 -28
- package/templates/storefront-additions/src/lib/forgecart.ts +19 -8
- package/templates/workspace/.nxignore +2 -0
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js.map +0 -1
- package/dist/commands/delete.d.ts.map +0 -1
- package/dist/commands/delete.js.map +0 -1
- package/dist/commands/deploy.d.ts.map +0 -1
- package/dist/commands/deploy.js +0 -128
- package/dist/commands/deploy.js.map +0 -1
- package/dist/commands/env.d.ts.map +0 -1
- package/dist/commands/env.js.map +0 -1
- package/dist/commands/init.d.ts.map +0 -1
- package/dist/commands/init.js.map +0 -1
- package/dist/commands/list.d.ts.map +0 -1
- package/dist/commands/list.js.map +0 -1
- package/dist/commands/logs.d.ts.map +0 -1
- package/dist/commands/logs.js +0 -105
- package/dist/commands/logs.js.map +0 -1
- package/dist/commands/scale.d.ts.map +0 -1
- package/dist/commands/scale.js.map +0 -1
- package/dist/commands/status.d.ts.map +0 -1
- package/dist/commands/status.js.map +0 -1
- package/dist/commands/whoami.d.ts.map +0 -1
- package/dist/commands/whoami.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/lib/api-client.d.ts.map +0 -1
- package/dist/lib/api-client.js +0 -220
- package/dist/lib/api-client.js.map +0 -1
- package/dist/lib/archive.d.ts.map +0 -1
- package/dist/lib/archive.js.map +0 -1
- package/dist/lib/config.d.ts +0 -12
- package/dist/lib/config.d.ts.map +0 -1
- package/dist/lib/config.js +0 -79
- package/dist/lib/config.js.map +0 -1
- package/dist/lib/logger.d.ts.map +0 -1
- package/dist/lib/logger.js.map +0 -1
- package/dist/lib/nx-generator.d.ts +0 -8
- package/dist/lib/nx-generator.d.ts.map +0 -1
- package/dist/lib/nx-generator.js +0 -146
- package/dist/lib/nx-generator.js.map +0 -1
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/index.js.map +0 -1
- package/dist/utils/spinner.d.ts.map +0 -1
- package/dist/utils/spinner.js.map +0 -1
- package/dist/utils/validation.d.ts.map +0 -1
- package/dist/utils/validation.js.map +0 -1
- /package/dist/{cli.d.ts → src/cli.d.ts} +0 -0
- /package/dist/{commands → src/commands}/delete.d.ts +0 -0
- /package/dist/{commands → src/commands}/deploy.d.ts +0 -0
- /package/dist/{commands → src/commands}/env.d.ts +0 -0
- /package/dist/{commands → src/commands}/init.d.ts +0 -0
- /package/dist/{commands → src/commands}/list.d.ts +0 -0
- /package/dist/{commands → src/commands}/logs.d.ts +0 -0
- /package/dist/{commands → src/commands}/scale.d.ts +0 -0
- /package/dist/{commands → src/commands}/status.d.ts +0 -0
- /package/dist/{commands → src/commands}/whoami.d.ts +0 -0
- /package/dist/{index.d.ts → src/index.d.ts} +0 -0
- /package/dist/{index.js → src/index.js} +0 -0
- /package/dist/{lib → src/lib}/logger.d.ts +0 -0
- /package/dist/{lib → src/lib}/logger.js +0 -0
- /package/dist/{types → src/types}/index.js +0 -0
- /package/dist/{utils → src/utils}/spinner.d.ts +0 -0
- /package/dist/{utils → src/utils}/spinner.js +0 -0
- /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) &&
|
|
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) &&
|
|
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 +1 @@
|
|
|
1
|
-
web:
|
|
1
|
+
web: node main.js
|
|
@@ -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
|
+
}
|
|
@@ -1,43 +1,39 @@
|
|
|
1
|
-
import { Injectable
|
|
2
|
-
import {
|
|
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
|
|
13
|
-
private
|
|
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
|
|
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
|
|
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
|
-
#
|
|
1
|
+
# ForgeCart deployment ignore file
|
|
2
2
|
# Files and directories listed here will not be uploaded during deployment
|
|
3
3
|
|
|
4
|
-
# Dependencies (
|
|
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 (
|
|
22
|
-
|
|
23
|
-
|
|
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:
|
|
1
|
+
web: node .next/standalone/apps/storefront/server.js
|
|
@@ -1,34 +1,21 @@
|
|
|
1
|
+
import { ProductList, Product } from '@forgecart/sdk/shop'
|
|
1
2
|
import forgecart from '../../lib/forgecart'
|
|
2
3
|
|
|
3
|
-
|
|
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
|
|
25
|
-
const result = await forgecart.shop.products.
|
|
26
|
-
|
|
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.
|
|
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
|
|
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 {
|
|
1
|
+
import { ForgeCartSDK } from '@forgecart/sdk'
|
|
2
2
|
|
|
3
|
-
//
|
|
4
|
-
//
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
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
|
package/package.json
CHANGED
|
@@ -1,42 +1,20 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@forgecart/cli",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.1",
|
|
4
4
|
"type": "module",
|
|
5
|
-
"description": "CLI tool for deploying applications to
|
|
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
|
-
"
|
|
11
|
-
"
|
|
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": "
|
|
28
|
+
"author": "ForgeCart",
|
|
51
29
|
"license": "MIT"
|
|
52
|
-
}
|
|
30
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
web:
|
|
1
|
+
web: node main.js
|
|
@@ -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
|
+
}
|