import-js / eslint-plugin-import

ESLint plugin with rules that help validate proper imports.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Does a resolver have to be cjs?

nnmrts opened this issue · comments

I wrote this dummy resolver:

// deno-resolver.js
const interfaceVersion = 2;

/**
 *
 * @param source
 * @param file
 * @param config
 * @example
 */
const resolve = (source, file, config) => {
	console.log("TEST");
};

export {
	interfaceVersion,
	resolve
};

And added this to my eslint config settings:

{
	"import/resolver": "deno-resolver.js",
}

Now, when I run npx eslint . in the same folder, instead of logging "TEST" and then failing, it immediately errors with this:

/Users/nnmrts/projects/eslint-config/config.js
  1:1   warning  Resolve error: Error [ERR_REQUIRE_ESM]: require() of ES Module /Users/nnmrts/projects/eslint-config/deno-resolver.js from /Users/nnmrts/projects/eslint-config/node_modules/eslint-module-utils/resolve.js not supported.
Instead change the require of deno-resolver.js in /Users/nnmrts/projects/eslint-config/node_modules/eslint-module-utils/resolve.js to a dynamic import() which is available in all CommonJS modules.
    at tryRequire (/Users/nnmrts/projects/eslint-config/node_modules/eslint-module-utils/resolve.js:57:10)
    at requireResolver (/Users/nnmrts/projects/eslint-config/node_modules/eslint-module-utils/resolve.js:196:8)
    at fullResolve (/Users/nnmrts/projects/eslint-config/node_modules/eslint-module-utils/resolve.js:141:22)
    at relative (/Users/nnmrts/projects/eslint-config/node_modules/eslint-module-utils/resolve.js:158:10)
    at resolve (/Users/nnmrts/projects/eslint-config/node_modules/eslint-module-utils/resolve.js:232:12)  import/no-deprecated
  1:1   error    Resolve error: Error [ERR_REQUIRE_ESM]: require() of ES Module /Users/nnmrts/projects/eslint-config/deno-resolver.js from /Users/nnmrts/projects/eslint-config/node_modules/eslint-module-utils/resolve.js not supported.
Instead change the require of deno-resolver.js in /Users/nnmrts/projects/eslint-config/node_modules/eslint-module-utils/resolve.js to a dynamic import() which is available in all CommonJS modules.
    at tryRequire (/Users/nnmrts/projects/eslint-config/node_modules/eslint-module-utils/resolve.js:57:10)
    at requireResolver (/Users/nnmrts/projects/eslint-config/node_modules/eslint-module-utils/resolve.js:196:8)
    at fullResolve (/Users/nnmrts/projects/eslint-config/node_modules/eslint-module-utils/resolve.js:141:22)
    at relative (/Users/nnmrts/projects/eslint-config/node_modules/eslint-module-utils/resolve.js:158:10)
    at resolve (/Users/nnmrts/projects/eslint-config/node_modules/eslint-module-utils/resolve.js:232:12)  import/namespace
  1:1   error    Resolve error: Error [ERR_REQUIRE_ESM]: require() of ES Module /Users/nnmrts/projects/eslint-config/deno-resolver.js from /Users/nnmrts/projects/eslint-config/node_modules/eslint-module-utils/resolve.js not supported.
Instead change the require of deno-resolver.js in /Users/nnmrts/projects/eslint-config/node_modules/eslint-module-utils/resolve.js to a dynamic import() which is available in all CommonJS modules.
    at tryRequire (/Users/nnmrts/projects/eslint-config/node_modules/eslint-module-utils/resolve.js:57:10)
    at requireResolver (/Users/nnmrts/projects/eslint-config/node_modules/eslint-module-utils/resolve.js:196:8)
    at fullResolve (/Users/nnmrts/projects/eslint-config/node_modules/eslint-module-utils/resolve.js:141:22)
    at relative (/Users/nnmrts/projects/eslint-config/node_modules/eslint-module-utils/resolve.js:158:10)
    at resolve (/Users/nnmrts/projects/eslint-config/node_modules/eslint-module-utils/resolve.js:232:12)  import/default
...

Is this expected? Does my resolver really need to be written in CJS now?

Below is my "full" config file, if you want to look even deeper, you can look at https://github.com/pumpncode/eslint-config.

import globals from "globals";

import plugins from "./plugins.js";
import rules from "./rules.js";

const cssFilesRefreshRate = 5_000;

const convertedGlobals = Object.fromEntries(
	Object.entries({
		...globals.browser,
		...globals.builtin
	})
		.map(([global, isWritable]) => [
			global,
			isWritable
				? "writable"
				: "readonly"
		])
);

const config = [
	{
		ignores: [
			"_fresh/**",
			"documentation/**",
			"patches/**"
		]
	},
	{
		files: ["**/*.{js,mjs,cjs,jsx,mjsx,ts,tsx,mtsx}"],
		languageOptions: {
			ecmaVersion: "latest",
			globals: {
				Deno: "readonly",
				...convertedGlobals
			},
			parserOptions: {
				ecmaFeatures: {
					jsx: true
				},
				ecmaVersion: "latest",
				jsxPragma: null,
				requireConfigFile: false,
				sourceType: "module"
			},
			sourceType: "module"
		},
		linterOptions: {
			noInlineConfig: false,
			reportUnusedDisableDirectives: "error"
		},
		plugins,
		rules,
		settings: {
			formComponents: ["Form"],
			"import/core-modules": [],
			"import/extensions": [
				".js",
				".mjs",
				".jsx"
			],
			"import/parsers": {
				espree: [
					".js",
					".cjs",
					".mjs",
					".jsx"
				]
			},
			"import/resolver": "deno-resolver.js",
			jsdoc: {
				mode: "typescript",
				tagNamePreference: {
					augments: "extends",
					extends: "extends",
					function: "method",
					method: "method"
				}
			},
			linkComponents: [
				{
					linkAttribute: "to",
					name: "Link"
				}
			],
			react: {
				pragma: "h",
				version: "18"
			},
			regexp: {
				allowedCharacterRanges: ["alphanumeric"]
			},
			tailwindcss: {
				callees: [
					"classnames",
					"clsx",
					"ctl"
				],
				classRegex: "^class(Name)?$",
				config: "tailwind.config.js",
				cssFiles: [
					"**/*.css",
					"!**/node_modules",
					"!**/.*",
					"!**/dist",
					"!**/build"
				],
				cssFilesRefreshRate,
				removeDuplicates: true,
				skipClassAttribute: false,
				tags: [],
				whitelist: []
			}
		}
	},
	{
		files: ["**/*.{jsx,mjsx,tsx,mtsx}"],
		rules: {
			"jsdoc/require-param": ["warn", { unnamedRootBase: ["props"] }]
		}
	},
	{
		files: ["**/_exports.?(*.)js"],
		rules: {
			"import/max-dependencies": "off",
			"import/prefer-default-export": "off"
		}
	},
	{
		files: [
			"benchmarks/**/*",
			"tests/**/*",
			"scripts/**/*"
		],
		rules: {
			"import/no-unused-modules": "off",
			"import/unambiguous": "off"
		}
	}
];

export default config;

Yes, because ESM can’t be synchronously consumed by CJS.