@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.
- package/LICENSE +21 -0
- package/README.md +7 -7
- package/bin/forgecart.js +1 -1
- package/dist/package.json +50 -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 +8 -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 +243 -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 +70 -12
- 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 +103 -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 +6 -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 +7 -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 +7 -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 +20 -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/src/lib/api-client.d.ts +34 -0
- package/dist/src/lib/api-client.d.ts.map +1 -0
- package/dist/src/lib/api-client.js +141 -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 +44 -0
- package/dist/src/lib/env-sync.d.ts.map +1 -0
- package/dist/src/lib/env-sync.js +207 -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 +22 -0
- package/dist/src/lib/nx-generator.d.ts.map +1 -0
- package/dist/src/lib/nx-generator.js +345 -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 +16 -0
- package/dist/src/utils/spinner.d.ts.map +1 -0
- package/dist/src/utils/spinner.js +88 -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/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/product-event-listener.service.ts +150 -0
- package/dist/templates/application-e2e-additions/src/support/global-setup.ts +16 -0
- package/dist/templates/application-e2e-additions/src/support/test-setup.ts +9 -0
- package/dist/templates/storefront-additions/.forgecartignore +30 -6
- package/dist/templates/storefront-additions/Procfile +1 -1
- package/dist/templates/storefront-additions/package.json +11 -0
- package/dist/templates/storefront-additions/postcss.config.js +5 -0
- package/dist/templates/storefront-additions/src/app/cart/page.tsx +77 -0
- package/dist/templates/storefront-additions/src/app/global.css +1 -0
- package/dist/templates/storefront-additions/src/app/layout.tsx +25 -0
- package/dist/templates/storefront-additions/src/app/page.tsx +43 -0
- package/dist/templates/storefront-additions/src/components/AddToCartButton.tsx +29 -0
- package/dist/templates/storefront-additions/src/components/CartItem.tsx +82 -0
- package/dist/templates/storefront-additions/src/components/Header.tsx +42 -0
- package/dist/templates/storefront-additions/src/components/ProductCard.tsx +57 -0
- package/dist/templates/storefront-additions/src/components/QuantitySelector.tsx +35 -0
- package/dist/templates/storefront-additions/src/context/CartContext.tsx +158 -0
- package/dist/templates/storefront-additions/src/lib/forgecart.ts +19 -8
- package/dist/templates/storefront-additions/tailwind.config.js +8 -0
- package/dist/templates/storefront-e2e-additions/playwright.config.ts +26 -0
- package/dist/templates/storefront-e2e-additions/src/example.spec.ts +11 -0
- 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/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/product-event-listener.service.ts +150 -0
- package/templates/application-e2e-additions/src/support/global-setup.ts +16 -0
- package/templates/application-e2e-additions/src/support/test-setup.ts +9 -0
- package/templates/storefront-additions/.forgecartignore +30 -6
- package/templates/storefront-additions/Procfile +1 -1
- package/templates/storefront-additions/package.json +11 -0
- package/templates/storefront-additions/postcss.config.js +5 -0
- package/templates/storefront-additions/src/app/cart/page.tsx +77 -0
- package/templates/storefront-additions/src/app/global.css +1 -0
- package/templates/storefront-additions/src/app/layout.tsx +25 -0
- package/templates/storefront-additions/src/app/page.tsx +43 -0
- package/templates/storefront-additions/src/components/AddToCartButton.tsx +29 -0
- package/templates/storefront-additions/src/components/CartItem.tsx +82 -0
- package/templates/storefront-additions/src/components/Header.tsx +42 -0
- package/templates/storefront-additions/src/components/ProductCard.tsx +57 -0
- package/templates/storefront-additions/src/components/QuantitySelector.tsx +35 -0
- package/templates/storefront-additions/src/context/CartContext.tsx +158 -0
- package/templates/storefront-additions/src/lib/forgecart.ts +19 -8
- package/templates/storefront-additions/tailwind.config.js +8 -0
- package/templates/storefront-e2e-additions/playwright.config.ts +26 -0
- package/templates/storefront-e2e-additions/src/example.spec.ts +11 -0
- 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 +0 -21
- 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/templates/application-additions/src/services/price-fetcher.service.ts +0 -72
- package/dist/templates/storefront-additions/src/app/products/page.tsx +0 -78
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/index.js.map +0 -1
- package/dist/utils/spinner.d.ts +0 -4
- package/dist/utils/spinner.d.ts.map +0 -1
- package/dist/utils/spinner.js +0 -20
- 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/templates/application-additions/src/services/price-fetcher.service.ts +0 -72
- package/templates/storefront-additions/src/app/products/page.tsx +0 -78
- /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}/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":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,IAAI,EAAE,CAAC,OAAe,EAAE,EAAE;QACxB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAA;IACvC,CAAC;IAED,OAAO,EAAE,CAAC,OAAe,EAAE,EAAE;QAC3B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAA;IACxC,CAAC;IAED,IAAI,EAAE,CAAC,OAAe,EAAE,EAAE;QACxB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAA;IACzC,CAAC;IAED,KAAK,EAAE,CAAC,OAAe,EAAE,EAAE;QACzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAA;IACtC,CAAC;IAED,KAAK,EAAE,CAAC,OAAe,EAAE,EAAE;QACzB,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAA;QACnD,CAAC;IACH,CAAC;IAED,GAAG,EAAE,CAAC,OAAe,EAAE,EAAE;QACvB,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;IACtB,CAAC;IAED,OAAO,EAAE,GAAG,EAAE;QACZ,OAAO,CAAC,GAAG,EAAE,CAAA;IACf,CAAC;IAED,KAAK,EAAE,CAAC,OAAe,EAAE,EAAE;QACzB,OAAO,CAAC,GAAG,EAAE,CAAA;QACb,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAA;QACrC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;IACrD,CAAC;IAED,IAAI,EAAE,CAAC,KAAe,EAAE,EAAE;QACxB,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;YACrB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAA;QACtC,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,QAAQ,EAAE,CAAC,GAAW,EAAE,KAAa,EAAE,EAAE;QACvC,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,IAAI,KAAK,EAAE,CAAC,CAAA;IACpD,CAAC;IAED,GAAG,EAAE,CAAC,OAAe,EAAE,EAAE;QACvB,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QACjC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAA;QACzD,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,SAAS,GAAG,CAAC,CAAC,CAAA;QAExC,OAAO,CAAC,GAAG,EAAE,CAAA;QACb,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,MAAM,GAAG,CAAC,CAAC,CAAA;QACtC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;YACrB,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,CAAA;YACnD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,GAAG,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;QAC/D,CAAC,CAAC,CAAA;QACF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,MAAM,GAAG,CAAC,CAAC,CAAA;QACtC,OAAO,CAAC,GAAG,EAAE,CAAA;IACf,CAAC;CACF,CAAA;AAED,eAAe,MAAM,CAAA"}
|
|
@@ -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
|