workspace-manager-cli 1.0.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 (50) hide show
  1. package/README.md +339 -0
  2. package/dist/build.d.ts +19 -0
  3. package/dist/build.d.ts.map +1 -0
  4. package/dist/build.js +384 -0
  5. package/dist/build.js.map +1 -0
  6. package/dist/bundler/build-bundler.d.ts +9 -0
  7. package/dist/bundler/build-bundler.d.ts.map +1 -0
  8. package/dist/bundler/build-bundler.js +218 -0
  9. package/dist/bundler/build-bundler.js.map +1 -0
  10. package/dist/bundler/package-merger.d.ts +21 -0
  11. package/dist/bundler/package-merger.d.ts.map +1 -0
  12. package/dist/bundler/package-merger.js +192 -0
  13. package/dist/bundler/package-merger.js.map +1 -0
  14. package/dist/bundler/vite-generator.d.ts +14 -0
  15. package/dist/bundler/vite-generator.d.ts.map +1 -0
  16. package/dist/bundler/vite-generator.js +186 -0
  17. package/dist/bundler/vite-generator.js.map +1 -0
  18. package/dist/config.d.ts +250 -0
  19. package/dist/config.d.ts.map +1 -0
  20. package/dist/config.js +268 -0
  21. package/dist/config.js.map +1 -0
  22. package/dist/copy.d.ts +9 -0
  23. package/dist/copy.d.ts.map +1 -0
  24. package/dist/copy.js +56 -0
  25. package/dist/copy.js.map +1 -0
  26. package/dist/git.d.ts +76 -0
  27. package/dist/git.d.ts.map +1 -0
  28. package/dist/git.js +377 -0
  29. package/dist/git.js.map +1 -0
  30. package/dist/index-update-base.d.ts +2 -0
  31. package/dist/index-update-base.d.ts.map +1 -0
  32. package/dist/index-update-base.js +76 -0
  33. package/dist/index-update-base.js.map +1 -0
  34. package/dist/index.d.ts +3 -0
  35. package/dist/index.d.ts.map +1 -0
  36. package/dist/index.js +626 -0
  37. package/dist/index.js.map +1 -0
  38. package/dist/lock.d.ts +39 -0
  39. package/dist/lock.d.ts.map +1 -0
  40. package/dist/lock.js +91 -0
  41. package/dist/lock.js.map +1 -0
  42. package/dist/logger.d.ts +42 -0
  43. package/dist/logger.d.ts.map +1 -0
  44. package/dist/logger.js +90 -0
  45. package/dist/logger.js.map +1 -0
  46. package/dist/status.d.ts +23 -0
  47. package/dist/status.d.ts.map +1 -0
  48. package/dist/status.js +158 -0
  49. package/dist/status.js.map +1 -0
  50. package/package.json +47 -0
