Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions packages/repack/src/commands/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,9 @@ export type RemoveRecord<T> = T extends infer U & Record<string, any>

type ConfigKeys =
| 'name'
| 'cache'
| 'context'
| 'experiments'
| 'mode'
| 'devServer'
| 'entry'
Expand Down
1 change: 1 addition & 0 deletions packages/repack/src/helpers/index.ts
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
export * from './errors.js';
export * from './helpers.js';
export * from './rspackVersion.js';
61 changes: 61 additions & 0 deletions packages/repack/src/helpers/rspackVersion.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
import type { Compiler as RspackCompiler } from '@rspack/core';
import type { Compiler as WebpackCompiler } from 'webpack';

/**
* Reads the version of the installed `@rspack/core` package without loading it.
*
* Resolving `@rspack/core/package.json` instead of importing the package keeps
* this helper safe to call in any context:
* - `@rspack/core` v2 is ESM-only, so a CJS `require('@rspack/core')` throws
* `ERR_REQUIRE_ESM` on Node < 20.19,
* - `@rspack/core` is an optional peer dependency and may not be installed
* at all (webpack-only projects).
*
* @param context Optional directory to resolve `@rspack/core` from. Defaults
* to Re.Pack's own resolution paths.
* @returns Version string or `null` when `@rspack/core` is not resolvable.
*/
export function getRspackVersion(context?: string): string | null {
try {
const options = context ? { paths: [context] } : undefined;
const packageJsonPath = require.resolve(
'@rspack/core/package.json',
options
);
const { version }: { version: string } = require(packageJsonPath);
return version;
} catch {
return null;
}
}

/**
* Major version of the installed `@rspack/core` package,
* or `null` when it's not resolvable.
*/
export function getRspackMajorVersion(context?: string): number | null {
const version = getRspackVersion(context);
if (!version) return null;
return Number(version.split('.')[0]);
}

/**
* Whether the installed `@rspack/core` package is version 2 or newer.
* Returns `false` when `@rspack/core` is not resolvable.
*/
export function isRspack2(context?: string): boolean {
return (getRspackMajorVersion(context) ?? 0) >= 2;
}

/**
* Major version of Rspack derived from an already-created compiler instance.
* Returns `null` for webpack compilers.
*/
export function getRspackMajorVersionFromCompiler(
compiler: RspackCompiler | WebpackCompiler
): number | null {
if ('rspackVersion' in compiler.webpack && compiler.webpack.rspackVersion) {
return Number(compiler.webpack.rspackVersion.split('.')[0]);
}
return null;
}
Loading