Skip to content

Commit c90e944

Browse files
feat: Override CRA paths
1 parent 47fb53b commit c90e944

File tree

4 files changed

+47
-7
lines changed

4 files changed

+47
-7
lines changed

packages/craco-types/src/config.ts

+2
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import type {
99
import type { Configuration as DevServerConfig } from 'webpack-dev-server';
1010
import type {
1111
BaseContext,
12+
CraPaths,
1213
DevServerContext,
1314
JestContext,
1415
WebpackContext,
@@ -101,4 +102,5 @@ export interface CracoConfig {
101102
webpack?: CracoWebpackConfig;
102103
devServer?: CracoDevServerConfig;
103104
plugins?: CracoPluginDefinition<any>[];
105+
paths?: Configure<CraPaths | undefined, BaseContext>;
104106
}

packages/craco/src/lib/cra.ts

+21-7
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import type {
22
CracoConfig,
3+
CraPaths,
34
DevServerConfigProvider,
45
JestConfigProvider,
56
} from '@craco/types';
@@ -62,7 +63,7 @@ function overrideModule(modulePath: string, newModule: any) {
6263
throw new Error(`Module not found: ${modulePath}`);
6364
}
6465
require.cache[modulePath]!.exports = newModule;
65-
log(`Overrided require cache for module: ${modulePath}`);
66+
log(`Overrode require cache for module: ${modulePath}`);
6667
}
6768

6869
function resolvePackageJson(cracoConfig: CracoConfig) {
@@ -89,14 +90,27 @@ export function getReactScriptVersion(cracoConfig: CracoConfig) {
8990

9091
let _resolvedCraPaths: any = null;
9192

93+
export function getCraPathsPath(cracoConfig: CracoConfig) {
94+
return resolveConfigFilePath(cracoConfig, 'paths.js');
95+
}
96+
9297
export function getCraPaths(cracoConfig: CracoConfig) {
9398
if (!_resolvedCraPaths) {
94-
_resolvedCraPaths = require(resolveConfigFilePath(cracoConfig, 'paths.js'));
99+
_resolvedCraPaths = require(getCraPathsPath(cracoConfig));
95100
}
96101

97102
return _resolvedCraPaths;
98103
}
99104

105+
export function overrideCraPaths(
106+
cracoConfig: CracoConfig,
107+
newConfig?: CraPaths
108+
) {
109+
overrideModule(getCraPathsPath(cracoConfig), newConfig);
110+
111+
log('Overrode CRA paths config.');
112+
}
113+
100114
/************ Webpack Dev Config ************/
101115

102116
function getWebpackDevConfigPath(cracoConfig: CracoConfig) {
@@ -137,7 +151,7 @@ export function overrideWebpackDevConfig(
137151
overrideModule(result.filepath, () => newConfig);
138152
}
139153

140-
log('Overrided Webpack dev config.');
154+
log('Overrode Webpack dev config.');
141155
}
142156

143157
/************ Webpack Prod Config ************/
@@ -180,7 +194,7 @@ export function overrideWebpackProdConfig(
180194
overrideModule(result.filepath, () => newConfig);
181195
}
182196

183-
log('Overrided Webpack prod config.');
197+
log('Overrode Webpack prod config.');
184198
}
185199

186200
/************ Dev Server Config ************/
@@ -211,7 +225,7 @@ export function overrideDevServerConfigProvider(
211225

212226
overrideModule(filepath, configProvider);
213227

214-
log('Overrided dev server config provider.');
228+
log('Overrode dev server config provider.');
215229
}
216230

217231
export function loadDevServerUtils() {
@@ -227,7 +241,7 @@ export function overrideDevServerUtils(newUtils: any) {
227241

228242
overrideModule(filepath, newUtils);
229243

230-
log('Overrided dev server utils.');
244+
log('Overrode dev server utils.');
231245
}
232246

233247
/************ Jest Config ************/
@@ -256,7 +270,7 @@ export function overrideJestConfigProvider(
256270

257271
overrideModule(filepath, configProvider);
258272

259-
log('Overrided Jest config provider.');
273+
log('Overrode Jest config provider.');
260274
}
261275

262276
/************ Scripts *******************/
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import type { BaseContext, CracoConfig, CraPaths } from '@craco/types';
2+
3+
import { overrideCraPaths } from '../../cra';
4+
import { isFunction } from '../../utils';
5+
6+
export function overridePaths(cracoConfig: CracoConfig, context: BaseContext) {
7+
let newConfig: CraPaths | undefined = context.paths;
8+
if (cracoConfig.paths) {
9+
if (isFunction(cracoConfig.paths)) {
10+
newConfig = cracoConfig.paths(newConfig, context);
11+
} else {
12+
newConfig = {
13+
...newConfig,
14+
...cracoConfig.paths,
15+
};
16+
}
17+
18+
overrideCraPaths(cracoConfig, newConfig);
19+
}
20+
21+
return newConfig;
22+
}

packages/craco/src/scripts/start.ts

+2
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import { loadCracoConfigAsync } from '../lib/config';
1111
import { getCraPaths, start } from '../lib/cra';
1212
import { overrideDevServer } from '../lib/features/dev-server/override';
1313
import { overrideWebpackDev } from '../lib/features/webpack/override';
14+
import { overridePaths } from '../lib/features/paths/override';
1415
import { log } from '../lib/logger';
1516
import { validateCraVersion } from '../lib/validate-cra-version';
1617

@@ -26,6 +27,7 @@ loadCracoConfigAsync(context).then((cracoConfig: CracoConfig) => {
2627

2728
context.paths = getCraPaths(cracoConfig);
2829

30+
context.paths = overridePaths(cracoConfig, context);
2931
overrideWebpackDev(cracoConfig, context);
3032
overrideDevServer(cracoConfig, context);
3133

0 commit comments

Comments
 (0)