Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
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 {
Comment thread
dannyhw marked this conversation as resolved.
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