Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: fix import ts from node_modules #744

Merged
merged 1 commit into from
Feb 1, 2024

Conversation

yeliex
Copy link
Contributor

@yeliex yeliex commented Dec 2, 2023

as #727 (review) describes, when import .ts files from node_moduels, it throws error TypeError [ERR_UNKNOWN_FILE_EXTENSION]: Unknown file extension ".ts".

it works well in 1.6.7

example scene: monorepo import .ts file in project, or server framework wants dynamic load routes in development

@yeliex
Copy link
Contributor Author

yeliex commented Dec 7, 2023

@Brooooooklyn please take a look

@weyert
Copy link

weyert commented Jan 4, 2024

Yes, would be nice if this change can be merged.

@Brooooooklyn Brooooooklyn merged commit c4485ca into swc-project:master Feb 1, 2024
7 checks passed
austinbiggs added a commit to austinbiggs/ivy that referenced this pull request Feb 3, 2024
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [@swc-node/register](https://github.com/swc-project/swc-node) |
[`1.6.8` ->
`1.8.0`](https://renovatebot.com/diffs/npm/@swc-node%2fregister/1.6.8/1.8.0)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/@swc-node%2fregister/1.8.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@swc-node%2fregister/1.8.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@swc-node%2fregister/1.6.8/1.8.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@swc-node%2fregister/1.6.8/1.8.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>swc-project/swc-node (@&#8203;swc-node/register)</summary>

###
[`v1.8.0`](https://github.com/swc-project/swc-node/releases/tag/%40swc-node/register%401.8.0)

[Compare
Source](https://github.com/swc-project/swc-node/compare/@swc-node/register@1.6.8...@swc-node/register@1.8.0)

#### What's Changed

- fix(core): remove `jsc.module.noInterop` when it's not supported by
[@&#8203;kdy1](https://github.com/kdy1) in
[swc-project/swc-node#733
- chore: fix README for install, build, and test by
[@&#8203;devjiwonchoi](https://github.com/devjiwonchoi) in
[swc-project/swc-node#728
- feat(register): @&#8203;swc-node/register/esm use TypeScript resolver
by [@&#8203;cm-ayf](https://github.com/cm-ayf) in
[swc-project/swc-node#727
- chore(deps-dev): bump
[@&#8203;babel/traverse](https://github.com/babel/traverse) from
7.22.10 to 7.23.2 by
[@&#8203;dependabot](https://github.com/dependabot) in
[swc-project/swc-node#735
- Fix
[#&#8203;716](https://github.com/swc-project/swc-node/issues/716) by
[@&#8203;eliellis](https://github.com/eliellis) in
[swc-project/swc-node#725
- chore(deps-dev): bump axios from 1.3.5 to 1.6.1 by
[@&#8203;dependabot](https://github.com/dependabot) in
[swc-project/swc-node#738
- fix(core): respect useDefineForClassFields tsconfig value by
[@&#8203;dsyddall](https://github.com/dsyddall) in
[swc-project/swc-node#740
- fix(core): respect sourceMaps swcrc value by
[@&#8203;dsyddall](https://github.com/dsyddall) in
[swc-project/swc-node#742
- feat: add esm-register for node>20.6 by
[@&#8203;yeliex](https://github.com/yeliex) in
[swc-project/swc-node#748
- chore(deps-dev): bump follow-redirects from 1.15.2 to 1.15.4 by
[@&#8203;dependabot](https://github.com/dependabot) in
[swc-project/swc-node#747
- feat(core): support swc's `ignoreDynamic` option by
[@&#8203;SukkaW](https://github.com/SukkaW) in
[swc-project/swc-node#745
- fix: fix import ts from node_modules by
[@&#8203;yeliex](https://github.com/yeliex) in
[swc-project/swc-node#744
- Mention --enable-source-maps in README.md for esm projects. by
[@&#8203;Xinkai](https://github.com/Xinkai) in
[swc-project/swc-node#737
- feat: upgrade dependencies by
[@&#8203;Brooooooklyn](https://github.com/Brooooooklyn) in
[swc-project/swc-node#751

#### New Contributors

- [@&#8203;devjiwonchoi](https://github.com/devjiwonchoi) made their
first contribution in
[swc-project/swc-node#728
- [@&#8203;cm-ayf](https://github.com/cm-ayf) made their first
contribution in
[swc-project/swc-node#727
- [@&#8203;eliellis](https://github.com/eliellis) made their first
contribution in
[swc-project/swc-node#725
- [@&#8203;dsyddall](https://github.com/dsyddall) made their first
contribution in
[swc-project/swc-node#740
- [@&#8203;SukkaW](https://github.com/SukkaW) made their first
contribution in
[swc-project/swc-node#745
- [@&#8203;Xinkai](https://github.com/Xinkai) made their first
contribution in
[swc-project/swc-node#737

**Full Changelog**:
https://github.com/swc-project/swc-node/compare/[@&#8203;swc-node/core](https://github.com/swc-node/core)[@&#8203;1](https://github.com/1).10.5...[@&#8203;swc-node/register](https://github.com/swc-node/register)[@&#8203;1](https://github.com/1).8.0

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR has been generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View
repository job log
[here](https://developer.mend.io/github/austinbiggs/ivy).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy4xNTMuMiIsInVwZGF0ZWRJblZlciI6IjM3LjE1My4yIiwidGFyZ2V0QnJhbmNoIjoibWFpbiJ9-->
tsang-bot bot added a commit to tsangste/nx-package-test that referenced this pull request Feb 6, 2024
This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [@swc-node/register](https://github.com/swc-project/swc-node) |
[`1.6.8` ->
`1.8.0`](https://renovatebot.com/diffs/npm/@swc-node%2fregister/1.6.8/1.8.0)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/@swc-node%2fregister/1.8.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@swc-node%2fregister/1.8.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@swc-node%2fregister/1.6.8/1.8.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@swc-node%2fregister/1.6.8/1.8.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
| [@swc/cli](https://github.com/swc-project/pkgs)
([source](https://github.com/node ./bin)) | [`0.3.5` ->
`0.3.6`](https://renovatebot.com/diffs/npm/@swc%2fcli/0.3.5/0.3.6) |
[![age](https://developer.mend.io/api/mc/badges/age/npm/@swc%2fcli/0.3.6?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@swc%2fcli/0.3.6?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@swc%2fcli/0.3.5/0.3.6?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@swc%2fcli/0.3.5/0.3.6?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>swc-project/swc-node (@&#8203;swc-node/register)</summary>

###
[`v1.8.0`](https://github.com/swc-project/swc-node/releases/tag/%40swc-node/register%401.8.0)

[Compare
Source](https://github.com/swc-project/swc-node/compare/@swc-node/register@1.6.8...@swc-node/register@1.8.0)

#### What's Changed

- fix(core): remove `jsc.module.noInterop` when it's not supported by
[@&#8203;kdy1](https://github.com/kdy1) in
[swc-project/swc-node#733
- chore: fix README for install, build, and test by
[@&#8203;devjiwonchoi](https://github.com/devjiwonchoi) in
[swc-project/swc-node#728
- feat(register): @&#8203;swc-node/register/esm use TypeScript resolver
by [@&#8203;cm-ayf](https://github.com/cm-ayf) in
[swc-project/swc-node#727
- chore(deps-dev): bump
[@&#8203;babel/traverse](https://github.com/babel/traverse) from
7.22.10 to 7.23.2 by
[@&#8203;dependabot](https://github.com/dependabot) in
[swc-project/swc-node#735
- Fix
[#&#8203;716](https://github.com/swc-project/swc-node/issues/716) by
[@&#8203;eliellis](https://github.com/eliellis) in
[swc-project/swc-node#725
- chore(deps-dev): bump axios from 1.3.5 to 1.6.1 by
[@&#8203;dependabot](https://github.com/dependabot) in
[swc-project/swc-node#738
- fix(core): respect useDefineForClassFields tsconfig value by
[@&#8203;dsyddall](https://github.com/dsyddall) in
[swc-project/swc-node#740
- fix(core): respect sourceMaps swcrc value by
[@&#8203;dsyddall](https://github.com/dsyddall) in
[swc-project/swc-node#742
- feat: add esm-register for node>20.6 by
[@&#8203;yeliex](https://github.com/yeliex) in
[swc-project/swc-node#748
- chore(deps-dev): bump follow-redirects from 1.15.2 to 1.15.4 by
[@&#8203;dependabot](https://github.com/dependabot) in
[swc-project/swc-node#747
- feat(core): support swc's `ignoreDynamic` option by
[@&#8203;SukkaW](https://github.com/SukkaW) in
[swc-project/swc-node#745
- fix: fix import ts from node_modules by
[@&#8203;yeliex](https://github.com/yeliex) in
[swc-project/swc-node#744
- Mention --enable-source-maps in README.md for esm projects. by
[@&#8203;Xinkai](https://github.com/Xinkai) in
[swc-project/swc-node#737
- feat: upgrade dependencies by
[@&#8203;Brooooooklyn](https://github.com/Brooooooklyn) in
[swc-project/swc-node#751

#### New Contributors

- [@&#8203;devjiwonchoi](https://github.com/devjiwonchoi) made their
first contribution in
[swc-project/swc-node#728
- [@&#8203;cm-ayf](https://github.com/cm-ayf) made their first
contribution in
[swc-project/swc-node#727
- [@&#8203;eliellis](https://github.com/eliellis) made their first
contribution in
[swc-project/swc-node#725
- [@&#8203;dsyddall](https://github.com/dsyddall) made their first
contribution in
[swc-project/swc-node#740
- [@&#8203;SukkaW](https://github.com/SukkaW) made their first
contribution in
[swc-project/swc-node#745
- [@&#8203;Xinkai](https://github.com/Xinkai) made their first
contribution in
[swc-project/swc-node#737

**Full Changelog**:
https://github.com/swc-project/swc-node/compare/[@&#8203;swc-node/core](https://github.com/swc-node/core)[@&#8203;1](https://github.com/1).10.5...[@&#8203;swc-node/register](https://github.com/swc-node/register)[@&#8203;1](https://github.com/1).8.0

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

👻 **Immortal**: This PR will be recreated if closed unmerged. Get
[config help](https://github.com/renovatebot/renovate/discussions) if
that's undesired.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR has been generated by [Renovate
Bot](https://github.com/renovatebot/renovate).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy4xNzEuMCIsInVwZGF0ZWRJblZlciI6IjM3LjE3Mi4yIiwidGFyZ2V0QnJhbmNoIjoiZGV2ZWxvcCJ9-->

Co-authored-by: tsang-bot[bot] <146107447+tsang-bot[bot]@users.noreply.github.com>
Copy link

@charleslai2000 charleslai2000 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this code can be changed into:

const TS_EXTENSIONS = [ts.Extension.Ts, ts.Extension.Tsx, ts.Extension.Mts];
const JS_EXTENSIONS = ["js", "jsx", "cjs", "mjs"];

export const resolve = async (specifier, context, nextResolve) => {
    const isTS = TS_EXTENSIONS.some((ext) => specifier.endsWith(ext));
    const isJS = JS_EXTENSIONS.some((ext) => specifier.endsWith(ext));
    // entrypoint
    if (!context.parentURL) {
        return {
            format: isTS ? 'ts' : undefined,
            url: specifier,
            shortCircuit: true,
        };
    }
    // import/require javascript module
    if (isJS) {
      // - local project non-TS file
      return nextResolve(specifier);
    }
    const { resolvedModule } = ts.resolveModuleName(specifier, fileURLToPath(context.parentURL), tsconfig, host, moduleResolutionCache);
    // import from local project to local project TS file
    if (resolvedModule && TS_EXTENSIONS.includes(resolvedModule.extension)) {
        return {
            format: 'ts',
            url: pathToFileURL(resolvedModule.resolvedFileName).href,
            shortCircuit: true,
        };
    }
    // import from local project to either:
    // - something TS couldn't resolve
    // - external library
    return nextResolve(specifier);
};

This code will deal with soft links of monorepo subprojects under node_modules, in this cache, the specifier has no extension at all.

@charleslai2000
Copy link

In order to load typescript file under node_modules, you also need change file register.js, remove the following codes:

    if (options.files && options.files.length) {
        if (PLATFORM === 'win32' &&
            options.files.every((file) => filename !== (0, path_1.resolve)(process.cwd(), file))) {
            return sourcecode;
        }
        if (PLATFORM !== 'win32' && options.files.every((file) => !filename.endsWith(file))) {
            return sourcecode;
        }
    }

These codes will limit only compile files in current project and all ts files under node_modules will be filtered out and emit to node. This is not suitable in this context.

@yeliex
Copy link
Contributor Author

yeliex commented Mar 2, 2024

I think this code can be changed into:

const TS_EXTENSIONS = [ts.Extension.Ts, ts.Extension.Tsx, ts.Extension.Mts];
const JS_EXTENSIONS = ["js", "jsx", "cjs", "mjs"];

export const resolve = async (specifier, context, nextResolve) => {
    const isTS = TS_EXTENSIONS.some((ext) => specifier.endsWith(ext));
    const isJS = JS_EXTENSIONS.some((ext) => specifier.endsWith(ext));
    // entrypoint
    if (!context.parentURL) {
        return {
            format: isTS ? 'ts' : undefined,
            url: specifier,
            shortCircuit: true,
        };
    }
    // import/require javascript module
    if (isJS) {
      // - local project non-TS file
      return nextResolve(specifier);
    }
    const { resolvedModule } = ts.resolveModuleName(specifier, fileURLToPath(context.parentURL), tsconfig, host, moduleResolutionCache);
    // import from local project to local project TS file
    if (resolvedModule && TS_EXTENSIONS.includes(resolvedModule.extension)) {
        return {
            format: 'ts',
            url: pathToFileURL(resolvedModule.resolvedFileName).href,
            shortCircuit: true,
        };
    }
    // import from local project to either:
    // - something TS couldn't resolve
    // - external library
    return nextResolve(specifier);
};

This code will deal with soft links of monorepo subprojects under node_modules, in this cache, the specifier has no extension at all.

add another condition to detect js files is unnecessary. these would be coved by final case.

@yeliex
Copy link
Contributor Author

yeliex commented Mar 2, 2024

In order to load typescript file under node_modules, you also need change file register.js, remove the following codes:

    if (options.files && options.files.length) {
        if (PLATFORM === 'win32' &&
            options.files.every((file) => filename !== (0, path_1.resolve)(process.cwd(), file))) {
            return sourcecode;
        }
        if (PLATFORM !== 'win32' && options.files.every((file) => !filename.endsWith(file))) {
            return sourcecode;
        }
    }

These codes will limit only compile files in current project and all ts files under node_modules will be filtered out and emit to node. This is not suitable in this context.

I think it works as expected. files should be added into options.files, or leaves the option empty. or please provide reproduction case it it has problem in your situation

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Development

Successfully merging this pull request may close these issues.

4 participants