json-schema-library icon indicating copy to clipboard operation
json-schema-library copied to clipboard

Doesn't work with native ESM modules

Open tmcw opened this issue 1 year ago • 4 comments
trafficstars

If I create a module:

package.json:

{
  "type": "module",
  "name": "20240613114707-1603",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "json-schema-library": "^9.3.5"
  }
}

index.mjs:

import { Draft2019 } from "json-schema-library";

console.log(Draft2019);

And run it, then this module doesn't provide the expected exports:

➜ node index.mjs
file:///Users/tmcw/tmp/20240613114707-1603/index.mjs:1
import { Draft2019 } from "json-schema-library";
         ^^^^^^^^^
SyntaxError: Named export 'Draft2019' not found. The requested module 'json-schema-library' is a CommonJS module, which may not support all module.exports as named exports.
CommonJS modules can always be imported via the default export, for example using:

import pkg from 'json-schema-library';
const { Draft2019 } = pkg;

    at ModuleJob._instantiate (node:internal/modules/esm/module_job:132:21)
    at async ModuleJob.run (node:internal/modules/esm/module_job:214:5)
    at async ModuleLoader.import (node:internal/modules/esm/loader:329:24)
    at async loadESM (node:internal/process/esm_loader:28:7)
    at async handleMainPromise (node:internal/modules/run_main:113:12)

Node.js v20.11.0

It looks like the ESM mode of using this module doesn't work - there isn't a type: module, or an exports: property in package.json.

It also looks like the modules that are getting generated by the tsconfig use imports that lack .js extensions, so the source won't be compatible with native ESM either.

tmcw avatar Jun 13 '24 15:06 tmcw

Hi Tom,

  • the readme refers to version 10, which is currently released as a pre-release version [email protected]
  • installing the current latest version you have to reference the readme for version 9

In your case, either install [email protected]. Do this, if you need Draft-2019 support. Here you would be an early adapter, but overall this is the most compliant release yet.

Or start using Draft-07 with import { Draft7 } from "json-schema-library" as is documented here https://github.com/sagold/json-schema-library/tree/d2d6e6451ea3f3b8c056f497182fd805226a20a7

This is not self explanatory and I will add a clarification to the readme.

Sorry for the inconvenience, Sascha

sagold avatar Jun 13 '24 19:06 sagold

Hi - I don't think that's the issue, installing 10.0.0-rc1 doesn't resolve the issue, and the issue is about ESM exports and compatibility - if I dial it back to just Draft

import { Draft } from "json-schema-library";

console.log(Draft);

This still produces the error with the given repro:

file:///Users/tmcw/tmp/20240613162355-25356/index.mjs:1
import { Draft } from "json-schema-library";
         ^^^^^
SyntaxError: Named export 'Draft' not found. The requested module 'json-schema-library' is a CommonJS module, which may not support all module.exports as named exports.
CommonJS modules can always be imported via the default export, for example using:

import pkg from 'json-schema-library';
const { Draft } = pkg;

tmcw avatar Jun 13 '24 20:06 tmcw

Note previous discussion on this topic https://github.com/sagold/json-schema-library/issues/51

Can you share a simple build-setup to reproduce your issue?

sagold avatar Jun 15 '24 07:06 sagold

The top post is a complete setup for reproducing the issue - here's the same thing as a gist if you want something git-clonable.

tmcw avatar Jun 15 '24 14:06 tmcw

With [email protected] an esm bundle is exporte. I can correctly import this library using node 22.21.0 although a type: "module" is not specified in the package.json.

If this still fails we need to follow: https://github.com/sagold/json-schema-library/pull/74 and change the code base to use proper esm module syntax.

sagold avatar Oct 26 '25 21:10 sagold