diff --git a/packages/js/.eslintrc.json b/packages/js/.eslintrc.json index b14f51b5e8..75ddd84537 100644 --- a/packages/js/.eslintrc.json +++ b/packages/js/.eslintrc.json @@ -51,6 +51,7 @@ "@babel/preset-env", "@babel/preset-typescript", "@babel/runtime", + "@swc/cli", "babel-plugin-const-enum", "babel-plugin-macros", "babel-plugin-transform-typescript-metadata" diff --git a/packages/js/src/executors/swc/swc.impl.ts b/packages/js/src/executors/swc/swc.impl.ts index 12beeb2ee6..23c2b0367c 100644 --- a/packages/js/src/executors/swc/swc.impl.ts +++ b/packages/js/src/executors/swc/swc.impl.ts @@ -59,12 +59,19 @@ function normalizeOptions( outputPath ); + const projectRootParts = projectRoot.split('/'); + // We pop the last part of the `projectRoot` to pass + // the last part (projectDir) and the remainder (projectRootParts) to swc + const projectDir = projectRootParts.pop(); + // default to current directory if projectRootParts is []. + // Eg: when a project is at the root level, outside of layout dir + const swcCwd = projectRootParts.join('/') || '.'; const swcrcPath = getSwcrcPath(options, root, projectRoot); - // TODO(meeroslav): Check why this is needed in order for swc to properly nest folders - const distParent = outputPath.split('/').slice(0, -1).join('/'); + const swcCliOptions = { - srcPath: projectRoot, - destPath: relative(root, distParent), + srcPath: projectDir, + destPath: relative(join(root, swcCwd), outputPath), + swcCwd, swcrcPath, }; @@ -121,11 +128,13 @@ export async function* swcExecutor( if (!isInlineGraphEmpty(inlineProjectGraph)) { options.projectRoot = '.'; // set to root of workspace to include other libs for type check - options.swcCliOptions.srcPath = root.split('/').slice(0, -1).join('/'); // set to root of libraries to include other libs - options.swcCliOptions.destPath = join( - _options.outputPath, - options.swcCliOptions.srcPath - ); // new destPath is dist/{libs}/{parentLib}/{libs} + // remap paths for SWC compilation + options.swcCliOptions.srcPath = options.swcCliOptions.swcCwd; + options.swcCliOptions.swcCwd = '.'; + options.swcCliOptions.destPath = options.swcCliOptions.destPath + .split('../') + .at(-1) + .concat('/', options.swcCliOptions.srcPath); // tmp swcrc with dependencies to exclude // - buildable libraries diff --git a/packages/js/src/utils/swc/compile-swc.ts b/packages/js/src/utils/swc/compile-swc.ts index 7ae63f3d83..91315fd0b4 100644 --- a/packages/js/src/utils/swc/compile-swc.ts +++ b/packages/js/src/utils/swc/compile-swc.ts @@ -1,9 +1,4 @@ -import { - cacheDir, - ExecutorContext, - getPackageManagerCommand, - logger, -} from '@nx/devkit'; +import { cacheDir, ExecutorContext, logger } from '@nx/devkit'; import { exec, execSync } from 'child_process'; import { removeSync } from 'fs-extra'; import { createAsyncIterable } from '@nx/devkit/src/utils/async-iterable'; @@ -15,8 +10,8 @@ function getSwcCmd( { swcrcPath, srcPath, destPath }: SwcCliOptions, watch = false ) { - const packageManager = getPackageManagerCommand(); - let swcCmd = `${packageManager.exec} swc ${ + const swcCLI = require.resolve('@swc/cli/bin/swc.js'); + let swcCmd = `${swcCLI} ${ // TODO(jack): clean this up when we remove inline module support // Handle root project srcPath === '.' ? 'src' : srcPath @@ -58,6 +53,7 @@ export async function compileSwc( const swcCmdLog = execSync(getSwcCmd(normalizedOptions.swcCliOptions), { encoding: 'utf8', + cwd: normalizedOptions.swcCliOptions.swcCwd, }); logger.log(swcCmdLog.replace(/\n/, '')); const isCompileSuccess = swcCmdLog.includes('Successfully compiled');