ts-node icon indicating copy to clipboard operation
ts-node copied to clipboard

"Cannot find package" when running mocha and importing between packages in monorepo

Open alicegherbison opened this issue 2 years ago • 1 comments

Search Terms

I think this is similar or related to https://github.com/TypeStrong/ts-node/issues/2031 and https://github.com/TypeStrong/ts-node/issues/2023 but not sure.

Expected Behavior

When running mocha and pulling in modules from between packages they should resolve and be found when a test runs.

Actual Behavior

When a test script runs a function that itself imports a variable (or anything) from a another package in the monorepo, the variable is not resolved.

Error: Cannot find package 'packages' imported from C:\Users\AliceHerbison\import-error\packages\extra1\functions\exampleFunction.ts
    at packageResolve (C:\Users\AliceHerbison\import-error\node_modules\ts-node\dist-raw\node-internal-modules-esm-resolve.js:757:9)
    at moduleResolve (C:\Users\AliceHerbison\import-error\node_modules\ts-node\dist-raw\node-internal-modules-esm-resolve.js:798:18)
    at Object.defaultResolve (C:\Users\AliceHerbison\import-error\node_modules\ts-node\dist-raw\node-internal-modules-esm-resolve.js:912:11)
    at C:\Users\AliceHerbison\import-error\node_modules\ts-node\src\esm.ts:218:35
    at entrypointFallback (C:\Users\AliceHerbison\import-error\node_modules\ts-node\src\esm.ts:168:34)
    at C:\Users\AliceHerbison\import-error\node_modules\ts-node\src\esm.ts:217:14
    at addShortCircuitFlag (C:\Users\AliceHerbison\import-error\node_modules\ts-node\src\esm.ts:409:21)
    at resolve (C:\Users\AliceHerbison\import-error\node_modules\ts-node\src\esm.ts:197:12)
    at nextResolve (node:internal/modules/esm/loader:163:28)
    at ESMLoader.resolve (node:internal/modules/esm/loader:838:30)
    at ESMLoader.getModuleJob (node:internal/modules/esm/loader:424:18)
    at ModuleWrap.<anonymous> (node:internal/modules/esm/module_job:77:40)
    at link (node:internal/modules/esm/module_job:76:36)

Steps to reproduce the problem

yarn
yarn test

Minimal reproduction

This is a minimal reproduction using the same setup and folder structure for our corporate monorepo. The example functions and tests are basic but illustrate exactly the same concept - https://github.com/alicegherbison/import-error

