@forgecart/cli 1.1.0 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (181) hide show
  1. package/dist/bin/forgecart.d.ts +2 -0
  2. package/dist/bin/forgecart.js +4 -0
  3. package/dist/bin/forgecart.js.map +1 -0
  4. package/dist/src/cli.d.ts +14 -1
  5. package/dist/src/cli.js +30 -15
  6. package/dist/src/cli.js.map +1 -1
  7. package/dist/src/commands/init.d.ts +39 -2
  8. package/dist/src/commands/init.js +173 -301
  9. package/dist/src/commands/init.js.map +1 -1
  10. package/dist/src/commands/placeholders.d.ts +19 -0
  11. package/dist/src/commands/placeholders.js +109 -0
  12. package/dist/src/commands/placeholders.js.map +1 -0
  13. package/dist/src/output.d.ts +11 -0
  14. package/dist/src/output.js +16 -0
  15. package/dist/src/output.js.map +1 -0
  16. package/package.json +21 -11
  17. package/templates/storefront/.env.example +12 -0
  18. package/templates/storefront/.forgecartignore +2 -0
  19. package/templates/storefront/Procfile +1 -0
  20. package/templates/storefront/README.md +87 -0
  21. package/templates/storefront/next.config.js +14 -0
  22. package/templates/storefront/package.json +25 -0
  23. package/templates/storefront/postcss.config.js +6 -0
  24. package/templates/storefront/src/app/cart/page.tsx +88 -0
  25. package/templates/storefront/src/app/globals.css +13 -0
  26. package/templates/storefront/src/app/layout.tsx +32 -0
  27. package/templates/storefront/src/app/page.tsx +49 -0
  28. package/templates/storefront/src/app/products/[slug]/not-found.tsx +20 -0
  29. package/templates/storefront/src/app/products/[slug]/page.tsx +61 -0
  30. package/templates/storefront/src/app/products/page.tsx +27 -0
  31. package/templates/storefront/src/components/Header.tsx +47 -0
  32. package/templates/storefront/src/components/ProductCard.tsx +40 -0
  33. package/templates/storefront/src/components/ProductPurchase.tsx +91 -0
  34. package/templates/storefront/src/lib/cart-actions.ts +148 -0
  35. package/templates/storefront/src/lib/cart-context.tsx +88 -0
  36. package/templates/storefront/src/lib/forgecart.ts +187 -0
  37. package/{dist/templates/storefront-additions → templates/storefront}/tailwind.config.js +1 -1
  38. package/templates/storefront/tsconfig.json +23 -0
  39. package/LICENSE +0 -21
  40. package/README.md +0 -179
  41. package/bin/forgecart.js +0 -3
  42. package/dist/package.json +0 -50
  43. package/dist/src/cli.d.ts.map +0 -1
  44. package/dist/src/commands/delete.d.ts +0 -3
  45. package/dist/src/commands/delete.d.ts.map +0 -1
  46. package/dist/src/commands/delete.js +0 -60
  47. package/dist/src/commands/delete.js.map +0 -1
  48. package/dist/src/commands/deploy.d.ts +0 -3
  49. package/dist/src/commands/deploy.d.ts.map +0 -1
  50. package/dist/src/commands/deploy.js +0 -243
  51. package/dist/src/commands/deploy.js.map +0 -1
  52. package/dist/src/commands/env.d.ts +0 -3
  53. package/dist/src/commands/env.d.ts.map +0 -1
  54. package/dist/src/commands/env.js +0 -158
  55. package/dist/src/commands/env.js.map +0 -1
  56. package/dist/src/commands/init.d.ts.map +0 -1
  57. package/dist/src/commands/list.d.ts +0 -3
  58. package/dist/src/commands/list.d.ts.map +0 -1
  59. package/dist/src/commands/list.js +0 -65
  60. package/dist/src/commands/list.js.map +0 -1
  61. package/dist/src/commands/login.d.ts +0 -3
  62. package/dist/src/commands/login.d.ts.map +0 -1
  63. package/dist/src/commands/login.js +0 -120
  64. package/dist/src/commands/login.js.map +0 -1
  65. package/dist/src/commands/logs.d.ts +0 -3
  66. package/dist/src/commands/logs.d.ts.map +0 -1
  67. package/dist/src/commands/logs.js +0 -88
  68. package/dist/src/commands/logs.js.map +0 -1
  69. package/dist/src/commands/scale.d.ts +0 -3
  70. package/dist/src/commands/scale.d.ts.map +0 -1
  71. package/dist/src/commands/scale.js +0 -49
  72. package/dist/src/commands/scale.js.map +0 -1
  73. package/dist/src/commands/status.d.ts +0 -3
  74. package/dist/src/commands/status.d.ts.map +0 -1
  75. package/dist/src/commands/status.js +0 -90
  76. package/dist/src/commands/status.js.map +0 -1
  77. package/dist/src/commands/whoami.d.ts +0 -3
  78. package/dist/src/commands/whoami.d.ts.map +0 -1
  79. package/dist/src/commands/whoami.js +0 -59
  80. package/dist/src/commands/whoami.js.map +0 -1
  81. package/dist/src/index.d.ts +0 -3
  82. package/dist/src/index.d.ts.map +0 -1
  83. package/dist/src/index.js +0 -5
  84. package/dist/src/index.js.map +0 -1
  85. package/dist/src/lib/api-client.d.ts +0 -34
  86. package/dist/src/lib/api-client.d.ts.map +0 -1
  87. package/dist/src/lib/api-client.js +0 -141
  88. package/dist/src/lib/api-client.js.map +0 -1
  89. package/dist/src/lib/archive.d.ts +0 -9
  90. package/dist/src/lib/archive.d.ts.map +0 -1
  91. package/dist/src/lib/archive.js +0 -118
  92. package/dist/src/lib/archive.js.map +0 -1
  93. package/dist/src/lib/config-updater.d.ts +0 -10
  94. package/dist/src/lib/config-updater.d.ts.map +0 -1
  95. package/dist/src/lib/config-updater.js +0 -34
  96. package/dist/src/lib/config-updater.js.map +0 -1
  97. package/dist/src/lib/config.d.ts +0 -53
  98. package/dist/src/lib/config.d.ts.map +0 -1
  99. package/dist/src/lib/config.js +0 -162
  100. package/dist/src/lib/config.js.map +0 -1
  101. package/dist/src/lib/env-sync.d.ts +0 -44
  102. package/dist/src/lib/env-sync.d.ts.map +0 -1
  103. package/dist/src/lib/env-sync.js +0 -207
  104. package/dist/src/lib/env-sync.js.map +0 -1
  105. package/dist/src/lib/logger.d.ts +0 -15
  106. package/dist/src/lib/logger.d.ts.map +0 -1
  107. package/dist/src/lib/logger.js +0 -54
  108. package/dist/src/lib/logger.js.map +0 -1
  109. package/dist/src/lib/nx-generator.d.ts +0 -22
  110. package/dist/src/lib/nx-generator.d.ts.map +0 -1
  111. package/dist/src/lib/nx-generator.js +0 -345
  112. package/dist/src/lib/nx-generator.js.map +0 -1
  113. package/dist/src/lib/standalone.d.ts +0 -28
  114. package/dist/src/lib/standalone.d.ts.map +0 -1
  115. package/dist/src/lib/standalone.js +0 -107
  116. package/dist/src/lib/standalone.js.map +0 -1
  117. package/dist/src/types/index.d.ts +0 -80
  118. package/dist/src/types/index.d.ts.map +0 -1
  119. package/dist/src/types/index.js +0 -14
  120. package/dist/src/types/index.js.map +0 -1
  121. package/dist/src/utils/spinner.d.ts +0 -16
  122. package/dist/src/utils/spinner.d.ts.map +0 -1
  123. package/dist/src/utils/spinner.js +0 -88
  124. package/dist/src/utils/spinner.js.map +0 -1
  125. package/dist/src/utils/validation.d.ts +0 -12
  126. package/dist/src/utils/validation.d.ts.map +0 -1
  127. package/dist/src/utils/validation.js +0 -82
  128. package/dist/src/utils/validation.js.map +0 -1
  129. package/dist/templates/application-additions/.forgecartignore +0 -37
  130. package/dist/templates/application-additions/Procfile +0 -1
  131. package/dist/templates/application-additions/src/app/app.module.ts +0 -16
  132. package/dist/templates/application-additions/src/services/forgecart.service.ts +0 -62
  133. package/dist/templates/application-additions/src/services/index.ts +0 -2
  134. package/dist/templates/application-additions/src/services/product-event-listener.service.ts +0 -150
  135. package/dist/templates/application-e2e-additions/src/support/global-setup.ts +0 -16
  136. package/dist/templates/application-e2e-additions/src/support/test-setup.ts +0 -9
  137. package/dist/templates/storefront-additions/.forgecartignore +0 -64
  138. package/dist/templates/storefront-additions/Procfile +0 -1
  139. package/dist/templates/storefront-additions/package.json +0 -11
  140. package/dist/templates/storefront-additions/postcss.config.js +0 -5
  141. package/dist/templates/storefront-additions/src/app/cart/page.tsx +0 -77
  142. package/dist/templates/storefront-additions/src/app/global.css +0 -1
  143. package/dist/templates/storefront-additions/src/app/layout.tsx +0 -25
  144. package/dist/templates/storefront-additions/src/app/page.tsx +0 -43
  145. package/dist/templates/storefront-additions/src/components/AddToCartButton.tsx +0 -29
  146. package/dist/templates/storefront-additions/src/components/CartItem.tsx +0 -82
  147. package/dist/templates/storefront-additions/src/components/Header.tsx +0 -42
  148. package/dist/templates/storefront-additions/src/components/ProductCard.tsx +0 -57
  149. package/dist/templates/storefront-additions/src/components/QuantitySelector.tsx +0 -35
  150. package/dist/templates/storefront-additions/src/context/CartContext.tsx +0 -158
  151. package/dist/templates/storefront-additions/src/lib/forgecart.ts +0 -22
  152. package/dist/templates/storefront-e2e-additions/playwright.config.ts +0 -26
  153. package/dist/templates/storefront-e2e-additions/src/example.spec.ts +0 -11
  154. package/dist/templates/workspace/.nxignore +0 -2
  155. package/templates/application-additions/.forgecartignore +0 -37
  156. package/templates/application-additions/Procfile +0 -1
  157. package/templates/application-additions/src/app/app.module.ts +0 -16
  158. package/templates/application-additions/src/services/forgecart.service.ts +0 -62
  159. package/templates/application-additions/src/services/index.ts +0 -2
  160. package/templates/application-additions/src/services/product-event-listener.service.ts +0 -150
  161. package/templates/application-e2e-additions/src/support/global-setup.ts +0 -16
  162. package/templates/application-e2e-additions/src/support/test-setup.ts +0 -9
  163. package/templates/storefront-additions/.forgecartignore +0 -64
  164. package/templates/storefront-additions/Procfile +0 -1
  165. package/templates/storefront-additions/package.json +0 -11
  166. package/templates/storefront-additions/postcss.config.js +0 -5
  167. package/templates/storefront-additions/src/app/cart/page.tsx +0 -77
  168. package/templates/storefront-additions/src/app/global.css +0 -1
  169. package/templates/storefront-additions/src/app/layout.tsx +0 -25
  170. package/templates/storefront-additions/src/app/page.tsx +0 -43
  171. package/templates/storefront-additions/src/components/AddToCartButton.tsx +0 -29
  172. package/templates/storefront-additions/src/components/CartItem.tsx +0 -82
  173. package/templates/storefront-additions/src/components/Header.tsx +0 -42
  174. package/templates/storefront-additions/src/components/ProductCard.tsx +0 -57
  175. package/templates/storefront-additions/src/components/QuantitySelector.tsx +0 -35
  176. package/templates/storefront-additions/src/context/CartContext.tsx +0 -158
  177. package/templates/storefront-additions/src/lib/forgecart.ts +0 -22
  178. package/templates/storefront-additions/tailwind.config.js +0 -8
  179. package/templates/storefront-e2e-additions/playwright.config.ts +0 -26
  180. package/templates/storefront-e2e-additions/src/example.spec.ts +0 -11
  181. package/templates/workspace/.nxignore +0 -2
