Skip to content

Commit

Permalink
fix(js): update @swc/li version
Browse files Browse the repository at this point in the history
  • Loading branch information
jaysoo committed Apr 10, 2024
1 parent 7633c71 commit 52cfe8b
Show file tree
Hide file tree
Showing 6 changed files with 70 additions and 27 deletions.
14 changes: 14 additions & 0 deletions e2e/js/src/js-executor-swc.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -92,4 +92,18 @@ myLib();
}).toString();
expect(result).toContain('x');
}, 240_000);

it('should support --strip-leading-paths option', () => {
const lib = uniq('lib');
runCLI(`generate @nx/js:lib ${lib} --bundler=swc --no-interactive`);

runCLI(`build ${lib}`);
checkFilesExist(
`dist/libs/${lib}/package.json`,
`dist/libs/${lib}/index.js`,
`dist/libs/${lib}/lib/${lib}.js`,
`dist/libs/${lib}/index.d.ts`,
`dist/libs/${lib}/lib/${lib}.d.ts`
);
});
});
9 changes: 9 additions & 0 deletions packages/js/migrations.json
Original file line number Diff line number Diff line change
Expand Up @@ -167,6 +167,15 @@
"alwaysAddToPackageJson": false
}
}
},
"18.2.5": {
"version": "18.2.5-beta.0",
"packages": {
"@swc/cli": {
"version": "~0.3.12",
"alwaysAddToPackageJson": false
}
}
}
}
}
18 changes: 9 additions & 9 deletions packages/js/src/executors/swc/swc.impl.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import {
import { copyPackageJson } from '../../utils/package-json';
import {
NormalizedSwcExecutorOptions,
SwcCliOptions,
SwcExecutorOptions,
} from '../../utils/schema';
import { compileSwc, compileSwcWatch } from '../../utils/swc/compile-swc';
Expand Down Expand Up @@ -59,18 +60,13 @@ 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('/') || '.';
// Always execute from root of project, same as with SWC CLI.
const swcCwd = join(root, projectRoot);
const { swcrcPath, tmpSwcrcPath } = getSwcrcPath(options, root, projectRoot);

const swcCliOptions = {
srcPath: projectDir,
destPath: relative(join(root, swcCwd), outputPath),
srcPath: projectRoot,
destPath: relative(swcCwd, outputPath),
swcCwd,
swcrcPath,
stripLeadingPaths: Boolean(options.stripLeadingPaths),
Expand Down Expand Up @@ -128,6 +124,10 @@ export async function* swcExecutor(
);

if (!isInlineGraphEmpty(inlineProjectGraph)) {
if (options.stripLeadingPaths) {
throw new Error(`Cannot use --strip-leading-paths with inlining.`);
}

options.projectRoot = '.'; // set to root of workspace to include other libs for type check

// remap paths for SWC compilation
Expand Down
1 change: 1 addition & 0 deletions packages/js/src/utils/schema.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -86,4 +86,5 @@ export interface NormalizedSwcExecutorOptions
skipTypeCheck: boolean;
swcCliOptions: SwcCliOptions;
tmpSwcrcPath: string;
sourceRoot?: string;
}
53 changes: 36 additions & 17 deletions packages/js/src/utils/swc/compile-swc.ts
Original file line number Diff line number Diff line change
@@ -1,37 +1,57 @@
import { cacheDir, ExecutorContext, logger } from '@nx/devkit';
import { exec, execSync } from 'child_process';
import { removeSync } from 'fs-extra';
import { exec, execSync } from 'node:child_process';
import { join } from 'node:path';
import { existsSync, removeSync } from 'fs-extra';
import { createAsyncIterable } from '@nx/devkit/src/utils/async-iterable';
import { NormalizedSwcExecutorOptions, SwcCliOptions } from '../schema';
import { printDiagnostics } from '../typescript/print-diagnostics';
import { runTypeCheck, TypeCheckOptions } from '../typescript/run-type-check';
import { relative } from 'path';

function getSwcCmd(
{ swcrcPath, srcPath, destPath, stripLeadingPaths }: SwcCliOptions,
{
swcCliOptions: { swcrcPath, destPath, stripLeadingPaths },
root,
projectRoot,
sourceRoot,
}: NormalizedSwcExecutorOptions,
watch = false
) {
const swcCLI = require.resolve('@swc/cli/bin/swc.js');
let swcCmd = `node ${swcCLI} ${
// TODO(jack): clean this up when we remove inline module support
// Handle root project
srcPath === '.' ? 'src' : srcPath
} -d ${
srcPath === '.' ? `${destPath}/src` : destPath
} --config-file=${swcrcPath} ${
let inputDir: string;
if (sourceRoot) {
inputDir = relative(projectRoot, sourceRoot);
} else {
// If sourceRoot is not provided, check if `src` exists and use that instead.
// This is important for root projects to avoid compiling too many directories.
inputDir = existsSync(join(root, projectRoot, 'src')) ? 'src' : '.';
}

let swcCmd = `node ${swcCLI} ${inputDir} -d ${destPath} --config-file=${swcrcPath} ${
stripLeadingPaths ? '--strip-leading-paths' : ''
}`;
return watch ? swcCmd.concat(' --watch') : swcCmd;
}

function getTypeCheckOptions(normalizedOptions: NormalizedSwcExecutorOptions) {
const { projectRoot, watch, tsConfig, root, outputPath } = normalizedOptions;
const { sourceRoot, projectRoot, watch, tsConfig, root, outputPath } =
normalizedOptions;
const inputDir =
// If `--strip-leading-paths` SWC option is used, we need to transpile from `src` directory.
!normalizedOptions.swcCliOptions.stripLeadingPaths
? projectRoot
: sourceRoot
? sourceRoot
: existsSync(join(root, projectRoot, 'src'))
? join(projectRoot, 'src')
: projectRoot;

const typeCheckOptions: TypeCheckOptions = {
mode: 'emitDeclarationOnly',
tsConfigPath: tsConfig,
outDir: outputPath,
workspaceRoot: root,
rootDir: projectRoot,
rootDir: inputDir,
};

if (watch) {
Expand All @@ -53,7 +73,7 @@ export async function compileSwc(
removeSync(normalizedOptions.outputPath);
}

const swcCmdLog = execSync(getSwcCmd(normalizedOptions.swcCliOptions), {
const swcCmdLog = execSync(getSwcCmd(normalizedOptions), {
encoding: 'utf8',
cwd: normalizedOptions.swcCliOptions.swcCwd,
});
Expand Down Expand Up @@ -106,10 +126,9 @@ export async function* compileSwcWatch(
let stderrOnData: () => void;
let watcherOnExit: () => void;

const swcWatcher = exec(
getSwcCmd(normalizedOptions.swcCliOptions, true),
{ cwd: normalizedOptions.swcCliOptions.swcCwd }
);
const swcWatcher = exec(getSwcCmd(normalizedOptions, true), {
cwd: normalizedOptions.swcCliOptions.swcCwd,
});

processOnExit = () => {
swcWatcher.kill();
Expand Down
2 changes: 1 addition & 1 deletion packages/js/src/utils/versions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ export const nxVersion = require('../../package.json').version;

export const esbuildVersion = '^0.19.2';
export const prettierVersion = '^2.6.2';
export const swcCliVersion = '~0.1.62';
export const swcCliVersion = '~0.3.12';
export const swcCoreVersion = '~1.3.85';
export const swcHelpersVersion = '~0.5.2';
export const swcNodeVersion = '~1.8.0';
Expand Down

0 comments on commit 52cfe8b

Please sign in to comment.