package/dist/build.js ADDED
@@ -0,0 +1,384 @@
1
+ import fs from "fs-extra";
2
+ import path from "path";
3
+ import { spawn } from "child_process";
4
+ import { getCorePath, getBasePath, isGitRepo } from "./git.js";
5
+ /**
6
+ * Default excludes for copying
7
+ */
8
+ const DEFAULT_EXCLUDES = [
9
+ ".git",
10
+ ".git/**",
11
+ "node_modules",
12
+ "node_modules/**",
13
+ ".DS_Store",
14
+ "Thumbs.db",
15
+ ];
16
+ // copyWithExcludes moved to src/copy.ts
17
+ import { copyWithExcludes } from "./copy.js";
18
+ /**
19
+ * Remove a path with retries on transient errors (EBUSY/EPERM/ENOTEMPTY).
20
+ * If removal still fails after retries, attempt to rename (move) the dir so
21
+ * the build can proceed and the user can clean up the stale folder manually.
22
+ */
23
+ async function removePathWithRetries(target, logger, attempts = 5) {
24
+ for (let i = 0; i < attempts; i++) {
25
+ try {
26
+ await fs.remove(target);
27
+ return;
28
+ }
29
+ catch (err) {
30
+ const code = err && err.code;
31
+ if (code === "EBUSY" || code === "EPERM" || code === "ENOTEMPTY") {
32
+ const wait = Math.min(1000 * 2 ** i, 5000);
33
+ logger.warn(`Remove failed (attempt ${i + 1}/${attempts}): ${code}. Retrying in ${wait}ms...`);
34
+ await new Promise((r) => setTimeout(r, wait));
35
+ continue;
36
+ }
37
+ // Non-transient error - rethrow
38
+ throw err;
39
+ }
40
+ }
41
+ // Final fallback: attempt to rename folder for later manual cleanup
42
+ try {
43
+ const tmp = `${target}.wmc-deleted-${Date.now()}`;
44
+ await fs.move(target, tmp, { overwrite: true });
45
+ logger.warn(`Could not remove '${target}' after ${attempts} attempts. Renamed to '${tmp}' for manual cleanup.`);
46
+ return;
47
+ }
48
+ catch (err) {
49
+ logger.error(`Failed to remove or rename '${target}'. Please close programs that may be locking files (editors, terminals), ensure no Node processes are using the directory, then remove it manually. Error: ${err.message}`);
50
+ throw err;
51
+ }
52
+ }
53
+ /**
54
+ * Run a shell command in a directory
55
+ */
56
+ async function runCommand(command, cwd, logger) {
57
+ return new Promise((resolve) => {
58
+ logger.info(`Running: ${command}`);
59
+ // Parse command - handle cross-platform
60
+ const isWindows = process.platform === "win32";
61
+ const shell = isWindows ? "cmd.exe" : "/bin/sh";
62
+ const shellArgs = isWindows ? ["/c", command] : ["-c", command];
63
+ const child = spawn(shell, shellArgs, {
64
+ cwd,
65
+ stdio: "inherit",
66
+ env: { ...process.env },
67
+ });
68
+ child.on("close", (code) => {
69
+ if (code === 0) {
70
+ logger.success(`Command completed successfully`);
71
+ resolve(true);
72
+ }
73
+ else {
74
+ logger.error(`Command failed with exit code ${code}`);
75
+ resolve(false);
76
+ }
77
+ });
78
+ child.on("error", (err) => {
79
+ logger.error(`Command failed: ${err.message}`);
80
+ resolve(false);
81
+ });
82
+ });
83
+ }
84
+ /**
85
+ * Build the workspace by copying layers based on project type
86
+ */
87
+ export async function buildWorkspace(config, logger, options = {}) {
88
+ const { noInstall = false, dryRun = false } = options;
89
+ const actions = [];
90
+ const result = {
91
+ success: false,
92
+ baseFilesCopied: 0,
93
+ coreFilesCopied: 0,
94
+ customFilesCopied: 0,
95
+ installRan: false,
96
+ actions,
97
+ };
98
+ const excludes = config.excludes ?? [];
99
+ // Ensure mount paths exist in case caller passed a partial config (tests)
100
+ if (!config.coreMountPath) {
101
+ config.coreMountPath = path.join(config.workspacePath, "src", "core");
102
+ }
103
+ if (!config.customMountPath) {
104
+ config.customMountPath = path.join(config.workspacePath, "src", "core", "custom");
105
+ }
106
+ // Excludes visibility
107
+ const excludesDisplay = excludes.length > 0 ? excludes.join(", ") : "(none)";
108
+ actions.push(`Excludes: ${excludesDisplay}`);
109
+ logger.info(`Building workspace (type: ${config.projectType})`);
110
+ if (dryRun) {
111
+ logger.info(`Effective excludes: ${excludesDisplay}`);
112
+ }
113
+ // Step 1: Wipe workspace directory if exists (ONLY if not root)
114
+ const isRoot = path.relative(config.projectRoot, config.workspacePath) === "";
115
+ if (!isRoot && (await fs.pathExists(config.workspacePath))) {
116
+ actions.push(`Remove existing workspace: ${config.workspacePath}`);
117
+ if (!dryRun) {
118
+ logger.info(`Removing existing workspace: ${config.workspacePath}`);
119
+ // Robust removal with retries on Windows EBUSY/EPERM
120
+ await removePathWithRetries(config.workspacePath, logger);
121
+ }
122
+ else {
123
+ logger.debug(`[dry-run] Remove: ${config.workspacePath}`);
124
+ }
125
+ }
126
+ // Step 2: Create workspace directory
127
+ actions.push(`Create workspace: ${config.workspacePath}`);
128
+ if (!dryRun) {
129
+ await fs.ensureDir(config.workspacePath);
130
+ }
131
+ // Build based on project type
132
+ switch (config.projectType) {
133
+ case "core-custom":
134
+ // Remote core + local custom
135
+ await buildCoreCustom(config, logger, result, actions, excludes, dryRun);
136
+ break;
137
+ case "base-core":
138
+ // Remote base + local core
139
+ await buildBaseCore(config, logger, result, actions, excludes, dryRun);
140
+ break;
141
+ case "base-core-custom":
142
+ // Remote base + remote core + local custom
143
+ await buildBaseCoreCustom(config, logger, result, actions, excludes, dryRun);
144
+ break;
145
+ }
146
+ if (!result.success) {
147
+ if (dryRun) {
148
+ // Even if build steps failed (e.g., missing repos), show planned actions including .gitignore in dry-run
149
+ actions.push("Create .gitignore");
150
+ logger.debug("[dry-run] Create .gitignore");
151
+ logger.info("Dry run complete. Actions that would be performed:");
152
+ actions.forEach((action) => logger.info(` - ${action}`));
153
+ }
154
+ return result;
155
+ }
156
+ // Create .gitignore (before install) - save it in project root
157
+ actions.push("Create .gitignore");
158
+ const gitignorePath = path.join(config.projectRoot, ".gitignore");
159
+ // Minimal, fixed .gitignore (workspace and cache)
160
+ const gitignoreContent = `# Workspace CLI
161
+ workspace/
162
+ .wmc-cache/
163
+ `;
164
+ if (!dryRun) {
165
+ await fs.writeFile(gitignorePath, gitignoreContent, "utf-8");
166
+ logger.info(`Created .gitignore at ${gitignorePath}`);
167
+ }
168
+ else {
169
+ logger.debug(`[dry-run] Create .gitignore at ${gitignorePath}`);
170
+ }
171
+ // Run install command
172
+ if (!noInstall && config.install.command) {
173
+ actions.push(`Run install: ${config.install.command}`);
174
+ if (!dryRun) {
175
+ const installSuccess = await runCommand(config.install.command, config.workspacePath, logger);
176
+ result.installRan = true;
177
+ if (!installSuccess) {
178
+ logger.error("Install command failed");
179
+ result.success = false;
180
+ return result;
181
+ }
182
+ }
183
+ else {
184
+ logger.debug(`[dry-run] Install: ${config.install.command}`);
185
+ }
186
+ }
187
+ else if (noInstall) {
188
+ actions.push("Skip install (--no-install)");
189
+ logger.info("Skipping install step");
190
+ }
191
+ if (dryRun) {
192
+ logger.info("Dry run complete. Actions that would be performed:");
193
+ actions.forEach((action) => logger.info(` - ${action}`));
194
+ }
195
+ else {
196
+ logger.success("Workspace build complete!");
197
+ }
198
+ return result;
199
+ }
200
+ /**
201
+ * Build for core-custom type: Remote core (as base) + local custom
202
+ */
203
+ async function buildCoreCustom(config, logger, result, actions, excludes, dryRun) {
204
+ const corePath = getCorePath(config);
205
+ // If explicit core source override or local core is configured, accept non-git directories
206
+ const isRemoteCore = !!(config.core && config.core.url);
207
+ const isLocalCoreSource = !!config.coreSrcPath || !isRemoteCore;
208
+ if (!corePath || !(await fs.pathExists(corePath))) {
209
+ logger.error(`Core source not found at ${corePath}.`);
210
+ return;
211
+ }
212
+ if (!isLocalCoreSource && !(await isGitRepo(corePath))) {
213
+ logger.error(`Core repository not found at ${corePath}. Run 'init' first.`);
214
+ return;
215
+ }
216
+ // Surface the core source being used for visibility
217
+ if (config.coreSrcPath) {
218
+ actions.push(`Core source: ${config.coreSrcPath}`);
219
+ if (!dryRun) {
220
+ logger.info(`Using explicit core source: ${config.coreSrcPath}`);
221
+ }
222
+ else {
223
+ logger.debug(`[dry-run] Core source: ${config.coreSrcPath}`);
224
+ }
225
+ }
226
+ // Step 1: Copy core contents (entire project) to workspace root
227
+ const coreLabel = config.core && "name" in config.core ? config.core.name : "core";
228
+ actions.push(`Copy core contents from ${coreLabel} (${corePath}) to ${config.workspacePath}`);
229
+ result.coreFilesCopied = await copyWithExcludes(corePath, config.workspacePath, excludes, logger, dryRun);
230
+ if (!dryRun) {
231
+ logger.success(`Copied ${result.coreFilesCopied} files from core`);
232
+ }
233
+ // Step 2: Symlink custom directory to src/custom
234
+ const customMountPath = path.join(config.workspacePath, "src", "custom");
235
+ if (config.customPath && (await fs.pathExists(config.customPath))) {
236
+ actions.push(`Symlink custom: ${config.customDir || config.custom?.path} -> ${customMountPath}`);
237
+ if (!dryRun) {
238
+ // Remove existing custom directory/symlink if exists
239
+ if (await fs.pathExists(customMountPath)) {
240
+ await fs.remove(customMountPath);
241
+ }
242
+ // Ensure parent directory exists
243
+ await fs.ensureDir(path.dirname(customMountPath));
244
+ // Create symlink from workspace to custom source
245
+ const absoluteCustomPath = path.resolve(config.projectRoot, config.customPath);
246
+ await fs.symlink(absoluteCustomPath, customMountPath, "junction");
247
+ logger.success(`Created symlink: ${customMountPath} -> ${absoluteCustomPath}`);
248
+ result.customFilesCopied = 1; // Indicate symlink created
249
+ }
250
+ else {
251
+ logger.debug(`[dry-run] Would create symlink: ${customMountPath}`);
252
+ }
253
+ }
254
+ else if (config.customPath) {
255
+ logger.warn(`Custom directory not found: ${config.customPath}`);
256
+ }
257
+ result.success = true;
258
+ }
259
+ /**
260
+ * Build for base-core type: Remote base + local core
261
+ */
262
+ async function buildBaseCore(config, logger, result, actions, excludes, dryRun) {
263
+ const basePath = getBasePath(config);
264
+ // Verify base is available
265
+ if (!basePath || !(await isGitRepo(basePath))) {
266
+ logger.error(`Base repository not found at ${basePath}. Run 'init' first.`);
267
+ return;
268
+ }
269
+ // Step 1: Copy base contents to workspace root
270
+ actions.push(`Copy base contents to ${config.workspacePath}`);
271
+ result.baseFilesCopied = await copyWithExcludes(basePath, config.workspacePath, excludes, logger, dryRun);
272
+ if (!dryRun) {
273
+ logger.success(`Copied ${result.baseFilesCopied} files from base`);
274
+ }
275
+ // Step 2: Overlay local core into src/core (via symlink)
276
+ if (config.coreLocalPath && (await fs.pathExists(config.coreLocalPath))) {
277
+ actions.push(`Overlay core: ${config.coreDir} -> ${config.coreMountPath}`);
278
+ if (!dryRun) {
279
+ // Remove existing core directory/symlink if exists
280
+ if (await fs.pathExists(config.coreMountPath)) {
281
+ await fs.remove(config.coreMountPath);
282
+ }
283
+ // Ensure parent directory exists
284
+ await fs.ensureDir(path.dirname(config.coreMountPath));
285
+ // Create symlink from workspace to local core source
286
+ const absoluteCorePath = path.resolve(config.projectRoot, config.coreLocalPath);
287
+ await fs.symlink(absoluteCorePath, config.coreMountPath, "junction");
288
+ logger.success(`Created symlink: ${config.coreMountPath} -> ${absoluteCorePath}`);
289
+ result.coreFilesCopied = 1; // Indicate symlink created
290
+ }
291
+ else {
292
+ logger.debug(`[dry-run] Would create symlink: ${config.coreMountPath}`);
293
+ }
294
+ }
295
+ else if (config.coreLocalPath) {
296
+ logger.warn(`Local core directory not found: ${config.coreLocalPath}`);
297
+ }
298
+ result.success = true;
299
+ }
300
+ /**
301
+ * Build for base-core-custom type: Remote base + remote core + local custom
302
+ */
303
+ async function buildBaseCoreCustom(config, logger, result, actions, excludes, dryRun) {
304
+ const basePath = getBasePath(config);
305
+ const corePath = getCorePath(config);
306
+ // Verify base is available
307
+ if (!basePath || !(await isGitRepo(basePath))) {
308
+ logger.error(`Base repository not found at ${basePath}. Run 'init' first.`);
309
+ return;
310
+ }
311
+ // Verify core is available
312
+ if (!(await isGitRepo(corePath))) {
313
+ logger.error(`Core repository not found at ${corePath}. Run 'init' first.`);
314
+ return;
315
+ }
316
+ // Step 1: Copy base contents to workspace root
317
+ actions.push(`Copy base contents to ${config.workspacePath}`);
318
+ result.baseFilesCopied = await copyWithExcludes(basePath, config.workspacePath, excludes, logger, dryRun);
319
+ if (!dryRun) {
320
+ logger.success(`Copied ${result.baseFilesCopied} files from base`);
321
+ }
322
+ // Step 2: Overlay remote core to src/core (explicit override wins)
323
+ let coreSrcPath;
324
+ if (config.coreSrcPath) {
325
+ coreSrcPath = config.coreSrcPath;
326
+ // Surface chosen core source as an action for dry-run visibility
327
+ actions.push(`Core source: ${coreSrcPath}`);
328
+ logger.info(`Using explicit core source: ${coreSrcPath}`);
329
+ }
330
+ else {
331
+ coreSrcPath = path.join(corePath, "src", "core");
332
+ // Fallback: some repos nest the project in a top-level folder named after the repo
333
+ if (!(await fs.pathExists(coreSrcPath)) &&
334
+ config.core &&
335
+ config.core.name) {
336
+ const altNestedSrc = path.join(corePath, config.core.name, "src", "core");
337
+ const altRoot = path.join(corePath, config.core.name);
338
+ if (await fs.pathExists(altNestedSrc)) {
339
+ coreSrcPath = altNestedSrc;
340
+ logger.info(`Using nested core path: ${coreSrcPath}`);
341
+ }
342
+ else if (await fs.pathExists(altRoot)) {
343
+ coreSrcPath = altRoot;
344
+ logger.info(`Using project-root as core source: ${coreSrcPath}`);
345
+ }
346
+ else {
347
+ logger.warn(`Core source not found at ${path.join(corePath, "src", "core")} or fallback locations`);
348
+ }
349
+ }
350
+ }
351
+ actions.push(`Overlay core: ${coreSrcPath} -> ${config.coreMountPath}`);
352
+ if (!dryRun) {
353
+ await fs.ensureDir(config.coreMountPath);
354
+ }
355
+ result.coreFilesCopied = await copyWithExcludes(coreSrcPath, config.coreMountPath, excludes, logger, dryRun);
356
+ if (!dryRun) {
357
+ logger.success(`Copied ${result.coreFilesCopied} files from core`);
358
+ }
359
+ // Step 3: Symlink custom to src/core/custom
360
+ if (config.customPath && (await fs.pathExists(config.customPath))) {
361
+ actions.push(`Symlink custom: ${config.customDir} -> ${config.customMountPath}`);
362
+ if (!dryRun) {
363
+ // Remove existing custom directory/symlink if exists
364
+ if (await fs.pathExists(config.customMountPath)) {
365
+ await fs.remove(config.customMountPath);
366
+ }
367
+ // Ensure parent directory exists
368
+ await fs.ensureDir(path.dirname(config.customMountPath));
369
+ // Create symlink from workspace to custom source
370
+ const absoluteCustomPath = path.resolve(config.projectRoot, config.customPath);
371
+ await fs.symlink(absoluteCustomPath, config.customMountPath, "junction");
372
+ logger.success(`Created symlink: ${config.customMountPath} -> ${absoluteCustomPath}`);
373
+ result.customFilesCopied = 1; // Indicate symlink created
374
+ }
375
+ else {
376
+ logger.debug(`[dry-run] Would create symlink: ${config.customMountPath}`);
377
+ }
378
+ }
379
+ else if (config.customPath) {
380
+ logger.warn(`Custom directory not found: ${config.customPath}`);
381
+ }
382
+ result.success = true;
383
+ }
384
+ //# sourceMappingURL=build.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build.js","sourceRoot":"","sources":["../src/build.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { ResolvedConfig } from "../config.js";
2
+ import type { BuildOptions, BuildResult } from "../build.js";
3
+ import { Logger } from "../logger.js";
4
+ /**
5
+ * Build workspace using bundler mode (Vite)
6
+ * Instead of copying files, generates Vite config and merged package.json
7
+ */
8
+ export declare function buildWithBundler(config: ResolvedConfig, logger: Logger, options?: BuildOptions): Promise<BuildResult>;
9
+ //# sourceMappingURL=build-bundler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-bundler.d.ts","sourceRoot":"","sources":["../../src/bundler/build-bundler.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAItC;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,WAAW,CAAC,CAqHtB"}
@@ -0,0 +1,218 @@
1
+ import fs from "fs-extra";
2
+ import path from "path";
3
+ import { spawn } from "child_process";
4
+ import { writeViteConfig } from "./vite-generator.js";
5
+ import { writePackageJson } from "./package-merger.js";
6
+ /**
7
+ * Build workspace using bundler mode (Vite)
8
+ * Instead of copying files, generates Vite config and merged package.json
9
+ */
10
+ export async function buildWithBundler(config, logger, options = {}) {
11
+ const { noInstall = false, dryRun = false } = options;
12
+ const actions = [];
13
+ const result = {
14
+ success: false,
15
+ baseFilesCopied: 0,
16
+ coreFilesCopied: 0,
17
+ customFilesCopied: 0,
18
+ installRan: false,
19
+ actions,
20
+ };
21
+ logger.info(`Building in bundler mode (type: ${config.projectType})`);
22
+ actions.push(`Mode: bundler (no file copying)`);
23
+ // Step 1: Generate Vite config
24
+ actions.push("Generate vite.config.ts");
25
+ if (!dryRun) {
26
+ try {
27
+ await writeViteConfig(config, logger);
28
+ }
29
+ catch (err) {
30
+ logger.error(`Failed to generate Vite config: ${err instanceof Error ? err.message : err}`);
31
+ return result;
32
+ }
33
+ }
34
+ else {
35
+ logger.debug("[dry-run] Generate vite.config.ts");
36
+ }
37
+ // Step 2: Generate merged package.json
38
+ actions.push("Merge package.json files");
39
+ if (!dryRun) {
40
+ try {
41
+ await writePackageJson(config, logger);
42
+ }
43
+ catch (err) {
44
+ logger.error(`Failed to merge package.json: ${err instanceof Error ? err.message : err}`);
45
+ return result;
46
+ }
47
+ }
48
+ else {
49
+ logger.debug("[dry-run] Merge package.json");
50
+ }
51
+ // Step 3: Generate tsconfig.json with path mappings
52
+ actions.push("Generate tsconfig.json");
53
+ if (!dryRun) {
54
+ try {
55
+ await generateTsConfig(config, logger);
56
+ }
57
+ catch (err) {
58
+ logger.error(`Failed to generate tsconfig.json: ${err instanceof Error ? err.message : err}`);
59
+ return result;
60
+ }
61
+ }
62
+ else {
63
+ logger.debug("[dry-run] Generate tsconfig.json");
64
+ }
65
+ // Step 4: Create .gitignore (same as workspace mode)
66
+ actions.push("Create .gitignore");
67
+ const gitignorePath = path.join(config.projectRoot, ".gitignore");
68
+ const gitignoreContent = `# Workspace CLI
69
+ .wmc-cache/
70
+
71
+ # Bundler artifacts
72
+ dist/
73
+ node_modules/
74
+
75
+ # Vite
76
+ .vite/
77
+ vite.config.ts.timestamp-*
78
+ `;
79
+ if (!dryRun) {
80
+ await fs.writeFile(gitignorePath, gitignoreContent, "utf-8");
81
+ logger.info(`Created .gitignore at ${gitignorePath}`);
82
+ }
83
+ else {
84
+ logger.debug(`[dry-run] Create .gitignore at ${gitignorePath}`);
85
+ }
86
+ // Step 5: Run install command
87
+ if (!noInstall && config.install.command) {
88
+ actions.push(`Run install: ${config.install.command}`);
89
+ if (!dryRun) {
90
+ const installSuccess = await runCommand(config.install.command, config.projectRoot, logger);
91
+ result.installRan = true;
92
+ if (!installSuccess) {
93
+ logger.error("Install command failed");
94
+ result.success = false;
95
+ return result;
96
+ }
97
+ }
98
+ else {
99
+ logger.debug(`[dry-run] Install: ${config.install.command}`);
100
+ }
101
+ }
102
+ else if (noInstall) {
103
+ actions.push("Skip install (--no-install)");
104
+ logger.info("Skipping install step");
105
+ }
106
+ result.success = true;
107
+ if (dryRun) {
108
+ logger.info("Dry run complete. Actions that would be performed:");
109
+ actions.forEach((action) => logger.info(` - ${action}`));
110
+ }
111
+ else {
112
+ logger.success("Bundler build complete!");
113
+ logger.info("");
114
+ logger.info("🚀 Next steps:");
115
+ logger.info(" • Run 'npm run dev' to start development server");
116
+ logger.info(" • Run 'npm run build' to build for production");
117
+ logger.info(" • Edit files directly in core cache or custom folder");
118
+ logger.info(" • Changes will hot-reload automatically!");
119
+ }
120
+ return result;
121
+ }
122
+ /**
123
+ * Generate tsconfig.json with path mappings matching Vite aliases
124
+ */
125
+ async function generateTsConfig(config, logger) {
126
+ const tsconfigPath = path.join(config.projectRoot, "tsconfig.json");
127
+ // Check if tsconfig already exists
128
+ let existingConfig = {};
129
+ if (await fs.pathExists(tsconfigPath)) {
130
+ try {
131
+ const content = await fs.readFile(tsconfigPath, "utf-8");
132
+ existingConfig = JSON.parse(content);
133
+ logger.debug("Found existing tsconfig.json, will merge");
134
+ }
135
+ catch {
136
+ logger.warn("Could not parse existing tsconfig.json, will create new");
137
+ }
138
+ }
139
+ const tsconfig = {
140
+ compilerOptions: {
141
+ target: "ES2020",
142
+ useDefineForClassFields: true,
143
+ lib: ["ES2020", "DOM", "DOM.Iterable"],
144
+ module: "ESNext",
145
+ skipLibCheck: true,
146
+ /* Bundler mode */
147
+ moduleResolution: "bundler",
148
+ allowImportingTsExtensions: true,
149
+ resolveJsonModule: true,
150
+ isolatedModules: true,
151
+ noEmit: true,
152
+ jsx: "react-jsx",
153
+ /* Linting */
154
+ strict: true,
155
+ noUnusedLocals: true,
156
+ noUnusedParameters: true,
157
+ noFallthroughCasesInSwitch: true,
158
+ /* Path mappings - generated based on config */
159
+ baseUrl: ".",
160
+ paths: await generatePathMappings(config, logger),
161
+ // Preserve existing compiler options
162
+ ...existingConfig.compilerOptions,
163
+ },
164
+ include: ["src", "custom"],
165
+ references: [{ path: "./tsconfig.node.json" }],
166
+ ...existingConfig,
167
+ };
168
+ await fs.writeJson(tsconfigPath, tsconfig, { spaces: 2 });
169
+ logger.success(`Generated tsconfig.json at ${tsconfigPath}`);
170
+ }
171
+ /**
172
+ * Generate TypeScript path mappings
173
+ */
174
+ async function generatePathMappings(config, logger) {
175
+ const paths = {};
176
+ // These will match the Vite aliases
177
+ paths["@custom/*"] = ["custom/*"];
178
+ paths["@core/*"] = [".wmc-cache/*/src/core/*"];
179
+ paths["core/*"] = [".wmc-cache/*/src/core/*"];
180
+ if (config.projectType === "base-core" || config.projectType === "base-core-custom") {
181
+ paths["@base/*"] = [".wmc-cache/*/src/*"];
182
+ paths["components/*"] = [".wmc-cache/*/components/*"];
183
+ paths["utils/*"] = [".wmc-cache/*/utils/*"];
184
+ paths["hooks/*"] = [".wmc-cache/*/hooks/*"];
185
+ }
186
+ return paths;
187
+ }
188
+ /**
189
+ * Run a shell command in a directory
190
+ */
191
+ async function runCommand(command, cwd, logger) {
192
+ return new Promise((resolve) => {
193
+ logger.info(`Running: ${command}`);
194
+ const isWindows = process.platform === "win32";
195
+ const shell = isWindows ? "cmd.exe" : "/bin/sh";
196
+ const shellArgs = isWindows ? ["/c", command] : ["-c", command];
197
+ const child = spawn(shell, shellArgs, {
198
+ cwd,
199
+ stdio: "inherit",
200
+ env: { ...process.env },
201
+ });
202
+ child.on("close", (code) => {
203
+ if (code === 0) {
204
+ logger.success(`Command completed successfully`);
205
+ resolve(true);
206
+ }
207
+ else {
208
+ logger.error(`Command failed with exit code ${code}`);
209
+ resolve(false);
210
+ }
211
+ });
212
+ child.on("error", (err) => {
213
+ logger.error(`Command failed: ${err.message}`);
214
+ resolve(false);
215
+ });
216
+ });
217
+ }
218
+ //# sourceMappingURL=build-bundler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-bundler.js","sourceRoot":"","sources":["../../src/bundler/build-bundler.ts"],"names":[],"mappings":"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"}