Specifications

  • ts-node version: ^10.9.2
  • node version: 18.16.1
  • TypeScript version: 5.3.3
  • tsconfig.json, if you're using one:
{
  "compileOnSave": false,
  "compilerOptions": {
    "allowJs": true,
    "allowSyntheticDefaultImports": true,
    "alwaysStrict": true,
    "baseUrl": ".",
    "checkJs": true,
    "declaration": false,
    "esModuleInterop": true,
    "importsNotUsedAsValues": "error",
    "incremental": true,
    "isolatedModules": false,
    "jsx": "react-jsx",
    "lib": ["dom", "dom.iterable", "ES2019"],
    "module": "ES2020",
    "moduleResolution": "node",
    "noEmit": true,
    "noImplicitAny": true,
    "noImplicitReturns": false,
    "noImplicitThis": true,
    "noUnusedLocals": true,
    "noUnusedParameters": true,
    "outDir": "dist",
    "paths": {
      "public": ["public/"]
    },
    "plugins": [
      {
        "name": "typescript-plugin-css-modules",
        "options": {
          "customMatcher": "\\.scss$"
        }
      }
    ],
    "pretty": true,
    "resolveJsonModule": true,
    "skipLibCheck": true,
    "sourceMap": true,
    "strictNullChecks": false,
    "target": "ES2019",
    "rootDirs": ["packages"]
  },
  "include": ["packages/**/*", "./**/*.ts", "**/*.tsx", "**/*.mdx"],
  "exclude": ["node_modules/", ".yarn/"],
  "ts-node": {
    "esm": true,
    "experimentalSpecifierResolution": "node",
    "require": ["tsconfig-paths/register", "ts-node/register"]
  }
}

  • package.json:
{
  "name": "import-error",
  "packageManager": "[email protected]",
  "workspaces": [
    "packages/*"
  ],
  "dependencies": {
    "@mdx-js/loader": "^3.0.0",
    "eslint-mdx": "^3.0.0",
    "eslint-plugin-mdx": "^3.0.0",
    "jsdom-global": "^3.0.2",
    "react": "17.0.2",
    "react-dom": "17.0.2",
    "react-redux": "7.2.9",
    "react-router": "6.20.1",
    "react-router-dom": "6.20.1",
    "react-router-hash-link": "^2.4.3",
    "redux": "4.2.1",
    "rehype-external-links": "2.0.1",
    "rehype-react": "7.1.1",
    "source-map-support": "^0.5.21",
    "ts-node": "^10.9.2",
    "tsconfig-paths": "^4.2.0"
  },
  "devDependencies": {
    "@testing-library/react": "14.1.2",
    "@types/chai": "4.3.11",
    "@types/chai-dom": "1.11.3",
    "@types/mocha": "10.0.6",
    "@types/node": "20.10.4",
    "@types/react": "17.0.71",
    "@types/react-dom": "17.0.25",
    "@types/react-router-dom": "5.3.3",
    "@typescript-eslint/eslint-plugin": "6.14.0",
    "@typescript-eslint/parser": "6.14.0",
    "chai": "5.0.0",
    "chai-dom": "1.12.0",
    "cross-env": "7.0.3",
    "css-loader": "6.8.1",
    "css-minimizer-webpack-plugin": "5.0.1",
    "cssnano": "6.0.1",
    "eslint": "8.55.0",
    "eslint-config-prettier": "9.1.0",
    "eslint-plugin-css-modules": "2.12.0",
    "eslint-plugin-react": "7.33.2",
    "eslint-plugin-react-hooks": "4.6.0",
    "eslint-plugin-storybook": "^0.6.15",
    "fork-ts-checker-webpack-plugin": "9.0.2",
    "global-jsdom": "9.2.0",
    "jsdom": "23.0.1",
    "lint-staged": "15.2.0",
    "mocha": "10.2.0",
    "node-abi": "3.52.0",
    "node-gyp": "10.0.1",
    "node-loader": "2.0.0",
    "npm-run-all": "4.1.5",
    "postcss": "8.4.32",
    "postcss-loader": "7.3.3",
    "postcss-scss": "4.0.9",
    "prettier": "3.1.1",
    "sass": "1.69.5",
    "sass-loader": "13.3.2",
    "semver": "^7.5.4",
    "style-loader": "3.3.3",
    "typescript": "5.3.3",
    "typescript-plugin-css-modules": "5.0.2",
    "webpack": "5.74.0",
    "webpack-bundle-analyzer": "4.10.1",
    "webpack-cli": "5.1.4",
    "webpack-dev-server": "4.15.1",
    "webpack-merge": "5.10.0",
    "workbox-webpack-plugin": "7.0.0"
  },
  "engines": {
    "node": ">=16"
  },
  "scripts": {
    "test": "cross-env TS_NODE_FILES=true TS_NODE_BASEURL=. TS_NODE_PROJECT=tsconfig.json mocha --enable-source-maps"
  },
  "type": "module"
}

  • Operating system and version: Windows 10

This is my first issue raised here - can provide more details if needed. Any help is much appreciated, as have tried what feels like every solution regarding tsconfig-paths/register, path mapping etc to no avail.

alicegherbison avatar Jan 16 '24 12:01 alicegherbison

I also encountered a similar error. When I use

"imports": {
    "#fs": {
      "node": "fs",
      "default": "./src/fs.ts"
    }
 }

in the package

A

E:\Dev\node_modules\ts-node\dist-raw\node-internal-modules-esm-resolve.js:757
  throw new ERR_MODULE_NOT_FOUND(packageName, fileURLToPath(base));
        ^
CustomError: Cannot find package 'fs' imported from E:\Dev\package.json
    at packageResolve (E:\Dev\node_modules\ts-node\dist-raw\node-internal-modules-esm-resolve.js:757:9)
    at resolvePackageTargetString (E:\Dev\node_modules\ts-node\dist-raw\node-internal-modules-esm-resolve.js:424:16)
    at resolvePackageTarget (E:\Dev\node_modules\ts-node\dist-raw\node-internal-modules-esm-resolve.js:464:12)
    at resolvePackageTarget (E:\Dev\node_modules\ts-node\dist-raw\node-internal-modules-esm-resolve.js:510:26)
    at packageImportsResolve (E:\Dev\node_modules\ts-node\dist-raw\node-internal-modules-esm-resolve.js:620:26)
    at moduleResolve (E:\Dev\node_modules\ts-node\dist-raw\node-internal-modules-esm-resolve.js:793:21)
    at Object.defaultResolve (E:\Dev\node_modules\ts-node\dist-raw\node-internal-modules-esm-resolve.js:912:11)
    at E:\Dev\node_modules\ts-node\src\esm.ts:218:35
    at entrypointFallback (E:\Dev\node_modules\ts-node\src\esm.ts:168:34)
    at E:\Dev\node_modules\ts-node\src\esm.ts:217:14
[nodemon] app crashed - waiting for file changes before starting...

error will appear.

When I change the value of node under imports #fs to ./src/fs.ts , it works normally. I think maybe ts-node cannot parse the node built-in module in Subpath imports.

hoshyo avatar Jan 31 '24 08:01 hoshyo