diff --git a/package.json b/package.json index e45e27f791e3..270e0f87ebf0 100644 --- a/package.json +++ b/package.json @@ -20,8 +20,13 @@ "types": "./dist", "type": "commonjs", "exports": { - "import": "./dist/index.mjs", - "require": "./dist/index.js" + ".": { + "import": "./dist/index.mjs", + "require": "./dist/index.js" + }, + "./lib/*": "./dist/lib/*.js", + "./lib/errors": "./dist/lib/errors/index.js", + "./*": "./*" }, "engines": { "node": ">=10.0.0" diff --git a/test/registerEsbuild.js b/test/registerEsbuild.js index 82f12561c148..43e1078dd167 100644 --- a/test/registerEsbuild.js +++ b/test/registerEsbuild.js @@ -5,9 +5,20 @@ const esbuild = require('esbuild'); const moduleAlias = require('module-alias'); const sourceMapSupport = require('source-map-support'); -const distDir = path.join(__dirname, '../dist'); -// make imports from `sequelize/` go to `../dist/` -moduleAlias.addAlias('sequelize', distDir); +const nodeMajorVersion = Number(process.version.match(/(?<=^v)\d+/)); + +// for node >= 12, we use the package.json "export" property to +// map imports to dist (except package.json) +// so "sequelize/lib/errors" is actually mapped to "sequelize/dist/errors/index.js" +// (see package.json). +if (nodeMajorVersion < 12) { + const jsonFile = path.join(__dirname, '..', 'package.json'); + moduleAlias.addAlias('sequelize/package.json', jsonFile); + + const distDir = path.join(__dirname, '../dist'); + // make imports from `sequelize/` go to `../dist/` + moduleAlias.addAlias('sequelize', distDir); +} const maps = {}; diff --git a/test/unit/deep-exports.test.js b/test/unit/deep-exports.test.js new file mode 100644 index 000000000000..85ae4c47321a --- /dev/null +++ b/test/unit/deep-exports.test.js @@ -0,0 +1,30 @@ +const chai = require('chai'), + expect = chai.expect; + +/** + * Tests whether users can import files deeper than "sequelize" (eg. "sequelize/package.json"). + * Context: https://github.com/sequelize/sequelize/issues/13787 + */ + +const nodeMajorVersion = Number(process.version.match(/(?<=^v)\d+/)); + +describe('exports', () => { + it('exposes /package.json', async () => { + // TODO: uncomment test once https://nodejs.org/api/esm.html#json-modules are stable + // if (nodeMajorVersion >= 16) { + // await import('sequelize/package.json', { + // assert: { type: 'json' } + // }); + // } + + require('sequelize/package.json'); + }); + + it('exposes lib files', async () => { + if (nodeMajorVersion >= 12) { + await import('sequelize/lib/model'); + } + + require('sequelize/lib/model'); + }); +}); diff --git a/test/unit/dialects/abstract/query.test.js b/test/unit/dialects/abstract/query.test.js index e01c326b8014..eaa62419d558 100644 --- a/test/unit/dialects/abstract/query.test.js +++ b/test/unit/dialects/abstract/query.test.js @@ -1,7 +1,7 @@ 'use strict'; const path = require('path'); -const Query = require('sequelize/lib/dialects/abstract/query.js'); +const Query = require('sequelize/lib/dialects/abstract/query'); const Support = require(path.join(__dirname, './../../support')); const chai = require('chai'); const { stub, match } = require('sinon'); diff --git a/test/unit/dialects/mssql/query.test.js b/test/unit/dialects/mssql/query.test.js index d2e9be0799e4..4e35145ba4d4 100644 --- a/test/unit/dialects/mssql/query.test.js +++ b/test/unit/dialects/mssql/query.test.js @@ -1,7 +1,7 @@ 'use strict'; const path = require('path'); -const Query = require('sequelize/lib/dialects/mssql/query.js'); +const Query = require('sequelize/lib/dialects/mssql/query'); const Support = require('../../support'); const dialect = Support.getTestDialect(); const sequelize = Support.sequelize; diff --git a/test/unit/dialects/mysql/query.test.js b/test/unit/dialects/mysql/query.test.js index c6478c944f0f..3b7cbe1850dd 100644 --- a/test/unit/dialects/mysql/query.test.js +++ b/test/unit/dialects/mysql/query.test.js @@ -1,7 +1,7 @@ 'use strict'; const path = require('path'); -const Query = require('sequelize/lib/dialects/mysql/query.js'); +const Query = require('sequelize/lib/dialects/mysql/query'); const Support = require(path.join(__dirname, './../../support')); const chai = require('chai'); const sinon = require('sinon'); diff --git a/test/unit/dialects/snowflake/query.test.js b/test/unit/dialects/snowflake/query.test.js index 9f0360b9093a..69cb2e59c490 100644 --- a/test/unit/dialects/snowflake/query.test.js +++ b/test/unit/dialects/snowflake/query.test.js @@ -1,7 +1,7 @@ 'use strict'; const path = require('path'); -const Query = require('sequelize/lib/dialects/snowflake/query.js'); +const Query = require('sequelize/lib/dialects/snowflake/query'); const Support = require(path.join(__dirname, './../../support')); const chai = require('chai'); const sinon = require('sinon');