-
Notifications
You must be signed in to change notification settings - Fork 132
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Adds es modules support and tests #126
Changes from all commits
46729a9
fec2197
0ff4aef
ad71efd
3160d50
d819465
cf03cbb
c7980ae
965b93e
1007d3e
964103a
2ee4347
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,57 @@ | ||
name: CI | ||
|
||
on: pull_request | ||
|
||
jobs: | ||
ci: | ||
runs-on: ubuntu-latest | ||
|
||
strategy: | ||
matrix: | ||
node-version: [10.x, 12.x, 14.x] | ||
|
||
steps: | ||
- uses: actions/checkout@v2 | ||
|
||
- name: Use node version ${{ matrix.node-version }} | ||
uses: actions/setup-node@v1 | ||
with: | ||
node-version: ${{ matrix.node-version }} | ||
|
||
- name: Setup Testing Infra | ||
run: | | ||
cd test | ||
npm install | ||
|
||
- name: "CommonJS Test" | ||
run: | | ||
cd test/cjs | ||
npm run test | ||
|
||
- name: "ES Modules Test" | ||
run: | | ||
cd test/esm-node-native | ||
npm run test | ||
if: ${{ matrix.node-version == '14.x' }} | ||
|
||
- name: "Validate ES Modules == CommonJS" | ||
run: | | ||
cd test/validateModuleExportsMatchCommonJS | ||
npm run test | ||
if: ${{ matrix.node-version == '14.x' }} | ||
|
||
- name: "Rollup Tree-shaking Test" | ||
run: | | ||
cd test/rollup-modules | ||
npm run test | ||
|
||
- name: "Webpack Tree-shaking Test" | ||
run: | | ||
cd test/webpack-modules | ||
npm run test | ||
|
||
- name: "Snowpack Tree-shaking Test" | ||
run: | | ||
cd test/snowpack-modules | ||
npm run test | ||
if: ${{ matrix.node-version == '14.x' }} |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -2,3 +2,5 @@ | |
.github | ||
bower.json | ||
docs | ||
test | ||
.npmrc |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
package-lock=false |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,51 @@ | ||
import tslib from '../tslib.js'; | ||
const { | ||
orta marked this conversation as resolved.
Show resolved
Hide resolved
|
||
__extends, | ||
__assign, | ||
__rest, | ||
__decorate, | ||
__param, | ||
__metadata, | ||
__awaiter, | ||
__generator, | ||
__exportStar, | ||
__createBinding, | ||
__values, | ||
__read, | ||
__spread, | ||
__spreadArrays, | ||
__await, | ||
__asyncGenerator, | ||
__asyncDelegator, | ||
__asyncValues, | ||
__makeTemplateObject, | ||
__importStar, | ||
__importDefault, | ||
__classPrivateFieldGet, | ||
__classPrivateFieldSet, | ||
} = tslib; | ||
export { | ||
__extends, | ||
__assign, | ||
__rest, | ||
__decorate, | ||
__param, | ||
__metadata, | ||
__awaiter, | ||
__generator, | ||
__exportStar, | ||
__createBinding, | ||
__values, | ||
__read, | ||
__spread, | ||
__spreadArrays, | ||
__await, | ||
__asyncGenerator, | ||
__asyncDelegator, | ||
__asyncValues, | ||
__makeTemplateObject, | ||
__importStar, | ||
__importDefault, | ||
__classPrivateFieldGet, | ||
__classPrivateFieldSet, | ||
}; |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
{ | ||
"type": "module" | ||
} | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This pattern definitely works if the There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Curious, what was the point of adding this almost empty package.json with no package name, no package version? Sincerely, There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. https://nodejs.org/api/packages.html#type
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Hmm, is it best to comprehensively interpret this spec like this though? To just drop a nested, nearly empty And how is an NPM package like pkg-dir expected to behave now, in it's claim to:
The above It seems the case that NOT using the There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
The spec is quite intentionally written like this as far as I know. It intentionally doesn't use something like "package.json at the root of the package directory" multiple times
Even before node has supported
I'm not sure if this package is implemented correctly but a lot of similar resolvers were implemented correctly in the past. All modern module bundlers etc already work just OK with those nested |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -25,5 +25,12 @@ | |
"module": "tslib.es6.js", | ||
"jsnext:main": "tslib.es6.js", | ||
"typings": "tslib.d.ts", | ||
"sideEffects": false | ||
"sideEffects": false, | ||
"exports": { | ||
".": { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Please provide There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I'm open to covering this in a new PR, that gist isn't really enough docs for me to go with yet There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Sure, can be added afterwards. There are no real docs for this yet on their page but this gist has been updated multiple times when they have been iterating over semantics. This is already implemented and shipped in webpack 5 RC. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @Andarist do you have any examples of packages using the There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @guybedford I did not (mainly because conditional exports themselves are rather rare to find so far), but I've decided to showcase this using one of my smaller modules. Here are exports that I have defined: The input for this is as simple as: // cjs-file.js
module.exports = require("callbag-last-element").default;
// index.js
import lastElement from "callbag-last-element";
import lastElementFromCjs from "./cjs-file";
console.log({ lastElement, lastElementFromCjs }); and can be found here (same repo) |
||
"import": "./modules/index.js", | ||
"default": "./tslib.js" | ||
}, | ||
"./": "./" | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
package-lock.json | ||
rbuckton marked this conversation as resolved.
Show resolved
Hide resolved
|
||
*/build |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
### Tests | ||
|
||
Each folder has a `test` script which imports `tslib` via node_modules. | ||
In order to run these tests, you first need to run `npm install` in this folder. |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
const tslib = require("tslib"); | ||
if (typeof tslib.__awaiter !== "function") throw new Error("Missing expected helper __awaiter"); |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
{ | ||
"private": true, | ||
"scripts": { | ||
orta marked this conversation as resolved.
Show resolved
Hide resolved
|
||
"test": "node index.js" | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
import { __awaiter } from "tslib"; | ||
if (typeof __awaiter !== "function") throw new Error("Missing expected helper __awaiter"); |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
{ | ||
"type": "module", | ||
"scripts": { | ||
"test": "node index.js" | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
{ | ||
"dependencies": { | ||
"tslib": "file:..", | ||
"rollup": "2.28.2", | ||
"@rollup/plugin-node-resolve": "9.0.0", | ||
"webpack": "4.44.2", | ||
"webpack-cli": "3.3.12", | ||
"snowpack": "^2.12.1" | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
import { __awaiter } from "tslib"; | ||
if (typeof __awaiter !== "function") throw new Error("Missing expected helper __awaiter"); |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
{ | ||
"scripts": { | ||
"test": "../node_modules/.bin/rollup -c rollup.config.js && node build/index.js" | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
import { nodeResolve } from '@rollup/plugin-node-resolve'; | ||
|
||
export default { | ||
input: 'index.js', | ||
output: { | ||
dir: 'build', | ||
format: 'cjs' | ||
}, | ||
plugins: [nodeResolve()] | ||
}; |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
import { __awaiter } from "tslib"; | ||
if (typeof __awaiter !== "function") throw new Error("Missing expected helper __awaiter"); |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
{ | ||
"type": "module", | ||
|
||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Not required, but I'd be tempted to say you should move the There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Aye, normally this is something I'd just throw into a yarn workspace and forget, but I'll make them all conform to a similar scripts structure then just loop through them |
||
"scripts": { | ||
"test": "../node_modules/.bin/snowpack build; node build/index.js" | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,23 @@ | ||
// When on node 14, it validates that all of the commonjs exports | ||
// are correctly re-exported for es modules importers. | ||
|
||
const nodeMajor = Number(process.version.split(".")[0].slice(1)) | ||
if (nodeMajor < 14) { | ||
console.log("Skipping because node does not support module exports.") | ||
process.exit(0) | ||
} | ||
|
||
// ES Modules import via the ./modules folder | ||
import * as esTSLib from "../../modules/index.js" | ||
|
||
// Force a commonjs resolve | ||
import { createRequire } from "module"; | ||
const commonJSTSLib = createRequire(import.meta.url)("../../tslib.js"); | ||
|
||
for (const key in commonJSTSLib) { | ||
if (commonJSTSLib.hasOwnProperty(key)) { | ||
if(!esTSLib[key]) throw new Error(`ESModules is missing ${key} - it needs to be re-exported in ./modules/index.js`) | ||
} | ||
} | ||
|
||
console.log("All exports in commonjs are available for es module consumers.") |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
{ | ||
"type": "module", | ||
"scripts": { | ||
"test": "node index.js" | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
import { __awaiter } from "tslib"; | ||
if (typeof __awaiter !== "function") throw new Error("Missing expected helper __awaiter"); |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
{ | ||
"scripts": { | ||
"test": "../node_modules/.bin/webpack && node build/main.js" | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
const path = require('path'); | ||
|
||
/** @type {import("webpack").Configuration} */ | ||
const config = { | ||
mode: "production", | ||
entry: "./index", | ||
output: { | ||
path: path.join(process.cwd(), 'build') | ||
} | ||
} | ||
|
||
module.exports = config |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why not add scripts to copy
tslib.es6.js
tomodules/index.js
?import cjs from mjs will cause warning in Angular CLI.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Just wanna add that I was getting an error around this line in a react application after this update:
Let me know if I shall create an issue for this.
Some specs:
React 16.13.0
Bundled using: Webpack 5
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@udayrajMT if you could make a sample that'd be great, I have some webpack tests using modules in here but must have missed something 👍🏻
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Tried running it on a react-start-kit with the upgraded version, but that seems to run fine 🤔
Will check my configuration again and let you know if I find a way to reproduce the issue in a standalone app