sagold / json-schema-library

Customizable and hackable json-validator and json-schema utilities for traversal, data generation and validation
MIT License
163 stars 19 forks source link

Doesn't work with native ESM modules #59

Open tmcw opened 2 weeks ago

tmcw commented 2 weeks ago

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.

sagold commented 2 weeks ago

Hi Tom,

In your case, either install json-schema-library@10.0.0-rc1. 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

tmcw commented 2 weeks ago

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;
sagold commented 2 weeks ago

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?

tmcw commented 2 weeks ago

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.