Open DaleSeo opened 10 months ago
Same Issue. (Different dist
structure when using SWC)
I want to point out that if you take Nest's default .swcrc
.swcrc
And then run swc ./ -d dist-swc --source-root ./
to mimic the rootDir
option (unless there's another swc option I missed) it still outputs directly to dist-swc
, not dist-swc/src
Why do you have src
dir in dist
while compiling with tsc in the first place?
Do you have any ts files outside src you wish to compile?
Yup exactly, we have files outside src we wish to compile
We also have folders like scripts
that contain some TypeScript code. To clarify, I believe this issue is to suggest making it configurable through tsconfig.json
instead of enforcing a specific folder structure. This will make the transition to SWC easier for most projects.
any progress?
Having the same issue with @nestjs/cli@10.3.2
. I'm finding that pnpm swc . -d dist
works fine (as well as tsc
):
dist/
src/
main.js
scripts/
some-script.js
src/
main.ts
scripts/
some-script.ts
but nest build
with SWC builder doesn't:
dist/
main.js
some-script.js
src/
main.ts
scripts/
some-script.ts
My src/ and script/ output are mixed up!
My .swcrc
:
{
"$schema": "https://json.schemastore.org/swcrc",
"jsc": {
"parser": {
"syntax": "typescript",
"tsx": true,
"decorators": true,
"dynamicImport": true
},
"baseUrl": ".",
"target": "es2021",
"loose": false,
"externalHelpers": false,
"transform": {
"react": {
"runtime": "automatic",
"importSource": "@emotion/react"
}
}
},
"module": {
"type": "commonjs",
"strict": true,
"strictMode": true,
"lazy": true,
"noInterop": false
},
"sourceMaps": true,
"exclude": ["node_modules", "dist"]
}
my nest-cli.json
{
"$schema": "https://json.schemastore.org/nest-cli",
"collection": "@nestjs/schematics",
"sourceRoot": ".",
"entryFile": "src/index",
"compilerOptions": {
"deleteOutDir": true,
"tsConfigPath": "tsconfig.build.json",
"manualRestart": true,
"builder": {
"type": "swc"
}
}
}
my tsconfig.json
:
{
"compilerOptions": {
"allowJs": false,
"module": "commonjs",
"noImplicitAny": false,
"removeComments": true,
"noLib": false,
"isolatedModules": false,
"allowSyntheticDefaultImports": true,
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"target": "es2021",
"esModuleInterop": true,
"sourceMap": true,
"jsx": "react",
"resolveJsonModule": true,
"strictNullChecks": true,
"skipLibCheck": true,
"outDir": "./dist",
"rootDir": ".",
"incremental": true
},
"include": [
"src/*.ts",
"src/**/*.ts",
"scripts/*.ts",
],
"exclude": ["node_modules", "dist"]
}
@williamdclt
I encountered the same issue, and it was caused by the --strip-leading-paths option being enabled by default. https://swc.rs/docs/usage/cli#–strip-leading-paths
The problem was fixed by changing it as follows:
nest-cli.json
"builder": {
"type": "swc",
"options": {
"stripLeadingPaths": false
}
},
Feel free to let me know if you need any further assistance!
Additional Information:
The following needs to be added:
"builder": {
"type": "swc",
"options": {
"stripLeadingPaths": false,
"includeDotfiles": true
}
}
With this change, it will work correctly even in watch mode.
@Uki884 would you like to create a PR to the docs with this info?
Is there an existing issue for this?
Current behavior
The
rootDir
compiler option in tsconfig.json is not being respected when building a NestJS project with SWC. When SWC is not used, therootDir
compiler option determines the directory structure in the output directory.Minimum reproduction code
https://github.com/DaleSeo/nestjs-typescript-starter-edqvzv
Steps to reproduce
npm i
nest build
and check the contents of the generated dist directorynest build -b swc --type-check
and check the contents of the generated dist directorysrc
directory has disappeared).Expected behavior
Both
nest build
andnest build -b swc --type-check
should generate identical build outputs for consumers who wish to utilize the swc builder.Package
Other package
No response
NestJS version
10.3.0
Packages versions
Node.js version
18.17.0
In which operating systems have you tested?
Other
No response