workspace-manager-cli 1.0.0 → 1.2.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.
@@ -0,0 +1,147 @@
1
+ import fs from "fs-extra";
2
+ import path from "path";
3
+ /**
4
+ * Transform webpack.config.js to support symlinked core/custom directories
5
+ * by injecting resolve.modules, resolve.symlinks, and babel-loader includes
6
+ */
7
+ export async function transformWebpackConfig(config, logger, dryRun = false) {
8
+ const workspaceConfigDir = path.join(config.workspacePath, "config");
9
+ const webpackConfigPath = path.join(workspaceConfigDir, "webpack.config.js");
10
+ const webpackProdConfigPath = path.join(workspaceConfigDir, "webpack.config.prod.js");
11
+ let transformed = false;
12
+ // Transform development config
13
+ if (await fs.pathExists(webpackConfigPath)) {
14
+ if (dryRun) {
15
+ logger.debug(`[dry-run] Transform: ${webpackConfigPath}`);
16
+ }
17
+ else {
18
+ const success = await transformWebpackConfigFile(webpackConfigPath, config, logger);
19
+ if (success) {
20
+ logger.info(`Transformed webpack config: ${webpackConfigPath}`);
21
+ transformed = true;
22
+ }
23
+ }
24
+ }
25
+ // Transform production config
26
+ if (await fs.pathExists(webpackProdConfigPath)) {
27
+ if (dryRun) {
28
+ logger.debug(`[dry-run] Transform: ${webpackProdConfigPath}`);
29
+ }
30
+ else {
31
+ const success = await transformWebpackConfigFile(webpackProdConfigPath, config, logger);
32
+ if (success) {
33
+ logger.info(`Transformed webpack config: ${webpackProdConfigPath}`);
34
+ transformed = true;
35
+ }
36
+ }
37
+ }
38
+ return transformed;
39
+ }
40
+ /**
41
+ * Transform a single webpack config file
42
+ */
43
+ async function transformWebpackConfigFile(configPath, config, logger) {
44
+ try {
45
+ let content = await fs.readFile(configPath, "utf-8");
46
+ // Check if already transformed (avoid double transformation)
47
+ if (content.includes("// WMC: Symlink resolution support")) {
48
+ logger.debug(`Webpack config already transformed: ${configPath}`);
49
+ return false;
50
+ }
51
+ // Apply transformations
52
+ content = injectResolveModules(content, config);
53
+ content = injectBabelLoaderIncludes(content, config);
54
+ // Write transformed config
55
+ await fs.writeFile(configPath, content, "utf-8");
56
+ return true;
57
+ }
58
+ catch (error) {
59
+ logger.warn(`Failed to transform webpack config ${configPath}: ${error.message}`);
60
+ return false;
61
+ }
62
+ }
63
+ /**
64
+ * Inject resolve.modules and resolve.symlinks into webpack config
65
+ */
66
+ function injectResolveModules(content, config) {
67
+ // Find the resolve block
68
+ const resolveRegex = /resolve:\s*{/;
69
+ const match = content.match(resolveRegex);
70
+ if (!match || match.index === undefined) {
71
+ // No resolve block found, skip transformation
72
+ return content;
73
+ }
74
+ // Build the injection string
75
+ const resolveAdditions = `
76
+ // WMC: Symlink resolution support
77
+ symlinks: false,
78
+ modules: [
79
+ 'node_modules',
80
+ path.resolve(__dirname, '../src'),
81
+ path.resolve(__dirname, '../src/core'),
82
+ path.resolve(__dirname, '../src/core/custom'),
83
+ ],`;
84
+ // Insert after 'resolve: {'
85
+ const insertPosition = match.index + match[0].length;
86
+ const before = content.substring(0, insertPosition);
87
+ const after = content.substring(insertPosition);
88
+ return before + resolveAdditions + after;
89
+ }
90
+ /**
91
+ * Inject include paths and presets into babel-loader configuration
92
+ */
93
+ function injectBabelLoaderIncludes(content, config) {
94
+ // Find babel-loader configuration
95
+ const babelLoaderRegex = /{\s*test:\s*\/\\\.\[jt\]sx\?\$\/[\s\S]*?loader:\s*['"]babel-loader['"]\s*,\s*options:\s*{/;
96
+ const match = content.match(babelLoaderRegex);
97
+ if (!match || match.index === undefined) {
98
+ // No babel-loader found, skip transformation
99
+ return content;
100
+ }
101
+ // First, add include array before the use block
102
+ let modifiedContent = content;
103
+ // Find the opening of the rule block containing babel-loader
104
+ const ruleStart = content.lastIndexOf("{", match.index);
105
+ const testMatch = content
106
+ .substring(ruleStart, match.index)
107
+ .match(/{\s*test:/);
108
+ if (testMatch) {
109
+ const excludeMatch = content
110
+ .substring(ruleStart, match.index + match[0].length)
111
+ .match(/exclude:\s*\/node_modules\/\s*,/);
112
+ if (excludeMatch) {
113
+ const excludePosition = ruleStart + content.substring(ruleStart).indexOf(excludeMatch[0]);
114
+ const includeAddition = `
115
+ include: [
116
+ path.resolve(__dirname, '../src'),
117
+ path.resolve(__dirname, '../src/core'),
118
+ path.resolve(__dirname, '../src/core/custom'),
119
+ ],`;
120
+ const before = modifiedContent.substring(0, excludePosition + excludeMatch[0].length);
121
+ const after = modifiedContent.substring(excludePosition + excludeMatch[0].length);
122
+ modifiedContent = before + includeAddition + after;
123
+ }
124
+ }
125
+ // Now add presets to babel-loader options
126
+ const optionsMatch = modifiedContent.match(babelLoaderRegex);
127
+ if (optionsMatch && optionsMatch.index !== undefined) {
128
+ const optionsStart = optionsMatch.index + optionsMatch[0].length;
129
+ // Check if presets already exist
130
+ const hasPresets = modifiedContent
131
+ .substring(optionsStart, optionsStart + 500)
132
+ .includes("presets:");
133
+ if (!hasPresets) {
134
+ const presetsAddition = `
135
+ presets: [
136
+ '@babel/preset-env',
137
+ '@babel/preset-react',
138
+ '@babel/preset-typescript',
139
+ ],`;
140
+ const before = modifiedContent.substring(0, optionsStart);
141
+ const after = modifiedContent.substring(optionsStart);
142
+ modifiedContent = before + presetsAddition + after;
143
+ }
144
+ }
145
+ return modifiedContent;
146
+ }
147
+ //# sourceMappingURL=webpack-transform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webpack-transform.js","sourceRoot":"","sources":["../src/webpack-transform.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "workspace-manager-cli",
3
- "version": "1.0.0",
3
+ "version": "1.2.0",
4
4
  "description": "Cross-platform CLI to assemble project workspaces from shared core boilerplate plus custom folders",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -13,7 +13,9 @@
13
13
  "dev": "tsc --watch",
14
14
  "start": "node dist/index.js",
15
15
  "test": "npm run build && node test/test-excludes.js && node test/test-excludes-patterns.js && node test/test-default-excludes.js && node test/test-excludes-format.js && node test/test-build-dryrun.js && node test/test-action-ordering.js && node test/test-core-src-fallback.js && node test/test-core-override.js && node test/test-config-hashes.js",
16
- "prepublishOnly": "npm run build"
16
+ "debug": "npm run build && cd test-bundler && node ../dist/index.js init",
17
+ "prepublishOnly": "npm run build",
18
+ "publish": "npm publish --access public"
17
19
  },
18
20
  "keywords": [
19
21
  "cli",
@@ -30,6 +32,7 @@
30
32
  "commander": "^12.1.0",
31
33
  "fs-extra": "^11.2.0",
32
34
  "globby": "^14.0.2",
35
+ "ora": "^9.1.0",
33
36
  "simple-git": "^3.27.0",
34
37
  "zod": "^3.23.8"
35
38
  },