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.
- package/README.md +339 -0
- package/dist/build.d.ts +19 -0
- package/dist/build.d.ts.map +1 -0
- package/dist/build.js +384 -0
- package/dist/build.js.map +1 -0
- package/dist/bundler/build-bundler.d.ts +9 -0
- package/dist/bundler/build-bundler.d.ts.map +1 -0
- package/dist/bundler/build-bundler.js +218 -0
- package/dist/bundler/build-bundler.js.map +1 -0
- package/dist/bundler/package-merger.d.ts +21 -0
- package/dist/bundler/package-merger.d.ts.map +1 -0
- package/dist/bundler/package-merger.js +192 -0
- package/dist/bundler/package-merger.js.map +1 -0
- package/dist/bundler/vite-generator.d.ts +14 -0
- package/dist/bundler/vite-generator.d.ts.map +1 -0
- package/dist/bundler/vite-generator.js +186 -0
- package/dist/bundler/vite-generator.js.map +1 -0
- package/dist/config.d.ts +250 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +268 -0
- package/dist/config.js.map +1 -0
- package/dist/copy.d.ts +9 -0
- package/dist/copy.d.ts.map +1 -0
- package/dist/copy.js +56 -0
- package/dist/copy.js.map +1 -0
- package/dist/git.d.ts +76 -0
- package/dist/git.d.ts.map +1 -0
- package/dist/git.js +377 -0
- package/dist/git.js.map +1 -0
- package/dist/index-update-base.d.ts +2 -0
- package/dist/index-update-base.d.ts.map +1 -0
- package/dist/index-update-base.js +76 -0
- package/dist/index-update-base.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +626 -0
- package/dist/index.js.map +1 -0
- package/dist/lock.d.ts +39 -0
- package/dist/lock.d.ts.map +1 -0
- package/dist/lock.js +91 -0
- package/dist/lock.js.map +1 -0
- package/dist/logger.d.ts +42 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +90 -0
- package/dist/logger.js.map +1 -0
- package/dist/status.d.ts +23 -0
- package/dist/status.d.ts.map +1 -0
- package/dist/status.js +158 -0
- package/dist/status.js.map +1 -0
- 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":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAEtC,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAiB/D;;GAEG;AACH,MAAM,gBAAgB,GAAG;IACvB,MAAM;IACN,SAAS;IACT,cAAc;IACd,iBAAiB;IACjB,WAAW;IACX,WAAW;CACZ,CAAC;AAEF,wCAAwC;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAE7C;;;;GAIG;AACH,KAAK,UAAU,qBAAqB,CAClC,MAAc,EACd,MAAc,EACd,QAAQ,GAAG,CAAC;IAEZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACxB,OAAO;QACT,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,MAAM,IAAI,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC;YAC7B,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;gBACjE,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;gBAC3C,MAAM,CAAC,IAAI,CACT,0BACE,CAAC,GAAG,CACN,IAAI,QAAQ,MAAM,IAAI,iBAAiB,IAAI,OAAO,CACnD,CAAC;gBACF,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;gBAC9C,SAAS;YACX,CAAC;YACD,gCAAgC;YAChC,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAED,oEAAoE;IACpE,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,GAAG,MAAM,gBAAgB,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QAClD,MAAM,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAChD,MAAM,CAAC,IAAI,CACT,qBAAqB,MAAM,WAAW,QAAQ,0BAA0B,GAAG,uBAAuB,CACnG,CAAC;QACF,OAAO;IACT,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,MAAM,CAAC,KAAK,CACV,+BAA+B,MAAM,8JAA8J,GAAG,CAAC,OAAO,EAAE,CACjN,CAAC;QACF,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,UAAU,CACvB,OAAe,EACf,GAAW,EACX,MAAc;IAEd,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,CAAC,IAAI,CAAC,YAAY,OAAO,EAAE,CAAC,CAAC;QAEnC,wCAAwC;QACxC,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC;QAC/C,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;QAChD,MAAM,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAEhE,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,SAAS,EAAE;YACpC,GAAG;YACH,KAAK,EAAE,SAAS;YAChB,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE;SACxB,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACzB,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;gBACf,MAAM,CAAC,OAAO,CAAC,gCAAgC,CAAC,CAAC;gBACjD,OAAO,CAAC,IAAI,CAAC,CAAC;YAChB,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,KAAK,CAAC,iCAAiC,IAAI,EAAE,CAAC,CAAC;gBACtD,OAAO,CAAC,KAAK,CAAC,CAAC;YACjB,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACxB,MAAM,CAAC,KAAK,CAAC,mBAAmB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YAC/C,OAAO,CAAC,KAAK,CAAC,CAAC;QACjB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,MAAsB,EACtB,MAAc,EACd,UAAwB,EAAE;IAE1B,MAAM,EAAE,SAAS,GAAG,KAAK,EAAE,MAAM,GAAG,KAAK,EAAE,GAAG,OAAO,CAAC;IACtD,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,MAAM,GAAgB;QAC1B,OAAO,EAAE,KAAK;QACd,eAAe,EAAE,CAAC;QAClB,eAAe,EAAE,CAAC;QAClB,iBAAiB,EAAE,CAAC;QACpB,UAAU,EAAE,KAAK;QACjB,OAAO;KACR,CAAC;IAEF,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC;IAEvC,0EAA0E;IAC1E,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;QAC1B,MAAM,CAAC,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IACxE,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC;QAC5B,MAAM,CAAC,eAAe,GAAG,IAAI,CAAC,IAAI,CAChC,MAAM,CAAC,aAAa,EACpB,KAAK,EACL,MAAM,EACN,QAAQ,CACT,CAAC;IACJ,CAAC;IAED,sBAAsB;IACtB,MAAM,eAAe,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IAC7E,OAAO,CAAC,IAAI,CAAC,aAAa,eAAe,EAAE,CAAC,CAAC;IAE7C,MAAM,CAAC,IAAI,CAAC,6BAA6B,MAAM,CAAC,WAAW,GAAG,CAAC,CAAC;IAEhE,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,CAAC,IAAI,CAAC,uBAAuB,eAAe,EAAE,CAAC,CAAC;IACxD,CAAC;IAED,gEAAgE;IAChE,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;IAE9E,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC;QAC3D,OAAO,CAAC,IAAI,CAAC,8BAA8B,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC;QACnE,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,CAAC,IAAI,CAAC,gCAAgC,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC;YACpE,qDAAqD;YACrD,MAAM,qBAAqB,CAAC,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;QAC5D,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,KAAK,CAAC,qBAAqB,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IAED,qCAAqC;IACrC,OAAO,CAAC,IAAI,CAAC,qBAAqB,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC;IAC1D,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IAC3C,CAAC;IAED,8BAA8B;IAC9B,QAAQ,MAAM,CAAC,WAAW,EAAE,CAAC;QAC3B,KAAK,aAAa;YAChB,6BAA6B;YAC7B,MAAM,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;YACzE,MAAM;QAER,KAAK,WAAW;YACd,2BAA2B;YAC3B,MAAM,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;YACvE,MAAM;QAER,KAAK,kBAAkB;YACrB,2CAA2C;YAC3C,MAAM,mBAAmB,CACvB,MAAM,EACN,MAAM,EACN,MAAM,EACN,OAAO,EACP,QAAQ,EACR,MAAM,CACP,CAAC;YACF,MAAM;IACV,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,IAAI,MAAM,EAAE,CAAC;YACX,yGAAyG;YACzG,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;YAClC,MAAM,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;YAC5C,MAAM,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAC;YAClE,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,MAAM,EAAE,CAAC,CAAC,CAAC;QAC5D,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,+DAA+D;IAC/D,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAClC,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IAClE,kDAAkD;IAClD,MAAM,gBAAgB,GAAG;;;CAG1B,CAAC;IAEA,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,EAAE,CAAC,SAAS,CAAC,aAAa,EAAE,gBAAgB,EAAE,OAAO,CAAC,CAAC;QAC7D,MAAM,CAAC,IAAI,CAAC,yBAAyB,aAAa,EAAE,CAAC,CAAC;IACxD,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,KAAK,CAAC,kCAAkC,aAAa,EAAE,CAAC,CAAC;IAClE,CAAC;IAED,sBAAsB;IACtB,IAAI,CAAC,SAAS,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QACzC,OAAO,CAAC,IAAI,CAAC,gBAAgB,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QAEvD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,cAAc,GAAG,MAAM,UAAU,CACrC,MAAM,CAAC,OAAO,CAAC,OAAO,EACtB,MAAM,CAAC,aAAa,EACpB,MAAM,CACP,CAAC;YACF,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC;YAEzB,IAAI,CAAC,cAAc,EAAE,CAAC;gBACpB,MAAM,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;gBACvC,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC;gBACvB,OAAO,MAAM,CAAC;YAChB,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,KAAK,CAAC,sBAAsB,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;SAAM,IAAI,SAAS,EAAE,CAAC;QACrB,OAAO,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;QAC5C,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IACvC,CAAC;IAED,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAC;QAClE,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,MAAM,EAAE,CAAC,CAAC,CAAC;IAC5D,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC;IAC9C,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,eAAe,CAC5B,MAAsB,EACtB,MAAc,EACd,MAAmB,EACnB,OAAiB,EACjB,QAAkB,EAClB,MAAe;IAEf,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IAErC,2FAA2F;IAC3F,MAAM,YAAY,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,IAAK,MAAM,CAAC,IAAY,CAAC,GAAG,CAAC,CAAC;IACjE,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC,WAAW,IAAI,CAAC,YAAY,CAAC;IAChE,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;QAClD,MAAM,CAAC,KAAK,CAAC,4BAA4B,QAAQ,GAAG,CAAC,CAAC;QACtD,OAAO;IACT,CAAC;IACD,IAAI,CAAC,iBAAiB,IAAI,CAAC,CAAC,MAAM,SAAS,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;QACvD,MAAM,CAAC,KAAK,CAAC,gCAAgC,QAAQ,qBAAqB,CAAC,CAAC;QAC5E,OAAO;IACT,CAAC;IAED,oDAAoD;IACpD,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;QACvB,OAAO,CAAC,IAAI,CAAC,gBAAgB,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;QACnD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,CAAC,IAAI,CAAC,+BAA+B,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;QACnE,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,KAAK,CAAC,0BAA0B,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;IAED,gEAAgE;IAChE,MAAM,SAAS,GACb,MAAM,CAAC,IAAI,IAAI,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;IACnE,OAAO,CAAC,IAAI,CACV,2BAA2B,SAAS,KAAK,QAAQ,QAAQ,MAAM,CAAC,aAAa,EAAE,CAChF,CAAC;IACF,MAAM,CAAC,eAAe,GAAG,MAAM,gBAAgB,CAC7C,QAAQ,EACR,MAAM,CAAC,aAAa,EACpB,QAAQ,EACR,MAAM,EACN,MAAM,CACP,CAAC;IAEF,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,CAAC,OAAO,CAAC,UAAU,MAAM,CAAC,eAAe,kBAAkB,CAAC,CAAC;IACrE,CAAC;IAED,iDAAiD;IACjD,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;IAEzE,IAAI,MAAM,CAAC,UAAU,IAAI,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;QAClE,OAAO,CAAC,IAAI,CACV,mBAAmB,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,MAAM,EAAE,IAAI,OACxD,eACF,EAAE,CACH,CAAC;QAEF,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,qDAAqD;YACrD,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;gBACzC,MAAM,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;YACnC,CAAC;YACD,iCAAiC;YACjC,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC;YAElD,iDAAiD;YACjD,MAAM,kBAAkB,GAAG,IAAI,CAAC,OAAO,CACrC,MAAM,CAAC,WAAW,EAClB,MAAM,CAAC,UAAU,CAClB,CAAC;YACF,MAAM,EAAE,CAAC,OAAO,CAAC,kBAAkB,EAAE,eAAe,EAAE,UAAU,CAAC,CAAC;YAClE,MAAM,CAAC,OAAO,CACZ,oBAAoB,eAAe,OAAO,kBAAkB,EAAE,CAC/D,CAAC;YACF,MAAM,CAAC,iBAAiB,GAAG,CAAC,CAAC,CAAC,2BAA2B;QAC3D,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,KAAK,CAAC,mCAAmC,eAAe,EAAE,CAAC,CAAC;QACrE,CAAC;IACH,CAAC;SAAM,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QAC7B,MAAM,CAAC,IAAI,CAAC,+BAA+B,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;IAClE,CAAC;IAED,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;AACxB,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,aAAa,CAC1B,MAAsB,EACtB,MAAc,EACd,MAAmB,EACnB,OAAiB,EACjB,QAAkB,EAClB,MAAe;IAEf,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IAErC,2BAA2B;IAC3B,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC,MAAM,SAAS,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;QAC9C,MAAM,CAAC,KAAK,CAAC,gCAAgC,QAAQ,qBAAqB,CAAC,CAAC;QAC5E,OAAO;IACT,CAAC;IAED,+CAA+C;IAC/C,OAAO,CAAC,IAAI,CAAC,yBAAyB,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC;IAC9D,MAAM,CAAC,eAAe,GAAG,MAAM,gBAAgB,CAC7C,QAAQ,EACR,MAAM,CAAC,aAAa,EACpB,QAAQ,EACR,MAAM,EACN,MAAM,CACP,CAAC;IAEF,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,CAAC,OAAO,CAAC,UAAU,MAAM,CAAC,eAAe,kBAAkB,CAAC,CAAC;IACrE,CAAC;IAED,yDAAyD;IACzD,IAAI,MAAM,CAAC,aAAa,IAAI,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC;QACxE,OAAO,CAAC,IAAI,CAAC,iBAAiB,MAAM,CAAC,OAAO,OAAO,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC;QAE3E,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,mDAAmD;YACnD,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC;gBAC9C,MAAM,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;YACxC,CAAC;YACD,iCAAiC;YACjC,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC;YAEvD,qDAAqD;YACrD,MAAM,gBAAgB,GAAG,IAAI,CAAC,OAAO,CACnC,MAAM,CAAC,WAAW,EAClB,MAAM,CAAC,aAAa,CACrB,CAAC;YACF,MAAM,EAAE,CAAC,OAAO,CAAC,gBAAgB,EAAE,MAAM,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;YACrE,MAAM,CAAC,OAAO,CACZ,oBAAoB,MAAM,CAAC,aAAa,OAAO,gBAAgB,EAAE,CAClE,CAAC;YACF,MAAM,CAAC,eAAe,GAAG,CAAC,CAAC,CAAC,2BAA2B;QACzD,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,KAAK,CAAC,mCAAmC,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC;QAC1E,CAAC;IACH,CAAC;SAAM,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;QAChC,MAAM,CAAC,IAAI,CAAC,mCAAmC,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC;IACzE,CAAC;IAED,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;AACxB,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,mBAAmB,CAChC,MAAsB,EACtB,MAAc,EACd,MAAmB,EACnB,OAAiB,EACjB,QAAkB,EAClB,MAAe;IAEf,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IACrC,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IAErC,2BAA2B;IAC3B,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC,MAAM,SAAS,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;QAC9C,MAAM,CAAC,KAAK,CAAC,gCAAgC,QAAQ,qBAAqB,CAAC,CAAC;QAC5E,OAAO;IACT,CAAC;IAED,2BAA2B;IAC3B,IAAI,CAAC,CAAC,MAAM,SAAS,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;QACjC,MAAM,CAAC,KAAK,CAAC,gCAAgC,QAAQ,qBAAqB,CAAC,CAAC;QAC5E,OAAO;IACT,CAAC;IAED,+CAA+C;IAC/C,OAAO,CAAC,IAAI,CAAC,yBAAyB,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC;IAC9D,MAAM,CAAC,eAAe,GAAG,MAAM,gBAAgB,CAC7C,QAAQ,EACR,MAAM,CAAC,aAAa,EACpB,QAAQ,EACR,MAAM,EACN,MAAM,CACP,CAAC;IAEF,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,CAAC,OAAO,CAAC,UAAU,MAAM,CAAC,eAAe,kBAAkB,CAAC,CAAC;IACrE,CAAC;IAED,mEAAmE;IACnE,IAAI,WAAmB,CAAC;IACxB,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;QACvB,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;QACjC,iEAAiE;QACjE,OAAO,CAAC,IAAI,CAAC,gBAAgB,WAAW,EAAE,CAAC,CAAC;QAC5C,MAAM,CAAC,IAAI,CAAC,+BAA+B,WAAW,EAAE,CAAC,CAAC;IAC5D,CAAC;SAAM,CAAC;QACN,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;QAEjD,mFAAmF;QACnF,IACE,CAAC,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;YACnC,MAAM,CAAC,IAAI;YACX,MAAM,CAAC,IAAI,CAAC,IAAI,EAChB,CAAC;YACD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;YAC1E,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACtD,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;gBACtC,WAAW,GAAG,YAAY,CAAC;gBAC3B,MAAM,CAAC,IAAI,CAAC,2BAA2B,WAAW,EAAE,CAAC,CAAC;YACxD,CAAC;iBAAM,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBACxC,WAAW,GAAG,OAAO,CAAC;gBACtB,MAAM,CAAC,IAAI,CAAC,sCAAsC,WAAW,EAAE,CAAC,CAAC;YACnE,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,CACT,4BAA4B,IAAI,CAAC,IAAI,CACnC,QAAQ,EACR,KAAK,EACL,MAAM,CACP,wBAAwB,CAC1B,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,iBAAiB,WAAW,OAAO,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC;IAExE,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IAC3C,CAAC;IAED,MAAM,CAAC,eAAe,GAAG,MAAM,gBAAgB,CAC7C,WAAW,EACX,MAAM,CAAC,aAAa,EACpB,QAAQ,EACR,MAAM,EACN,MAAM,CACP,CAAC;IAEF,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,CAAC,OAAO,CAAC,UAAU,MAAM,CAAC,eAAe,kBAAkB,CAAC,CAAC;IACrE,CAAC;IAED,4CAA4C;IAC5C,IAAI,MAAM,CAAC,UAAU,IAAI,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;QAClE,OAAO,CAAC,IAAI,CACV,mBAAmB,MAAM,CAAC,SAAS,OAAO,MAAM,CAAC,eAAe,EAAE,CACnE,CAAC;QAEF,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,qDAAqD;YACrD,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,eAAe,CAAC,EAAE,CAAC;gBAChD,MAAM,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;YAC1C,CAAC;YACD,iCAAiC;YACjC,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC;YAEzD,iDAAiD;YACjD,MAAM,kBAAkB,GAAG,IAAI,CAAC,OAAO,CACrC,MAAM,CAAC,WAAW,EAClB,MAAM,CAAC,UAAU,CAClB,CAAC;YACF,MAAM,EAAE,CAAC,OAAO,CAAC,kBAAkB,EAAE,MAAM,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;YACzE,MAAM,CAAC,OAAO,CACZ,oBAAoB,MAAM,CAAC,eAAe,OAAO,kBAAkB,EAAE,CACtE,CAAC;YACF,MAAM,CAAC,iBAAiB,GAAG,CAAC,CAAC,CAAC,2BAA2B;QAC3D,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,KAAK,CAAC,mCAAmC,MAAM,CAAC,eAAe,EAAE,CAAC,CAAC;QAC5E,CAAC;IACH,CAAC;SAAM,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QAC7B,MAAM,CAAC,IAAI,CAAC,+BAA+B,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;IAClE,CAAC;IAED,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;AACxB,CAAC"}
|
|
@@ -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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"}
|