@@ -1,319 +1,191 @@
1
- import * as path from 'path';
2
- import * as fs from 'fs';
3
- import inquirer from 'inquirer';
1
+ import { mkdir, cp, readFile, rm, writeFile, stat } from 'node:fs/promises';
2
+ import { dirname, join, resolve } from 'node:path';
3
+ import { fileURLToPath } from 'node:url';
4
4
  import { Command } from 'commander';
5
- import logger from '../lib/logger.js';
6
- import { writeConfig, getDefaultConfig, configExists, readConfig, updateConfig, requireAuth, getGlobalApiUrl, } from '../lib/config.js';
7
- import { ForgecartApiClient } from '../lib/api-client.js';
8
- import { createNxWorkspace, generateNextApp, generateNestApp, installDependency, copyTemplateFiles, getCliTemplatesDir, addPackageScripts, appendEnvPatternsToGitignore, createEnvFile, DEFAULT_NX_VERSION, } from '../lib/nx-generator.js';
9
- import { isValidProjectName } from '../utils/validation.js';
10
- import { withSpinner } from '../utils/spinner.js';
11
- import { ensureStandaloneOutput } from '../lib/config-updater.js';
12
- export function createInitCommand() {
13
- const cmd = new Command('init')
14
- .description('Create a new ForgeCart project')
15
- .argument('[name]', 'Project name')
16
- .option('-t, --token <token>', 'ForgeCart channel token')
17
- .option('-a, --application', 'Include NestJS backend application')
18
- .option('--api-url <url>', 'ForgeCart API URL', 'https://api.forgecart.com')
19
- .option('--nx-version <version>', 'NX version to use', DEFAULT_NX_VERSION)
20
- .action(async (name, options) => {
21
- await initProject(name, options);
22
- });
23
- return cmd;
24
- }
25
- export function createInitApplicationCommand() {
26
- const cmd = new Command('init:application')
27
- .description('Add a NestJS backend application to an existing project')
28
- .action(async () => {
29
- await addApplication();
30
- });
31
- return cmd;
5
+ import { print } from '../output.js';
6
+ /** Default shop API base. Overridable via `--api-url`. */
7
+ export const DEFAULT_SHOP_API_URL = 'https://api.forgecart.com';
8
+ /**
9
+ * Environment variable naming a dependency-warmed storefront template — a copy
10
+ * of the bundled template with `node_modules` (and the generated
11
+ * `package-lock.json`) already installed. The workspace-pod image bakes one at
12
+ * build time (`docker/workspace-pod/Dockerfile`) and exports this variable so a
13
+ * pod scaffold copies warm dependencies instead of paying a cold `npm install`.
14
+ */
15
+ export const WORKSPACE_TEMPLATE_DIR_ENV = 'WORKSPACE_TEMPLATE_DIR';
16
+ /**
17
+ * Marker file, relative to the scaffolded storefront root, recording that
18
+ * `node_modules` was copied fully installed from a warmed template whose
19
+ * manifest matches this CLI's bundled template. Orchestrators (the agent's
20
+ * `ChannelWorkspaceService`) skip their `npm install` step when the marker is
21
+ * present right after a fresh scaffold; its absence always falls back to a
22
+ * regular install, so older images and cold scaffolds keep working unchanged.
23
+ */
24
+ export const DEPS_READY_MARKER_PATH = '.forgecart/deps-ready.json';
25
+ /**
26
+ * Absolute path to the bundled storefront scaffold.
27
+ *
28
+ * At runtime this file lives at `<pkg>/dist/src/commands/init.js`, so the
29
+ * `templates/` directory shipped alongside `dist/` is three levels up.
30
+ */
31
+ function getStorefrontTemplateDir() {
32
+ const here = dirname(fileURLToPath(import.meta.url));
33
+ return resolve(here, '..', '..', '..', 'templates', 'storefront');
32
34
  }
33
- async function initProject(name, options) {
34
- logger.title('ForgeCart Project Setup');
35
- // Check authentication first (set by `forgecart login`)
36
- const authToken = requireAuth();
37
- // Prompt for project name if not provided
38
- let projectName = name;
39
- if (!projectName) {
40
- const answers = await inquirer.prompt([
41
- {
42
- type: 'input',
43
- name: 'projectName',
44
- message: 'Project name:',
45
- validate: (input) => {
46
- if (!input)
47
- return 'Project name is required';
48
- if (!isValidProjectName(input)) {
49
- return 'Project name must start with a letter and contain only lowercase letters, numbers, and hyphens';
50
- }
51
- return true;
52
- },
53
- },
54
- ]);
55
- projectName = answers.projectName;
35
+ /** True if the path exists and is a directory. */
36
+ async function isDirectory(path) {
37
+ try {
38
+ const info = await stat(path);
39
+ return info.isDirectory();
56
40
  }
57
- // Validate project name
58
- if (!projectName || !isValidProjectName(projectName)) {
59
- logger.error('Invalid project name. Must start with a letter and contain only lowercase letters, numbers, and hyphens.');
60
- process.exit(1);
41
+ catch {
42
+ return false;
61
43
  }
62
- // Check if directory already exists
63
- const targetDir = path.join(process.cwd(), projectName);
64
- if (fs.existsSync(targetDir)) {
65
- logger.error(`Directory ${projectName} already exists`);
66
- process.exit(1);
44
+ }
45
+ /**
46
+ * Read a `package.json` and normalize it for content comparison. Returns null
47
+ * when the file is missing or not valid JSON — callers treat that as "manifests
48
+ * do not provably match", which always falls back to an install.
49
+ */
50
+ async function readNormalizedManifest(manifestPath) {
51
+ try {
52
+ return JSON.stringify(JSON.parse(await readFile(manifestPath, 'utf8')));
67
53
  }
68
- // Prompt for channel token if not provided
69
- let channelToken = options.channelToken;
70
- if (!channelToken) {
71
- const answers = await inquirer.prompt([
72
- {
73
- type: 'input',
74
- name: 'channelToken',
75
- message: 'ForgeCart channel token:',
76
- validate: (input) => {
77
- if (!input)
78
- return 'Channel token is required';
79
- return true;
80
- },
81
- },
82
- ]);
83
- channelToken = answers.channelToken;
54
+ catch {
55
+ return null;
84
56
  }
85
- // Validate channel token
86
- if (!channelToken) {
87
- logger.error('Channel token is required');
88
- process.exit(1);
57
+ }
58
+ /**
59
+ * Decide how to source the scaffold. The warmed template is used only when
60
+ * {@link WORKSPACE_TEMPLATE_DIR_ENV} points at a directory that actually
61
+ * contains an installed `node_modules`; full reuse (skipping the install)
62
+ * additionally requires its manifest to match the bundled template's, byte for
63
+ * semantic byte. Every failure mode degrades to the cold bundled path, so
64
+ * images without a warmed template — and machines where the variable is unset —
65
+ * behave exactly as before.
66
+ */
67
+ async function resolveScaffoldPlan(bundledTemplateDir) {
68
+ const bundled = { source: 'bundled', templateDir: bundledTemplateDir };
69
+ const warmedDir = process.env[WORKSPACE_TEMPLATE_DIR_ENV];
70
+ if (!warmedDir)
71
+ return bundled;
72
+ if (!(await isDirectory(warmedDir)))
73
+ return bundled;
74
+ const warmedNodeModulesDir = join(warmedDir, 'node_modules');
75
+ if (!(await isDirectory(warmedNodeModulesDir)))
76
+ return bundled;
77
+ const warmedManifest = await readNormalizedManifest(join(warmedDir, 'package.json'));
78
+ const bundledManifest = await readNormalizedManifest(join(bundledTemplateDir, 'package.json'));
79
+ if (!warmedManifest || !bundledManifest || warmedManifest !== bundledManifest) {
80
+ return {
81
+ source: 'bundled-with-warmed-modules',
82
+ templateDir: bundledTemplateDir,
83
+ warmedNodeModulesDir,
84
+ };
89
85
  }
90
- const apiUrl = options.apiUrl || getGlobalApiUrl();
91
- const apiClient = new ForgecartApiClient(apiUrl, channelToken, authToken);
92
- await withSpinner('Validating channel token...', 'Channel token validated', 'Invalid channel token', async () => {
93
- const isValid = await apiClient.validateChannelToken();
94
- if (!isValid) {
95
- throw new Error('Invalid channel token');
96
- }
97
- });
98
- // Prompt for application inclusion if not specified
99
- let withApplication = options.withApplication;
100
- if (withApplication === undefined) {
101
- const answers = await inquirer.prompt([
102
- {
103
- type: 'confirm',
104
- name: 'withApplication',
105
- message: 'Include NestJS backend application?',
106
- default: false,
107
- },
108
- ]);
109
- withApplication = answers.withApplication;
86
+ return { source: 'warmed', templateDir: warmedDir };
87
+ }
88
+ /**
89
+ * Record or clear — the dependencies-ready marker. It is written only for a
90
+ * full warmed scaffold; any other plan removes a marker a previous scaffold may
91
+ * have left in the same directory, so an orchestrator never skips its install
92
+ * based on stale state.
93
+ */
94
+ async function writeDepsReadyMarker(targetDir, plan) {
95
+ const markerPath = join(targetDir, DEPS_READY_MARKER_PATH);
96
+ if (plan.source !== 'warmed') {
97
+ await rm(markerPath, { force: true });
98
+ return;
110
99
  }
111
- // Create NX workspace
112
- await withSpinner('Creating NX workspace...', 'NX workspace created', 'Failed to create NX workspace', async () => {
113
- const success = await createNxWorkspace(projectName, process.cwd(), options.nxVersion);
114
- if (!success) {
115
- throw new Error('Failed to create NX workspace');
116
- }
117
- });
118
- // Generate Next.js storefront
119
- await withSpinner('Generating Next.js storefront...', 'Storefront generated', 'Failed to generate storefront', async () => {
120
- const success = await generateNextApp('storefront', targetDir);
121
- if (!success) {
122
- throw new Error('Failed to generate storefront');
123
- }
124
- });
125
- // Install @forgecart/sdk
126
- await withSpinner('Installing @forgecart/sdk...', '@forgecart/sdk installed', 'Failed to install SDK', async () => {
127
- const success = await installDependency('@forgecart/sdk@^1.2.0', targetDir);
128
- if (!success) {
129
- throw new Error('Failed to install SDK');
130
- }
131
- });
132
- // Install Tailwind CSS
133
- await withSpinner('Installing Tailwind CSS...', 'Tailwind CSS installed', 'Failed to install Tailwind CSS', async () => {
134
- const success = await installDependency('tailwindcss @tailwindcss/postcss postcss autoprefixer -D', targetDir);
135
- if (!success) {
136
- throw new Error('Failed to install Tailwind CSS');
137
- }
138
- });
139
- // Copy storefront template additions
140
- logger.info('Applying storefront customizations...');
141
- const templatesDir = getCliTemplatesDir();
142
- const storefrontAdditionsDir = path.join(templatesDir, 'storefront-additions');
143
- const storefrontDir = path.join(targetDir, 'apps', 'storefront');
144
- copyTemplateFiles(storefrontAdditionsDir, storefrontDir);
145
- createEnvFile(storefrontDir, 'storefront', {
100
+ const marker = {
101
+ warmedFrom: plan.templateDir,
102
+ warmedAt: new Date().toISOString(),
103
+ };
104
+ await writeFile(markerPath, `${JSON.stringify(marker, null, 2)}\n`, 'utf8');
105
+ }
106
+ /** Build the `.forgecart/config.json` payload. */
107
+ function buildConfig(channelToken, options) {
108
+ return {
109
+ version: '2.0',
146
110
  channelToken,
147
- apiUrl,
148
- });
149
- // Configure storefront dev port to 4200
150
- const storefrontProjectJsonPath = path.join(storefrontDir, 'project.json');
151
- if (fs.existsSync(storefrontProjectJsonPath)) {
152
- const projectJson = JSON.parse(fs.readFileSync(storefrontProjectJsonPath, 'utf-8'));
153
- if (!projectJson.targets) {
154
- projectJson.targets = {};
155
- }
156
- if (!projectJson.targets.dev) {
157
- projectJson.targets.dev = {};
158
- }
159
- if (!projectJson.targets.dev.options) {
160
- projectJson.targets.dev.options = {};
161
- }
162
- projectJson.targets.dev.options.port = 4200;
163
- fs.writeFileSync(storefrontProjectJsonPath, JSON.stringify(projectJson, null, 2));
164
- logger.debug('Configured storefront dev port to 4200');
165
- }
166
- logger.success('Storefront customizations applied');
167
- // Copy storefront E2E template additions
168
- const storefrontE2eAdditionsDir = path.join(templatesDir, 'storefront-e2e-additions');
169
- const storefrontE2eDir = path.join(targetDir, 'apps', 'storefront-e2e');
170
- copyTemplateFiles(storefrontE2eAdditionsDir, storefrontE2eDir);
171
- logger.success('E2E test customizations applied');
172
- // Add .env patterns to .gitignore
173
- appendEnvPatternsToGitignore(targetDir);
174
- // Configure standalone output for deployment
175
- logger.info('Configuring standalone output...');
176
- const standaloneConfigured = ensureStandaloneOutput(storefrontDir);
177
- if (standaloneConfigured) {
178
- logger.success('Standalone output configured in next.config.js');
179
- }
180
- else {
181
- logger.warn('Could not auto-configure standalone output. Please add output: "standalone" to next.config.js manually.');
182
- }
183
- // Generate NestJS application if requested
184
- if (withApplication) {
185
- await withSpinner('Generating NestJS application...', 'Application generated', 'Failed to generate application', async () => {
186
- const success = await generateNestApp('application', targetDir);
187
- if (!success) {
188
- throw new Error('Failed to generate application');
189
- }
190
- });
191
- // Install @nestjs/config for environment variable management
192
- await withSpinner('Installing @nestjs/config...', '@nestjs/config installed', 'Failed to install @nestjs/config', async () => {
193
- const success = await installDependency('@nestjs/config', targetDir);
194
- if (!success) {
195
- throw new Error('Failed to install @nestjs/config');
196
- }
197
- });
198
- // Copy application template additions
199
- logger.info('Applying application customizations...');
200
- const applicationAdditionsDir = path.join(templatesDir, 'application-additions');
201
- const applicationDir = path.join(targetDir, 'apps', 'application');
202
- copyTemplateFiles(applicationAdditionsDir, applicationDir);
203
- createEnvFile(applicationDir, 'application', {
204
- channelToken,
205
- apiUrl,
206
- });
207
- logger.success('Application customizations applied');
208
- // Copy application E2E template additions
209
- const applicationE2eAdditionsDir = path.join(templatesDir, 'application-e2e-additions');
210
- const applicationE2eDir = path.join(targetDir, 'apps', 'application-e2e');
211
- copyTemplateFiles(applicationE2eAdditionsDir, applicationE2eDir);
212
- logger.success('Application E2E customizations applied');
111
+ apiUrl: options.apiUrl,
112
+ hasApplication: options.application ?? false,
113
+ storefrontPath: '.',
114
+ };
115
+ }
116
+ /** Build the `.env.local` contents for the storefront SDK client. */
117
+ function buildEnvLocal(channelToken, apiUrl) {
118
+ return [
119
+ `FORGECART_CHANNEL_TOKEN=${channelToken}`,
120
+ `FORGECART_SHOP_API_URL=${apiUrl}`,
121
+ '',
122
+ ].join('\n');
123
+ }
124
+ /** Print the post-scaffold next steps. */
125
+ function printNextSteps(targetDir, application, depsInstalled) {
126
+ print('');
127
+ print(depsInstalled
128
+ ? 'Storefront scaffolded successfully (dependencies pre-installed from the warmed template).'
129
+ : 'Storefront scaffolded successfully.');
130
+ print('');
131
+ print('Next steps:');
132
+ print(` cd ${targetDir}`);
133
+ if (!depsInstalled) {
134
+ print(' npm install');
213
135
  }
214
- // Add convenience scripts to package.json
215
- addPackageScripts(targetDir, withApplication || false);
216
- // Create ForgeCart config (authToken is stored globally in ~/.forgecart/)
217
- const config = getDefaultConfig();
218
- config.channelToken = channelToken;
219
- config.apiUrl = apiUrl;
220
- config.hasApplication = withApplication || false;
221
- config.storefrontPath = 'apps/storefront';
222
- if (withApplication) {
223
- config.applicationPath = 'apps/application';
136
+ print(' npm run dev');
137
+ print('');
138
+ if (application) {
139
+ print('Note: --application was requested. A NestJS application scaffold arrives ' +
140
+ 'in a later phase (TODO).');
141
+ print('');
224
142
  }
225
- writeConfig(config, targetDir);
226
- logger.success('ForgeCart configuration created');
227
- // Success message
228
- logger.newline();
229
- logger.box(`Project "${projectName}" created successfully!
230
-
231
- Next steps:
232
- cd ${projectName}
233
- forgecart deploy
234
-
235
- Your storefront will be available at:
236
- apps/storefront/` +
237
- (withApplication
238
- ? `
239
-
240
- Your application will be available at:
241
- apps/application/`
242
- : ''));
243
- // Cleanup and exit
244
- apiClient.dispose();
245
- process.exit(0);
246
143
  }
247
- async function addApplication() {
248
- logger.title('Add NestJS Application');
249
- // Check if we're in a ForgeCart project
250
- if (!configExists()) {
251
- logger.error('Not in a ForgeCart project. Run "forgecart init" first.');
252
- process.exit(1);
144
+ /**
145
+ * Run `forgecart init`.
146
+ *
147
+ * Resolves the target directory, scaffolds the storefront from the warmed
148
+ * template when one is available (see {@link resolveScaffoldPlan}) or the
149
+ * bundled template otherwise, writes the ForgeCart config and `.env.local`, and
150
+ * prints next steps. Throws a clear Error on any failure (missing token,
151
+ * missing template, copy failure).
152
+ */
153
+ export async function runInit(name, options) {
154
+ const channelToken = options.token?.trim();
155
+ if (!channelToken) {
156
+ throw new Error('A channel token is required. Pass it with --token <token> (or -t <token>).');
253
157
  }
254
- const config = readConfig();
255
- if (!config) {
256
- logger.error('Invalid ForgeCart configuration');
257
- process.exit(1);
158
+ const targetDir = name ? resolve(process.cwd(), name) : process.cwd();
159
+ const templateDir = getStorefrontTemplateDir();
160
+ if (!(await isDirectory(templateDir))) {
161
+ throw new Error(`Storefront template not found at ${templateDir}.`);
258
162
  }
259
- // Check if application already exists
260
- if (config.hasApplication) {
261
- logger.error('Application already exists in this project');
262
- process.exit(1);
163
+ const plan = await resolveScaffoldPlan(templateDir);
164
+ await mkdir(targetDir, { recursive: true });
165
+ await cp(plan.templateDir, targetDir, { recursive: true });
166
+ if (plan.source === 'bundled-with-warmed-modules') {
167
+ await cp(plan.warmedNodeModulesDir, join(targetDir, 'node_modules'), {
168
+ recursive: true,
169
+ });
263
170
  }
264
- const projectRoot = process.cwd();
265
- // Generate NestJS application
266
- await withSpinner('Generating NestJS application...', 'Application generated', 'Failed to generate application', async () => {
267
- const success = await generateNestApp('application', projectRoot);
268
- if (!success) {
269
- throw new Error('Failed to generate application');
270
- }
271
- });
272
- // Install @forgecart/sdk in application
273
- await withSpinner('Installing @forgecart/sdk...', '@forgecart/sdk installed', 'Failed to install SDK', async () => {
274
- const success = await installDependency('@forgecart/sdk@^1.2.0', projectRoot);
275
- if (!success) {
276
- throw new Error('Failed to install SDK');
277
- }
278
- });
279
- // Install @nestjs/config for environment variable management
280
- await withSpinner('Installing @nestjs/config...', '@nestjs/config installed', 'Failed to install @nestjs/config', async () => {
281
- const success = await installDependency('@nestjs/config', projectRoot);
282
- if (!success) {
283
- throw new Error('Failed to install @nestjs/config');
284
- }
285
- });
286
- // Copy application template additions
287
- logger.info('Applying application customizations...');
288
- const templatesDir = getCliTemplatesDir();
289
- const applicationAdditionsDir = path.join(templatesDir, 'application-additions');
290
- const applicationDir = path.join(projectRoot, 'apps', 'application');
291
- copyTemplateFiles(applicationAdditionsDir, applicationDir);
292
- createEnvFile(applicationDir, 'application', {
293
- channelToken: config.channelToken,
294
- apiUrl: config.apiUrl,
295
- });
296
- logger.success('Application customizations applied');
297
- // Copy application E2E template additions
298
- const applicationE2eAdditionsDir = path.join(templatesDir, 'application-e2e-additions');
299
- const applicationE2eDir = path.join(projectRoot, 'apps', 'application-e2e');
300
- copyTemplateFiles(applicationE2eAdditionsDir, applicationE2eDir);
301
- logger.success('Application E2E customizations applied');
302
- // Update config
303
- updateConfig({
304
- hasApplication: true,
305
- applicationPath: 'apps/application',
171
+ const configDir = join(targetDir, '.forgecart');
172
+ await mkdir(configDir, { recursive: true });
173
+ const config = buildConfig(channelToken, options);
174
+ await writeFile(join(configDir, 'config.json'), `${JSON.stringify(config, null, 2)}\n`, 'utf8');
175
+ await writeFile(join(targetDir, '.env.local'), buildEnvLocal(channelToken, options.apiUrl), 'utf8');
176
+ await writeDepsReadyMarker(targetDir, plan);
177
+ printNextSteps(name ?? '.', config.hasApplication, plan.source === 'warmed');
178
+ }
179
+ /** Build the `init [name]` command. */
180
+ export function createInitCommand() {
181
+ return new Command('init')
182
+ .description('Scaffold a ForgeCart storefront in the target directory')
183
+ .argument('[name]', 'Target directory name (defaults to the current directory)')
184
+ .option('-t, --token <token>', 'ForgeCart channel token (required)')
185
+ .option('--api-url <url>', 'Shop API base URL written to the storefront environment', DEFAULT_SHOP_API_URL)
186
+ .option('-a, --application', 'Also scaffold a NestJS application (TODO: next phase)')
187
+ .action(async (name, options) => {
188
+ await runInit(name, options);
306
189
  });
307
- logger.success('Configuration updated');
308
- logger.newline();
309
- logger.box(`NestJS application added successfully!
310
-
311
- Your application is available at:
312
- apps/application/
313
-
314
- To deploy:
315
- cd apps/application
316
- forgecart deploy`);
317
- process.exit(0);
318
190
  }
319
191
  //# sourceMappingURL=init.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/commands/init.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { Command } from 'commander';
2
+ /** `init:application` — add a NestJS application to an existing project. */
3
+ export declare function createInitApplicationCommand(): Command;
4
+ /** `deploy` — deploy the current project. */
5
+ export declare function createDeployCommand(): Command;
6
+ /** `list` — list deployments for the channel. */
7
+ export declare function createListCommand(): Command;
8
+ /** `status [type]` — show deployment status. */
9
+ export declare function createStatusCommand(): Command;
10
+ /** `logs [type]` — view deployment logs. */
11
+ export declare function createLogsCommand(): Command;
12
+ /** `delete <type>` — delete a deployment. */
13
+ export declare function createDeleteCommand(): Command;
14
+ /** `scale <type> <instances>` — scale a deployment. */
15
+ export declare function createScaleCommand(): Command;
16
+ /** `env` — manage environment variables (get/set/unset). */
17
+ export declare function createEnvCommand(): Command;
18
+ /** `whoami` — show current channel information. */
19
+ export declare function createWhoamiCommand(): Command;