jaydenseric/apollo-upload-client

Linter error

eduardocque opened this issue · 4 comments

After update to v18.0.1 im getting the next error

Resolve error: Package subpath './createUploadLink' is not defined by "exports" in /node_modules/apollo-upload-client/package.json
    at new NodeError (node:internal/errors:399:5)
    at exportsNotFound (node:internal/modules/esm/resolve:361:10)
    at packageExportsResolve (node:internal/modules/esm/resolve:697:9)
    at resolveExports (node:internal/modules/cjs/loader:572:36)
    at Module._findPath (node:internal/modules/cjs/loader:641:31)
    at findModulePath (/node_modules/eslint-import-resolver-alias/index.js:99:27)

what can i do in this case ?

noticed that in your package.json in the exports section

"exports": {
   "./createUploadLink.mjs": "./createUploadLink.mjs",
   "./formDataAppendFile.mjs": "./formDataAppendFile.mjs",
   "./isExtractableFile.mjs": "./isExtractableFile.mjs",
   "./package.json": "./package.json"
 },

should be

"exports": {
  "./createUploadLink": "./createUploadLink.mjs",
  "./formDataAppendFile": "./formDataAppendFile.mjs",
  "./isExtractableFile": "./isExtractableFile.mjs",
  "./package": "./package.json"
},

or at least include both ways with and without .mjs

if not in any import with linters will fail here

import createUploadLink from 'apollo-upload-client/createUploadLink.mjs';

should be

import createUploadLink from 'apollo-upload-client/createUploadLink';

what do you think @jaydenseric ?

As per the v18 major changes:

  • Removed the package main index module; deep imports must be used. To migrate:

    - import {
    -   createUploadLink,
    -   formDataAppendFile,
    -   isExtractableFile
    - } from "apollo-upload-client";
    + import createUploadLink from "apollo-upload-client/createUploadLink.mjs";
    + import formDataAppendFile from "apollo-upload-client/formDataAppendFile.mjs";
    + import isExtractableFile from "apollo-upload-client/isExtractableFile.mjs";
  • Shortened public module deep import paths, removing the /public/. To migrate:

    - import createUploadLink from "apollo-upload-client/public/createUploadLink.js";
    + import createUploadLink from "apollo-upload-client/createUploadLink.mjs";
    
    - import formDataAppendFile from "apollo-upload-client/public/formDataAppendFile.js";
    + import formDataAppendFile from "apollo-upload-client/formDataAppendFile.mjs";
    
    - import isExtractableFile from "apollo-upload-client/public/isExtractableFile.js";
    + import isExtractableFile from "apollo-upload-client/isExtractableFile.mjs";

You must specify the full import path to the module, including the file extension .mjs.

There are reasons it's not a good idea to change the package field exports to allow extensionless imports.

i know that, but tools like eslint and plugins eslint-import-resolver-alias will complain, do you have a suggestion in that case ?

how we can make this friendly for linters or is there any special configuration that we needs to implement ?

Your linting is misconfigured, because it's wrong for your linting setup to report a correct import as a lint error, and it's wrong for it to suggest an incorrect import.

Out of the the box TypeScript in compilerOptions.module mode of "nodenext" is able to check your imports and report if the paths are incorrect; I don't recommend using ESLint to resolve and check import paths.

to make it works, had to add the next config inside settings in .eslintrc

settings: {
    'import/resolver': {
      alias: [
        [
          'apollo-upload-client/createUploadLink',
          path.resolve('./node_modules/apollo-upload-client/src/createUploadLink.mjs')
        ]
      ]
    }
  },

@jaydenseric will be good if this can be in the readme or some documentation related about how to implement the library.

Note: im using javascript so im using eslint to keep the code clean and normally evaluate imports as well and alias, the issue here was related to a plugin in eslint and alias

sorted, thx for the explanation