-
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
Validate export structure of every entrypoint #269
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
This file was deleted.
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 is redundant with new tests |
This file was deleted.
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 is redundant with new tests |
This file was deleted.
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,38 @@ | ||
import assert from "node:assert"; | ||
import { test } from "node:test"; | ||
|
||
import * as tslibJs from "tslib/tslib.js"; | ||
import * as tslibEs6Js from "tslib/tslib.es6.js"; | ||
import * as tslibEs6Mjs from "tslib/tslib.es6.mjs"; | ||
import * as tslibModulesIndex from "tslib/modules/index.js"; | ||
|
||
test("all helpers available as named exports", () => { | ||
compareKeys("tslib.js", tslibJs, "tslib.es6.js", tslibEs6Js); | ||
compareKeys("tslib.js", tslibJs, "tslib.es6.mjs", tslibEs6Mjs); | ||
compareKeys("tslib.js", tslibJs, "modules/index.js", tslibModulesIndex); | ||
}); | ||
|
||
test("default export contains all named exports", () => { | ||
assert.ok(tslibJs.default); | ||
compareKeys("tslib.js (default export)", tslibJs.default, "tslib.js (namespace)", tslibJs); | ||
assert.ok(tslibEs6Js.default); | ||
compareKeys("tslib.es6.js (default export)", tslibEs6Js.default, "tslib.es6.js (namespace)", tslibEs6Js); | ||
assert.ok(tslibEs6Mjs.default); | ||
compareKeys("tslib.es6.mjs (default export)", tslibEs6Mjs.default, "tslib.es6.mjs (namespace)", tslibEs6Mjs); | ||
}); | ||
|
||
/** | ||
* @param {string} name1 | ||
* @param {object} tslib1 | ||
* @param {string} name2 | ||
* @param {object} tslib2 | ||
*/ | ||
function compareKeys(name1, tslib1, name2, tslib2) { | ||
const difference = new Set(Object.keys(tslib1)).symmetricDifference(new Set(Object.keys(tslib2))); | ||
difference.delete("__esModule"); | ||
difference.delete("default"); // Asserted separately where expected | ||
const messages = Array.from(difference).map(missing => `'${missing}' missing in ${missing in tslib1 ? name2 : name1}`); | ||
if (messages.length > 0) { | ||
assert.fail(`Mismatch between ${name1} and ${name2}:\n\n ${messages.join("\n ")}\n`); | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
{ | ||
"type": "module", | ||
"scripts": { | ||
"test": "node --test --experimental-detect-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. I meant to unstage this, but will use it in a follow-up PR |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,24 @@ | ||
import { describe } from "node:test"; | ||
|
||
import * as tslibJs from "tslib/tslib.js"; | ||
import * as tslibEs6Js from "tslib/tslib.es6.js"; | ||
import * as tslibEs6Mjs from "tslib/tslib.es6.mjs"; | ||
|
||
/** | ||
* @template {keyof tslibJs} K | ||
* @param {K} helperName | ||
* @param {(helper: tslibJs[K]) => any} test | ||
*/ | ||
export function testHelper(helperName, test) { | ||
describe(helperName, () => { | ||
describe("tslib.js", () => { | ||
test(tslibJs[helperName]); | ||
}); | ||
describe("tslib.es6.js", () => { | ||
test(tslibEs6Js[helperName]); | ||
}); | ||
describe("tslib.es6.mjs", () => { | ||
test(tslibEs6Mjs[helperName]); | ||
}); | ||
}); | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
{ | ||
"compilerOptions": { | ||
"module": "NodeNext", | ||
"checkJs": true, | ||
"noEmit": true, | ||
"strict": true, | ||
"forceConsistentCasingInFileNames": true, | ||
"types": ["node"], | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,11 +1,10 @@ | ||
{ | ||
"dependencies": { | ||
"chalk": "^4.1.2", | ||
"rollup": "4.22.0", | ||
"tslib": "file:..", | ||
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. Maybe not new in this PR but IIRC this tells the package manager to copy the package and not make a link, making iterative testing more annoying. 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. It’s definitely a symlink in npm |
||
"rollup": "2.28.2", | ||
"@rollup/plugin-node-resolve": "9.0.0", | ||
"webpack": "4.44.2", | ||
"webpack-cli": "3.3.12", | ||
"snowpack": "2.12.1", | ||
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. snowpack is no longer being maintained |
||
"vite": "2.8.0" | ||
"vite": "5.4.6", | ||
"webpack": "5.94.0", | ||
"webpack-cli": "5.1.4" | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,10 +1,7 @@ | ||
import { nodeResolve } from '@rollup/plugin-node-resolve'; | ||
|
||
export default { | ||
input: 'index.js', | ||
output: { | ||
dir: 'build', | ||
format: 'cjs' | ||
}, | ||
plugins: [nodeResolve()] | ||
}; |
This file was deleted.
This file was deleted.
This file was deleted.
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 is redundant with new tests |
This file was deleted.
This file was deleted.
This file was deleted.
This file was deleted.
This file was deleted.
This file was deleted.
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
{ | ||
"scripts": { | ||
"test": "webpack && node build/main.js" | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -354,6 +354,10 @@ export default { | |
__rest: __rest, | ||
__decorate: __decorate, | ||
__param: __param, | ||
__esDecorate: __esDecorate, | ||
__runInitializers: __runInitializers, | ||
__propKey: __propKey, | ||
__setFunctionName: __setFunctionName, | ||
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. New tests caught that these were missing 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 feel like the fact that we got away without these in the .es6 files would imply that nobody's using them... Or just I guess that the overlap of new features and these old files is small... 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. It’s not necessarily that nobody’s using these files; it’s that nobody’s using the default export from these files, which is only there for edge casey compat |
||
__metadata: __metadata, | ||
__awaiter: __awaiter, | ||
__generator: __generator, | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -427,3 +427,37 @@ var __disposeResources; | |
exporter("__addDisposableResource", __addDisposableResource); | ||
exporter("__disposeResources", __disposeResources); | ||
}); | ||
|
||
0 && (module.exports = { | ||
__extends, | ||
__assign, | ||
__rest, | ||
__decorate, | ||
__param, | ||
__esDecorate, | ||
__runInitializers, | ||
__propKey, | ||
__setFunctionName, | ||
__metadata, | ||
__awaiter, | ||
__generator, | ||
__exportStar, | ||
__createBinding, | ||
__values, | ||
__read, | ||
__spread, | ||
__spreadArrays, | ||
__spreadArray, | ||
__await, | ||
__asyncGenerator, | ||
__asyncDelegator, | ||
__asyncValues, | ||
__makeTemplateObject, | ||
__importStar, | ||
__importDefault, | ||
__classPrivateFieldGet, | ||
__classPrivateFieldSet, | ||
__classPrivateFieldIn, | ||
__addDisposableResource, | ||
__disposeResources, | ||
}); | ||
Comment on lines
+431
to
+463
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. New tests noticed that this compat hint was needed for named exports to be seen by Node.js ESM |
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.
I saw very little value in running tests on older Node.js versions since the vast majority of what we’re running is just infrastructure. I changed this because I’m using
Set.prototype.symmetricDifference
(v22+), as well as--expeimental-detect-module
(v20+ I think?) in order to load the otherwise-Node.js-invalid tslib.es6.js.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.
The only gotcha is that using
--experimental-detect-module
means we won't know if.es6
or whatever accidentally change to CJS, but I don't see any other way in node to load the wrong kind of file format. Other than to instead do these checks in playwright and use a real browser?