From 4f2902c1f4404a235368b5f80d1d12a816e32d80 Mon Sep 17 00:00:00 2001 From: Ron Buckton Date: Thu, 8 Aug 2024 12:13:40 -0400 Subject: [PATCH 01/19] Implement deterministic collapse of 'await' in 'await using' (#262) --- tslib.es6.js | 13 +++++++++---- tslib.es6.mjs | 15 ++++++++++----- tslib.js | 13 +++++++++---- 3 files changed, 28 insertions(+), 13 deletions(-) diff --git a/tslib.es6.js b/tslib.es6.js index b212c25..82db058 100644 --- a/tslib.es6.js +++ b/tslib.es6.js @@ -327,17 +327,22 @@ export function __disposeResources(env) { env.error = env.hasError ? new _SuppressedError(e, env.error, "An error was suppressed during disposal.") : e; env.hasError = true; } + var r, s = 0; function next() { - while (env.stack.length) { - var rec = env.stack.pop(); + while (r = env.stack.pop()) { try { - var result = rec.dispose && rec.dispose.call(rec.value); - if (rec.async) return Promise.resolve(result).then(next, function(e) { fail(e); return next(); }); + if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next); + if (r.dispose) { + var result = r.dispose.call(r.value); + if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); }); + } + else s |= 1; } catch (e) { fail(e); } } + if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve(); if (env.hasError) throw env.error; } return next(); diff --git a/tslib.es6.mjs b/tslib.es6.mjs index 0df91b1..f4cd5db 100644 --- a/tslib.es6.mjs +++ b/tslib.es6.mjs @@ -326,17 +326,22 @@ export function __disposeResources(env) { env.error = env.hasError ? new _SuppressedError(e, env.error, "An error was suppressed during disposal.") : e; env.hasError = true; } + var r, s = 0; function next() { - while (env.stack.length) { - var rec = env.stack.pop(); + while (r = env.stack.pop()) { try { - var result = rec.dispose && rec.dispose.call(rec.value); - if (rec.async) return Promise.resolve(result).then(next, function(e) { fail(e); return next(); }); + if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next); + if (r.dispose) { + var result = r.dispose.call(r.value); + if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); }); + } + else s |= 1; } catch (e) { - fail(e); + fail(e); } } + if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve(); if (env.hasError) throw env.error; } return next(); diff --git a/tslib.js b/tslib.js index 0f7c846..e74ecaa 100644 --- a/tslib.js +++ b/tslib.js @@ -374,17 +374,22 @@ var __disposeResources; env.error = env.hasError ? new _SuppressedError(e, env.error, "An error was suppressed during disposal.") : e; env.hasError = true; } + var r, s = 0; function next() { - while (env.stack.length) { - var rec = env.stack.pop(); + while (r = env.stack.pop()) { try { - var result = rec.dispose && rec.dispose.call(rec.value); - if (rec.async) return Promise.resolve(result).then(next, function(e) { fail(e); return next(); }); + if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next); + if (r.dispose) { + var result = r.dispose.call(r.value); + if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); }); + } + else s |= 1; } catch (e) { fail(e); } } + if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve(); if (env.hasError) throw env.error; } return next(); From 227b5d66a3e4c8c6c0bf2eb3eecbf78f4388b0fc Mon Sep 17 00:00:00 2001 From: Ron Buckton Date: Thu, 8 Aug 2024 12:29:11 -0400 Subject: [PATCH 02/19] Use global 'Iterator.prototype' for downlevel generators (#267) --- tslib.es6.js | 8 ++++---- tslib.es6.mjs | 8 ++++---- tslib.js | 8 ++++---- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/tslib.es6.js b/tslib.es6.js index 82db058..fc18d15 100644 --- a/tslib.es6.js +++ b/tslib.es6.js @@ -12,7 +12,7 @@ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ***************************************************************************** */ -/* global Reflect, Promise, SuppressedError, Symbol */ +/* global Reflect, Promise, SuppressedError, Symbol, Iterator */ var extendStatics = function(d, b) { extendStatics = Object.setPrototypeOf || @@ -123,8 +123,8 @@ export function __awaiter(thisArg, _arguments, P, generator) { } export function __generator(thisArg, body) { - var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype); + return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; function verb(n) { return function (v) { return step([n, v]); }; } function step(op) { if (f) throw new TypeError("Generator is already executing."); @@ -228,7 +228,7 @@ export function __await(v) { export function __asyncGenerator(thisArg, _arguments, generator) { if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); var g = generator.apply(thisArg, _arguments || []), i, q = []; - return i = {}, verb("next"), verb("throw"), verb("return", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i; + return i = Object.create((typeof AsyncIterator === "function" ? AsyncIterator : Object).prototype), verb("next"), verb("throw"), verb("return", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i; function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; } function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } } diff --git a/tslib.es6.mjs b/tslib.es6.mjs index f4cd5db..17bb2ff 100644 --- a/tslib.es6.mjs +++ b/tslib.es6.mjs @@ -12,7 +12,7 @@ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ***************************************************************************** */ -/* global Reflect, Promise, SuppressedError, Symbol */ +/* global Reflect, Promise, SuppressedError, Symbol, Iterator */ var extendStatics = function(d, b) { extendStatics = Object.setPrototypeOf || @@ -123,8 +123,8 @@ export function __awaiter(thisArg, _arguments, P, generator) { } export function __generator(thisArg, body) { - var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype); + return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; function verb(n) { return function (v) { return step([n, v]); }; } function step(op) { if (f) throw new TypeError("Generator is already executing."); @@ -228,7 +228,7 @@ export function __await(v) { export function __asyncGenerator(thisArg, _arguments, generator) { if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); var g = generator.apply(thisArg, _arguments || []), i, q = []; - return i = {}, verb("next"), verb("throw"), verb("return", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i; + return i = Object.create((typeof AsyncIterator === "function" ? AsyncIterator : Object).prototype), verb("next"), verb("throw"), verb("return", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i; function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; } function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } } diff --git a/tslib.js b/tslib.js index e74ecaa..429c11a 100644 --- a/tslib.js +++ b/tslib.js @@ -12,7 +12,7 @@ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ***************************************************************************** */ -/* global global, define, Symbol, Reflect, Promise, SuppressedError */ +/* global global, define, Symbol, Reflect, Promise, SuppressedError, Iterator */ var __extends; var __assign; var __rest; @@ -171,8 +171,8 @@ var __disposeResources; }; __generator = function (thisArg, body) { - var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype); + return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; function verb(n) { return function (v) { return step([n, v]); }; } function step(op) { if (f) throw new TypeError("Generator is already executing."); @@ -276,7 +276,7 @@ var __disposeResources; __asyncGenerator = function (thisArg, _arguments, generator) { if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); var g = generator.apply(thisArg, _arguments || []), i, q = []; - return i = {}, verb("next"), verb("throw"), verb("return", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i; + return i = Object.create((typeof AsyncIterator === "function" ? AsyncIterator : Object).prototype), verb("next"), verb("throw"), verb("return", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i; function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; } function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } } From 6abc075910605cc5c6c74d8566190ee865c9e672 Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Fri, 23 Aug 2024 12:51:40 -0700 Subject: [PATCH 03/19] Bump version to 2.7.0. --- bower.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/bower.json b/bower.json index ac4aab9..ab4829e 100644 --- a/bower.json +++ b/bower.json @@ -4,7 +4,7 @@ "Microsoft Corp." ], "homepage": "http://typescriptlang.org/", - "version": "2.6.0", + "version": "2.7.0", "license": "0BSD", "description": "Runtime library for TypeScript helper functions", "keywords": [ diff --git a/package.json b/package.json index a8646d5..a068b42 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "tslib", "author": "Microsoft Corp.", "homepage": "https://www.typescriptlang.org/", - "version": "2.6.3", + "version": "2.7.0", "license": "0BSD", "description": "Runtime library for TypeScript helper functions", "keywords": [ From f63baa34b729338b527ca0a550328876e43ad6f7 Mon Sep 17 00:00:00 2001 From: Andrew Branch Date: Thu, 19 Sep 2024 13:31:15 -0700 Subject: [PATCH 04/19] Test export structure --- .github/workflows/CI.yml | 11 +----- test/cjs/index.js | 2 - test/cjs/package.json | 6 --- test/esm-node-native/package.json | 9 ----- test/node/exportStructure.test.js | 38 +++++++++++++++++++ test/node/package.json | 6 +++ test/node/testHelper.js | 24 ++++++++++++ test/node/tsconfig.json | 10 +++++ test/package.json | 11 +++--- test/rollup-modules/rollup.config.js | 3 -- test/runTests.js | 6 +-- test/snowpack-modules/index.js | 2 - test/snowpack-modules/package.json | 10 ----- .../index.js | 17 --------- .../package.json | 6 --- test/webpack-4-modules/index.js | 2 - test/webpack-4-modules/package.json | 5 --- test/webpack-5-modules/index.js | 2 - test/webpack-5-modules/package.json | 10 ----- test/webpack-5-modules/webpack.config.js | 12 ------ .../index.js | 0 test/webpack-modules/package.json | 5 +++ .../webpack.config.js | 0 tslib.es6.js | 4 ++ tslib.es6.mjs | 4 ++ tslib.js | 34 +++++++++++++++++ 26 files changed, 135 insertions(+), 104 deletions(-) delete mode 100644 test/cjs/index.js delete mode 100644 test/cjs/package.json delete mode 100644 test/esm-node-native/package.json create mode 100644 test/node/exportStructure.test.js create mode 100644 test/node/package.json create mode 100644 test/node/testHelper.js create mode 100644 test/node/tsconfig.json delete mode 100644 test/snowpack-modules/index.js delete mode 100644 test/snowpack-modules/package.json delete mode 100644 test/validateModuleExportsMatchCommonJS/index.js delete mode 100644 test/validateModuleExportsMatchCommonJS/package.json delete mode 100644 test/webpack-4-modules/index.js delete mode 100644 test/webpack-4-modules/package.json delete mode 100644 test/webpack-5-modules/index.js delete mode 100644 test/webpack-5-modules/package.json delete mode 100644 test/webpack-5-modules/webpack.config.js rename test/{esm-node-native => webpack-modules}/index.js (100%) create mode 100644 test/webpack-modules/package.json rename test/{webpack-4-modules => webpack-modules}/webpack.config.js (100%) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 277cb49..0f56d34 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -9,21 +9,14 @@ jobs: ci: runs-on: ubuntu-latest - strategy: - matrix: - node-version: [12.x, 14.x, 16.x] - steps: - uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2 - - name: Use node version ${{ matrix.node-version }} + - name: Setup Node.js uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2 with: - node-version: ${{ matrix.node-version }} + node-version: 22.x - name: Run tests run: node ./test/runTests.js - - name: Run tests - run: node ./test/validateModuleExportsMatchCommonJS/index.js - if: matrix.node-version == '16.x' diff --git a/test/cjs/index.js b/test/cjs/index.js deleted file mode 100644 index 761ae43..0000000 --- a/test/cjs/index.js +++ /dev/null @@ -1,2 +0,0 @@ -const tslib = require("tslib"); -if (typeof tslib.__awaiter !== "function") throw new Error("Missing expected helper __awaiter"); diff --git a/test/cjs/package.json b/test/cjs/package.json deleted file mode 100644 index 421857a..0000000 --- a/test/cjs/package.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "private": true, - "scripts": { - "test": "node index.js" - } -} diff --git a/test/esm-node-native/package.json b/test/esm-node-native/package.json deleted file mode 100644 index 5f9ee8c..0000000 --- a/test/esm-node-native/package.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "type": "module", - "scripts": { - "test": "node index.js" - }, - "engines": { - "node": "14" - } -} diff --git a/test/node/exportStructure.test.js b/test/node/exportStructure.test.js new file mode 100644 index 0000000..0769d23 --- /dev/null +++ b/test/node/exportStructure.test.js @@ -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`); + } +} \ No newline at end of file diff --git a/test/node/package.json b/test/node/package.json new file mode 100644 index 0000000..23992f6 --- /dev/null +++ b/test/node/package.json @@ -0,0 +1,6 @@ +{ + "type": "module", + "scripts": { + "test": "node --test --experimental-detect-module" + } +} \ No newline at end of file diff --git a/test/node/testHelper.js b/test/node/testHelper.js new file mode 100644 index 0000000..f6a69d5 --- /dev/null +++ b/test/node/testHelper.js @@ -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]); + }); + }); +} diff --git a/test/node/tsconfig.json b/test/node/tsconfig.json new file mode 100644 index 0000000..f25ede6 --- /dev/null +++ b/test/node/tsconfig.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "module": "NodeNext", + "checkJs": true, + "noEmit": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "types": ["node"], + } +} \ No newline at end of file diff --git a/test/package.json b/test/package.json index 2f35efe..2fdb77a 100644 --- a/test/package.json +++ b/test/package.json @@ -1,11 +1,10 @@ { "dependencies": { + "chalk": "^4.1.2", + "rollup": "4.22.0", "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", - "vite": "2.8.0" + "vite": "5.4.6", + "webpack": "5.94.0", + "webpack-cli": "5.1.4" } } diff --git a/test/rollup-modules/rollup.config.js b/test/rollup-modules/rollup.config.js index 407442c..4875eed 100644 --- a/test/rollup-modules/rollup.config.js +++ b/test/rollup-modules/rollup.config.js @@ -1,10 +1,7 @@ -import { nodeResolve } from '@rollup/plugin-node-resolve'; - export default { input: 'index.js', output: { dir: 'build', format: 'cjs' }, - plugins: [nodeResolve()] }; diff --git a/test/runTests.js b/test/runTests.js index 51090c1..a26e3e5 100644 --- a/test/runTests.js +++ b/test/runTests.js @@ -1,3 +1,4 @@ +// @ts-check const { spawnSync } = require("child_process"); const fs = require("fs"); const path = require("path"); @@ -5,11 +6,10 @@ const mainVersion = Number(process.version.replace("v","").split(".")[0]) // Loop through all the folders and run `npm test` -const blocklist = ["validateModuleExportsMatchCommonJS", "node_modules"]; const filesInTest = fs.readdirSync(__dirname); const tests = filesInTest .filter((f) => fs.statSync(path.join(__dirname, f)).isDirectory()) - .filter((f) => !blocklist.includes(f)); + .filter((f) => f !== "node_modules"); // Support setting up the test node modules if (!filesInTest.includes("node_modules")) { @@ -18,7 +18,7 @@ if (!filesInTest.includes("node_modules")) { console.log("Installed"); } -const chalk = require("chalk").default; +const chalk = require("chalk"); for (const test of tests) { console.log("---> " + chalk.bold(test)); diff --git a/test/snowpack-modules/index.js b/test/snowpack-modules/index.js deleted file mode 100644 index a147352..0000000 --- a/test/snowpack-modules/index.js +++ /dev/null @@ -1,2 +0,0 @@ -import { __awaiter } from "tslib"; -if (typeof __awaiter !== "function") throw new Error("Missing expected helper __awaiter"); diff --git a/test/snowpack-modules/package.json b/test/snowpack-modules/package.json deleted file mode 100644 index ca7826b..0000000 --- a/test/snowpack-modules/package.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "type": "module", - - "scripts": { - "test": "../node_modules/.bin/snowpack build; node build/index.js" - }, - "engines": { - "node": "14" - } -} diff --git a/test/validateModuleExportsMatchCommonJS/index.js b/test/validateModuleExportsMatchCommonJS/index.js deleted file mode 100644 index 2ff703b..0000000 --- a/test/validateModuleExportsMatchCommonJS/index.js +++ /dev/null @@ -1,17 +0,0 @@ -// This file can only run on node 14+, it validates that all of the commonjs exports -// are correctly re-exported for es modules importers. - -// 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.") diff --git a/test/validateModuleExportsMatchCommonJS/package.json b/test/validateModuleExportsMatchCommonJS/package.json deleted file mode 100644 index 166e509..0000000 --- a/test/validateModuleExportsMatchCommonJS/package.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "type": "module", - "scripts": { - "test": "node index.js" - } -} diff --git a/test/webpack-4-modules/index.js b/test/webpack-4-modules/index.js deleted file mode 100644 index a147352..0000000 --- a/test/webpack-4-modules/index.js +++ /dev/null @@ -1,2 +0,0 @@ -import { __awaiter } from "tslib"; -if (typeof __awaiter !== "function") throw new Error("Missing expected helper __awaiter"); diff --git a/test/webpack-4-modules/package.json b/test/webpack-4-modules/package.json deleted file mode 100644 index 3601cac..0000000 --- a/test/webpack-4-modules/package.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "scripts": { - "test": "../node_modules/.bin/webpack && node build/main.js" - } -} diff --git a/test/webpack-5-modules/index.js b/test/webpack-5-modules/index.js deleted file mode 100644 index a147352..0000000 --- a/test/webpack-5-modules/index.js +++ /dev/null @@ -1,2 +0,0 @@ -import { __awaiter } from "tslib"; -if (typeof __awaiter !== "function") throw new Error("Missing expected helper __awaiter"); diff --git a/test/webpack-5-modules/package.json b/test/webpack-5-modules/package.json deleted file mode 100644 index e634d9a..0000000 --- a/test/webpack-5-modules/package.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "scripts": { - "test": "webpack && node build/main.js" - }, - "devDependencies": { - "tslib": "file:../..", - "webpack": "5.0.0-rc.4", - "webpack-cli": "3.3.12" - } -} diff --git a/test/webpack-5-modules/webpack.config.js b/test/webpack-5-modules/webpack.config.js deleted file mode 100644 index 47956e1..0000000 --- a/test/webpack-5-modules/webpack.config.js +++ /dev/null @@ -1,12 +0,0 @@ -const path = require('path'); - -/** @type {import("webpack").Configuration} */ -const config = { - mode: "production", - entry: "./index", - output: { - path: path.join(process.cwd(), 'build') - } -} - -module.exports = config diff --git a/test/esm-node-native/index.js b/test/webpack-modules/index.js similarity index 100% rename from test/esm-node-native/index.js rename to test/webpack-modules/index.js diff --git a/test/webpack-modules/package.json b/test/webpack-modules/package.json new file mode 100644 index 0000000..04c09f4 --- /dev/null +++ b/test/webpack-modules/package.json @@ -0,0 +1,5 @@ +{ + "scripts": { + "test": "webpack && node build/main.js" + } +} diff --git a/test/webpack-4-modules/webpack.config.js b/test/webpack-modules/webpack.config.js similarity index 100% rename from test/webpack-4-modules/webpack.config.js rename to test/webpack-modules/webpack.config.js diff --git a/tslib.es6.js b/tslib.es6.js index fc18d15..9365006 100644 --- a/tslib.es6.js +++ b/tslib.es6.js @@ -354,6 +354,10 @@ export default { __rest: __rest, __decorate: __decorate, __param: __param, + __esDecorate: __esDecorate, + __runInitializers: __runInitializers, + __propKey: __propKey, + __setFunctionName: __setFunctionName, __metadata: __metadata, __awaiter: __awaiter, __generator: __generator, diff --git a/tslib.es6.mjs b/tslib.es6.mjs index 17bb2ff..e669963 100644 --- a/tslib.es6.mjs +++ b/tslib.es6.mjs @@ -353,6 +353,10 @@ export default { __rest, __decorate, __param, + __esDecorate, + __runInitializers, + __propKey, + __setFunctionName, __metadata, __awaiter, __generator, diff --git a/tslib.js b/tslib.js index 429c11a..e53dd2f 100644 --- a/tslib.js +++ b/tslib.js @@ -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, +}); From 689efe3cd26a664a85afefbcfaa098d3bbab7984 Mon Sep 17 00:00:00 2001 From: Andrew Branch Date: Mon, 23 Sep 2024 10:09:50 -0700 Subject: [PATCH 05/19] Add rewriteRelativeImportExtension helper --- modules/index.d.ts | 1 + modules/index.js | 2 + .../rewriteRelativeImportExtension.test.js | 49 +++++++++++++++++++ tslib.d.ts | 7 +++ tslib.es6.js | 18 +++++++ tslib.es6.mjs | 18 +++++++ tslib.js | 20 ++++++++ 7 files changed, 115 insertions(+) create mode 100644 test/node/rewriteRelativeImportExtension.test.js diff --git a/modules/index.d.ts b/modules/index.d.ts index 0fedae8..3244fab 100644 --- a/modules/index.d.ts +++ b/modules/index.d.ts @@ -33,5 +33,6 @@ export { __createBinding, __addDisposableResource, __disposeResources, + __rewriteRelativeImportExtension, } from '../tslib.js'; export * as default from '../tslib.js'; diff --git a/modules/index.js b/modules/index.js index af9f5ac..c91f618 100644 --- a/modules/index.js +++ b/modules/index.js @@ -31,6 +31,7 @@ const { __classPrivateFieldIn, __addDisposableResource, __disposeResources, + __rewriteRelativeImportExtension, } = tslib; export { __extends, @@ -64,5 +65,6 @@ export { __classPrivateFieldIn, __addDisposableResource, __disposeResources, + __rewriteRelativeImportExtension, }; export default tslib; diff --git a/test/node/rewriteRelativeImportExtension.test.js b/test/node/rewriteRelativeImportExtension.test.js new file mode 100644 index 0000000..772d173 --- /dev/null +++ b/test/node/rewriteRelativeImportExtension.test.js @@ -0,0 +1,49 @@ +import assert from "node:assert"; +import { test } from "node:test"; +import { testHelper } from "./testHelper.js"; + +testHelper("__rewriteRelativeImportExtension", __rewriteRelativeImportExtension => { + test("rewrites relative .ts to .js", () => { + assert.equal(__rewriteRelativeImportExtension("./foo.ts"), "./foo.js"); + assert.equal(__rewriteRelativeImportExtension("../foo.ts"), "../foo.js"); + assert.equal(__rewriteRelativeImportExtension("../../foo.ts"), "../../foo.js"); + }); + + test("rewrites other TypeScript extensions", () => { + assert.equal(__rewriteRelativeImportExtension("./foo.mts"), "./foo.mjs"); + assert.equal(__rewriteRelativeImportExtension("./foo.cts"), "./foo.cjs"); + assert.equal(__rewriteRelativeImportExtension("./foo.tsx"), "./foo.js"); + assert.equal(__rewriteRelativeImportExtension("./foo.tsx", true), "./foo.jsx"); + }); + + test("does not rewrite other extensions", () => { + assert.equal(__rewriteRelativeImportExtension("./foo.js"), "./foo.js"); + assert.equal(__rewriteRelativeImportExtension("./foo.mjs"), "./foo.mjs"); + assert.equal(__rewriteRelativeImportExtension("./foo.cjs"), "./foo.cjs"); + assert.equal(__rewriteRelativeImportExtension("./foo.jsx"), "./foo.jsx"); + assert.equal(__rewriteRelativeImportExtension("./foo.json"), "./foo.json"); + assert.equal(__rewriteRelativeImportExtension("./foo.css"), "./foo.css"); + assert.equal(__rewriteRelativeImportExtension("./foo"), "./foo"); + }); + + test("does not rewrite non-relative imports", () => { + assert.equal(__rewriteRelativeImportExtension("foo.ts"), "foo.ts"); + assert.equal(__rewriteRelativeImportExtension("foo.mts"), "foo.mts"); + assert.equal(__rewriteRelativeImportExtension("foo.cts"), "foo.cts"); + assert.equal(__rewriteRelativeImportExtension("foo.tsx"), "foo.tsx"); + assert.equal(__rewriteRelativeImportExtension("foo.js"), "foo.js"); + assert.equal(__rewriteRelativeImportExtension("foo.mjs"), "foo.mjs"); + assert.equal(__rewriteRelativeImportExtension("foo.cjs"), "foo.cjs"); + assert.equal(__rewriteRelativeImportExtension("foo.jsx"), "foo.jsx"); + assert.equal(__rewriteRelativeImportExtension("foo.json"), "foo.json"); + assert.equal(__rewriteRelativeImportExtension("foo.css"), "foo.css"); + assert.equal(__rewriteRelativeImportExtension("foo"), "foo"); + }); + + test("does not rewrite declaration file extensions", () => { + assert.equal(__rewriteRelativeImportExtension("./foo.d.ts"), "./foo.d.ts"); + assert.equal(__rewriteRelativeImportExtension("./foo.d.mts"), "./foo.d.mts"); + assert.equal(__rewriteRelativeImportExtension("./foo.d.cts"), "./foo.d.cts"); + assert.equal(__rewriteRelativeImportExtension("./foo.d.css.ts"), "./foo.d.css.ts"); + }); +}); diff --git a/tslib.d.ts b/tslib.d.ts index 4576221..f23df55 100644 --- a/tslib.d.ts +++ b/tslib.d.ts @@ -451,3 +451,10 @@ export declare function __addDisposableResource(env: { stack: { value?: unkno * @seealso {@link __addDisposableResource} */ export declare function __disposeResources(env: { stack: { value?: unknown, dispose?: Function, async: boolean }[]; error: unknown; hasError: boolean; }): any; + +/** + * Transforms a relative import specifier ending in a non-declaration TypeScript file extension to its JavaScript file extension counterpart. + * @param path The import specifier. + * @param preserveJsx Causes '*.tsx' to transform to '*.jsx' instead of '*.js'. Should be true when `--jsx` is set to `preserve`. + */ +export declare function __rewriteRelativeImportExtension(path: string, preserveJsx?: boolean): string; \ No newline at end of file diff --git a/tslib.es6.js b/tslib.es6.js index 9365006..a1323a6 100644 --- a/tslib.es6.js +++ b/tslib.es6.js @@ -348,6 +348,23 @@ export function __disposeResources(env) { return next(); } +export function __rewriteRelativeImportExtension(path, preserveJsx) { + if (typeof path === "string" && path[0] === "." && (path[1] === "/" || path[1] === "." && path[2] === "/")) { + if (path.substring(path.length - 4) === ".tsx") { + return path.substring(0, path.length - 4) + (preserveJsx ? ".jsx" : ".js"); + } + if (path.substring(path.length - 3) === ".ts") { + var dot = path.lastIndexOf(".", path.length - 4); + if (dot >= 0 && (path.substring(dot - 2, dot) === ".d" || path.substring(dot, dot + 2) === ".d")) { + return path; + } + return path.substring(0, path.length - 3) + ".js"; + } + return path.replace(/(?= 0 && (path.substring(dot - 2, dot) === ".d" || path.substring(dot, dot + 2) === ".d")) { + return path; + } + return path.substring(0, path.length - 3) + ".js"; + } + return path.replace(/(?= 0 && (path.substring(dot - 2, dot) === ".d" || path.substring(dot, dot + 2) === ".d")) { + return path; + } + return path.substring(0, path.length - 3) + ".js"; + } + return path.replace(/(? Date: Tue, 24 Sep 2024 09:32:46 -0700 Subject: [PATCH 06/19] Case insensitivity, remove lookbehind --- .../rewriteRelativeImportExtension.test.js | 4 ++++ tslib.es6.js | 13 ++++++------ tslib.es6.mjs | 21 ++++++++++--------- tslib.js | 13 ++++++------ 4 files changed, 29 insertions(+), 22 deletions(-) diff --git a/test/node/rewriteRelativeImportExtension.test.js b/test/node/rewriteRelativeImportExtension.test.js index 772d173..25158e1 100644 --- a/test/node/rewriteRelativeImportExtension.test.js +++ b/test/node/rewriteRelativeImportExtension.test.js @@ -7,6 +7,8 @@ testHelper("__rewriteRelativeImportExtension", __rewriteRelativeImportExtension assert.equal(__rewriteRelativeImportExtension("./foo.ts"), "./foo.js"); assert.equal(__rewriteRelativeImportExtension("../foo.ts"), "../foo.js"); assert.equal(__rewriteRelativeImportExtension("../../foo.ts"), "../../foo.js"); + assert.equal(__rewriteRelativeImportExtension("./foo.TS"), "./foo.js"); + assert.equal(__rewriteRelativeImportExtension("./foo.Ts"), "./foo.js"); }); test("rewrites other TypeScript extensions", () => { @@ -14,6 +16,7 @@ testHelper("__rewriteRelativeImportExtension", __rewriteRelativeImportExtension assert.equal(__rewriteRelativeImportExtension("./foo.cts"), "./foo.cjs"); assert.equal(__rewriteRelativeImportExtension("./foo.tsx"), "./foo.js"); assert.equal(__rewriteRelativeImportExtension("./foo.tsx", true), "./foo.jsx"); + assert.equal(__rewriteRelativeImportExtension("./foo.Tsx", true), "./foo.jsx"); }); test("does not rewrite other extensions", () => { @@ -45,5 +48,6 @@ testHelper("__rewriteRelativeImportExtension", __rewriteRelativeImportExtension assert.equal(__rewriteRelativeImportExtension("./foo.d.mts"), "./foo.d.mts"); assert.equal(__rewriteRelativeImportExtension("./foo.d.cts"), "./foo.d.cts"); assert.equal(__rewriteRelativeImportExtension("./foo.d.css.ts"), "./foo.d.css.ts"); + assert.equal(__rewriteRelativeImportExtension("./foo.D.ts"), "./foo.D.ts"); }); }); diff --git a/tslib.es6.js b/tslib.es6.js index a1323a6..36b58a5 100644 --- a/tslib.es6.js +++ b/tslib.es6.js @@ -350,17 +350,18 @@ export function __disposeResources(env) { export function __rewriteRelativeImportExtension(path, preserveJsx) { if (typeof path === "string" && path[0] === "." && (path[1] === "/" || path[1] === "." && path[2] === "/")) { - if (path.substring(path.length - 4) === ".tsx") { + if (path.substring(path.length - 4).toLowerCase() === ".tsx") { return path.substring(0, path.length - 4) + (preserveJsx ? ".jsx" : ".js"); } - if (path.substring(path.length - 3) === ".ts") { - var dot = path.lastIndexOf(".", path.length - 4); - if (dot >= 0 && (path.substring(dot - 2, dot) === ".d" || path.substring(dot, dot + 2) === ".d")) { + var extMatch = path.match(/\.[cm]?ts$/i); + if (extMatch) { + var ext = extMatch[0].toLowerCase(); + var dot = path.lastIndexOf(".", path.length - (ext.length + 1)); + if (dot >= 0 && (path.substring(dot - 2, dot).toLowerCase() === ".d" || path.substring(dot, dot + 2).toLowerCase() === ".d")) { return path; } - return path.substring(0, path.length - 3) + ".js"; + return path.substring(0, path.length - ext.length) + (ext === ".mts" ? ".mjs" : ext === ".cts" ? ".cjs" : ".js"); } - return path.replace(/(?= 0 && (path.substring(dot - 2, dot) === ".d" || path.substring(dot, dot + 2) === ".d")) { - return path; + if (path.substring(path.length - 4).toLowerCase() === ".tsx") { + return path.substring(0, path.length - 4) + (preserveJsx ? ".jsx" : ".js"); + } + var extMatch = path.match(/\.[cm]?ts$/i); + if (extMatch) { + var ext = extMatch[0].toLowerCase(); + var dot = path.lastIndexOf(".", path.length - (ext.length + 1)); + if (dot >= 0 && (path.substring(dot - 2, dot).toLowerCase() === ".d" || path.substring(dot, dot + 2).toLowerCase() === ".d")) { + return path; + } + return path.substring(0, path.length - ext.length) + (ext === ".mts" ? ".mjs" : ext === ".cts" ? ".cjs" : ".js"); } - return path.substring(0, path.length - 3) + ".js"; - } - return path.replace(/(?= 0 && (path.substring(dot - 2, dot) === ".d" || path.substring(dot, dot + 2) === ".d")) { + var extMatch = path.match(/\.[cm]?ts$/i); + if (extMatch) { + var ext = extMatch[0].toLowerCase(); + var dot = path.lastIndexOf(".", path.length - (ext.length + 1)); + if (dot >= 0 && (path.substring(dot - 2, dot).toLowerCase() === ".d" || path.substring(dot, dot + 2).toLowerCase() === ".d")) { return path; } - return path.substring(0, path.length - 3) + ".js"; + return path.substring(0, path.length - ext.length) + (ext === ".mts" ? ".mjs" : ext === ".cts" ? ".cjs" : ".js"); } - return path.replace(/(? Date: Tue, 24 Sep 2024 09:38:27 -0700 Subject: [PATCH 07/19] Shorten by one line --- tslib.es6.js | 5 ++--- tslib.es6.mjs | 5 ++--- tslib.js | 5 ++--- 3 files changed, 6 insertions(+), 9 deletions(-) diff --git a/tslib.es6.js b/tslib.es6.js index 36b58a5..5b36110 100644 --- a/tslib.es6.js +++ b/tslib.es6.js @@ -357,10 +357,9 @@ export function __rewriteRelativeImportExtension(path, preserveJsx) { if (extMatch) { var ext = extMatch[0].toLowerCase(); var dot = path.lastIndexOf(".", path.length - (ext.length + 1)); - if (dot >= 0 && (path.substring(dot - 2, dot).toLowerCase() === ".d" || path.substring(dot, dot + 2).toLowerCase() === ".d")) { - return path; + if (dot < 0 || !(path.substring(dot - 2, dot).toLowerCase() === ".d" || path.substring(dot, dot + 2).toLowerCase() === ".d")) { + return path.substring(0, path.length - ext.length) + (ext === ".mts" ? ".mjs" : ext === ".cts" ? ".cjs" : ".js"); } - return path.substring(0, path.length - ext.length) + (ext === ".mts" ? ".mjs" : ext === ".cts" ? ".cjs" : ".js"); } } return path; diff --git a/tslib.es6.mjs b/tslib.es6.mjs index ccffef3..7fed569 100644 --- a/tslib.es6.mjs +++ b/tslib.es6.mjs @@ -356,10 +356,9 @@ export function __rewriteRelativeImportExtension(path, preserveJsx) { if (extMatch) { var ext = extMatch[0].toLowerCase(); var dot = path.lastIndexOf(".", path.length - (ext.length + 1)); - if (dot >= 0 && (path.substring(dot - 2, dot).toLowerCase() === ".d" || path.substring(dot, dot + 2).toLowerCase() === ".d")) { - return path; + if (dot < 0 || !(path.substring(dot - 2, dot).toLowerCase() === ".d" || path.substring(dot, dot + 2).toLowerCase() === ".d")) { + return path.substring(0, path.length - ext.length) + (ext === ".mts" ? ".mjs" : ext === ".cts" ? ".cjs" : ".js"); } - return path.substring(0, path.length - ext.length) + (ext === ".mts" ? ".mjs" : ext === ".cts" ? ".cjs" : ".js"); } } return path; diff --git a/tslib.js b/tslib.js index 64090f0..d22e885 100644 --- a/tslib.js +++ b/tslib.js @@ -405,10 +405,9 @@ var __rewriteRelativeImportExtension; if (extMatch) { var ext = extMatch[0].toLowerCase(); var dot = path.lastIndexOf(".", path.length - (ext.length + 1)); - if (dot >= 0 && (path.substring(dot - 2, dot).toLowerCase() === ".d" || path.substring(dot, dot + 2).toLowerCase() === ".d")) { - return path; + if (dot < 0 || !(path.substring(dot - 2, dot).toLowerCase() === ".d" || path.substring(dot, dot + 2).toLowerCase() === ".d")) { + return path.substring(0, path.length - ext.length) + (ext === ".mts" ? ".mjs" : ext === ".cts" ? ".cjs" : ".js"); } - return path.substring(0, path.length - ext.length) + (ext === ".mts" ? ".mjs" : ext === ".cts" ? ".cjs" : ".js"); } } return path; From a55e9f7a805d9aa489fe29f7acb59fdc19f09472 Mon Sep 17 00:00:00 2001 From: Andrew Branch Date: Tue, 24 Sep 2024 13:57:49 -0700 Subject: [PATCH 08/19] Do more with a regex --- tslib.es6.js | 11 +++-------- tslib.es6.mjs | 11 +++-------- tslib.js | 11 +++-------- 3 files changed, 9 insertions(+), 24 deletions(-) diff --git a/tslib.es6.js b/tslib.es6.js index 5b36110..fc6481a 100644 --- a/tslib.es6.js +++ b/tslib.es6.js @@ -353,14 +353,9 @@ export function __rewriteRelativeImportExtension(path, preserveJsx) { if (path.substring(path.length - 4).toLowerCase() === ".tsx") { return path.substring(0, path.length - 4) + (preserveJsx ? ".jsx" : ".js"); } - var extMatch = path.match(/\.[cm]?ts$/i); - if (extMatch) { - var ext = extMatch[0].toLowerCase(); - var dot = path.lastIndexOf(".", path.length - (ext.length + 1)); - if (dot < 0 || !(path.substring(dot - 2, dot).toLowerCase() === ".d" || path.substring(dot, dot + 2).toLowerCase() === ".d")) { - return path.substring(0, path.length - ext.length) + (ext === ".mts" ? ".mjs" : ext === ".cts" ? ".cjs" : ".js"); - } - } + return path.replace(/(\.d)?(\.[^./]+?)?\.([cm])?ts$/i, function (m, d, ext, cm) { + return d && (ext && !cm || !ext) ? m : ("." + (cm || "").toLowerCase() + "js"); + }); } return path; } diff --git a/tslib.es6.mjs b/tslib.es6.mjs index 7fed569..bd46885 100644 --- a/tslib.es6.mjs +++ b/tslib.es6.mjs @@ -352,14 +352,9 @@ export function __rewriteRelativeImportExtension(path, preserveJsx) { if (path.substring(path.length - 4).toLowerCase() === ".tsx") { return path.substring(0, path.length - 4) + (preserveJsx ? ".jsx" : ".js"); } - var extMatch = path.match(/\.[cm]?ts$/i); - if (extMatch) { - var ext = extMatch[0].toLowerCase(); - var dot = path.lastIndexOf(".", path.length - (ext.length + 1)); - if (dot < 0 || !(path.substring(dot - 2, dot).toLowerCase() === ".d" || path.substring(dot, dot + 2).toLowerCase() === ".d")) { - return path.substring(0, path.length - ext.length) + (ext === ".mts" ? ".mjs" : ext === ".cts" ? ".cjs" : ".js"); - } - } + return path.replace(/(\.d)?(\.[^./]+?)?\.([cm])?ts$/i, function (m, d, ext, cm) { + return d && (ext && !cm || !ext) ? m : ("." + (cm || "").toLowerCase() + "js"); + }); } return path; } diff --git a/tslib.js b/tslib.js index d22e885..7b627f0 100644 --- a/tslib.js +++ b/tslib.js @@ -401,14 +401,9 @@ var __rewriteRelativeImportExtension; if (path.substring(path.length - 4).toLowerCase() === ".tsx") { return path.substring(0, path.length - 4) + (preserveJsx ? ".jsx" : ".js"); } - var extMatch = path.match(/\.[cm]?ts$/i); - if (extMatch) { - var ext = extMatch[0].toLowerCase(); - var dot = path.lastIndexOf(".", path.length - (ext.length + 1)); - if (dot < 0 || !(path.substring(dot - 2, dot).toLowerCase() === ".d" || path.substring(dot, dot + 2).toLowerCase() === ".d")) { - return path.substring(0, path.length - ext.length) + (ext === ".mts" ? ".mjs" : ext === ".cts" ? ".cjs" : ".js"); - } - } + return path.replace(/(\.d)?(\.[^./]+?)?\.([cm])?ts$/i, function (m, d, ext, cm) { + return d && (ext && !cm || !ext) ? m : ("." + (cm || "").toLowerCase() + "js"); + }); } return path; }; From 1c03288ab27b787dc4cc3bc9e002c7d3d1a27815 Mon Sep 17 00:00:00 2001 From: Andrew Branch Date: Tue, 24 Sep 2024 14:05:56 -0700 Subject: [PATCH 09/19] Test and fix invalid declaration-looking extensions --- test/node/rewriteRelativeImportExtension.test.js | 3 +++ tslib.es6.js | 2 +- tslib.es6.mjs | 2 +- tslib.js | 2 +- 4 files changed, 6 insertions(+), 3 deletions(-) diff --git a/test/node/rewriteRelativeImportExtension.test.js b/test/node/rewriteRelativeImportExtension.test.js index 25158e1..af69458 100644 --- a/test/node/rewriteRelativeImportExtension.test.js +++ b/test/node/rewriteRelativeImportExtension.test.js @@ -9,6 +9,7 @@ testHelper("__rewriteRelativeImportExtension", __rewriteRelativeImportExtension assert.equal(__rewriteRelativeImportExtension("../../foo.ts"), "../../foo.js"); assert.equal(__rewriteRelativeImportExtension("./foo.TS"), "./foo.js"); assert.equal(__rewriteRelativeImportExtension("./foo.Ts"), "./foo.js"); + assert.equal(__rewriteRelativeImportExtension("./foo/.hidden/foo.ts"), "./foo/.hidden/foo.js"); }); test("rewrites other TypeScript extensions", () => { @@ -17,6 +18,8 @@ testHelper("__rewriteRelativeImportExtension", __rewriteRelativeImportExtension assert.equal(__rewriteRelativeImportExtension("./foo.tsx"), "./foo.js"); assert.equal(__rewriteRelativeImportExtension("./foo.tsx", true), "./foo.jsx"); assert.equal(__rewriteRelativeImportExtension("./foo.Tsx", true), "./foo.jsx"); + assert.equal(__rewriteRelativeImportExtension("./foo.d.css.mts"), "./foo.d.css.mjs"); + assert.equal(__rewriteRelativeImportExtension("./foo.d.tsx"), "./foo.d.js"); }); test("does not rewrite other extensions", () => { diff --git a/tslib.es6.js b/tslib.es6.js index fc6481a..545a8ef 100644 --- a/tslib.es6.js +++ b/tslib.es6.js @@ -354,7 +354,7 @@ export function __rewriteRelativeImportExtension(path, preserveJsx) { return path.substring(0, path.length - 4) + (preserveJsx ? ".jsx" : ".js"); } return path.replace(/(\.d)?(\.[^./]+?)?\.([cm])?ts$/i, function (m, d, ext, cm) { - return d && (ext && !cm || !ext) ? m : ("." + (cm || "").toLowerCase() + "js"); + return d && (ext && !cm || !ext) ? m : ((d || "") + (ext || "") + "." + (cm || "").toLowerCase() + "js"); }); } return path; diff --git a/tslib.es6.mjs b/tslib.es6.mjs index bd46885..3f7c843 100644 --- a/tslib.es6.mjs +++ b/tslib.es6.mjs @@ -353,7 +353,7 @@ export function __rewriteRelativeImportExtension(path, preserveJsx) { return path.substring(0, path.length - 4) + (preserveJsx ? ".jsx" : ".js"); } return path.replace(/(\.d)?(\.[^./]+?)?\.([cm])?ts$/i, function (m, d, ext, cm) { - return d && (ext && !cm || !ext) ? m : ("." + (cm || "").toLowerCase() + "js"); + return d && (ext && !cm || !ext) ? m : ((d || "") + (ext || "") + "." + (cm || "").toLowerCase() + "js"); }); } return path; diff --git a/tslib.js b/tslib.js index 7b627f0..88c717f 100644 --- a/tslib.js +++ b/tslib.js @@ -402,7 +402,7 @@ var __rewriteRelativeImportExtension; return path.substring(0, path.length - 4) + (preserveJsx ? ".jsx" : ".js"); } return path.replace(/(\.d)?(\.[^./]+?)?\.([cm])?ts$/i, function (m, d, ext, cm) { - return d && (ext && !cm || !ext) ? m : ("." + (cm || "").toLowerCase() + "js"); + return d && (ext && !cm || !ext) ? m : ((d || "") + (ext || "") + "." + (cm || "").toLowerCase() + "js"); }); } return path; From 9c731e9f325b1e8341c8fbc3a7ca572cc792f15b Mon Sep 17 00:00:00 2001 From: Andrew Branch Date: Tue, 24 Sep 2024 15:18:20 -0700 Subject: [PATCH 10/19] Combine tsx case into regex --- tslib.es6.js | 9 +++------ tslib.es6.mjs | 9 +++------ tslib.js | 9 +++------ 3 files changed, 9 insertions(+), 18 deletions(-) diff --git a/tslib.es6.js b/tslib.es6.js index 545a8ef..2c7eaad 100644 --- a/tslib.es6.js +++ b/tslib.es6.js @@ -349,12 +349,9 @@ export function __disposeResources(env) { } export function __rewriteRelativeImportExtension(path, preserveJsx) { - if (typeof path === "string" && path[0] === "." && (path[1] === "/" || path[1] === "." && path[2] === "/")) { - if (path.substring(path.length - 4).toLowerCase() === ".tsx") { - return path.substring(0, path.length - 4) + (preserveJsx ? ".jsx" : ".js"); - } - return path.replace(/(\.d)?(\.[^./]+?)?\.([cm])?ts$/i, function (m, d, ext, cm) { - return d && (ext && !cm || !ext) ? m : ((d || "") + (ext || "") + "." + (cm || "").toLowerCase() + "js"); + if (typeof path === "string" && /^\.\.?\//.test(path)) { + return path.replace(/\.(tsx)$|(\.d)?(\.[^./]+?)?\.([cm])?ts$/i, function (m, tsx, d, ext, cm) { + return tsx ? preserveJsx ? ".jsx" : ".js" : d && (ext && !cm || !ext) ? m : ((d || "") + (ext || "") + "." + (cm || "").toLowerCase() + "js"); }); } return path; diff --git a/tslib.es6.mjs b/tslib.es6.mjs index 3f7c843..9c2c3f3 100644 --- a/tslib.es6.mjs +++ b/tslib.es6.mjs @@ -348,12 +348,9 @@ export function __disposeResources(env) { } export function __rewriteRelativeImportExtension(path, preserveJsx) { - if (typeof path === "string" && path[0] === "." && (path[1] === "/" || path[1] === "." && path[2] === "/")) { - if (path.substring(path.length - 4).toLowerCase() === ".tsx") { - return path.substring(0, path.length - 4) + (preserveJsx ? ".jsx" : ".js"); - } - return path.replace(/(\.d)?(\.[^./]+?)?\.([cm])?ts$/i, function (m, d, ext, cm) { - return d && (ext && !cm || !ext) ? m : ((d || "") + (ext || "") + "." + (cm || "").toLowerCase() + "js"); + if (typeof path === "string" && /^\.\.?\//.test(path)) { + return path.replace(/\.(tsx)$|(\.d)?(\.[^./]+?)?\.([cm])?ts$/i, function (m, tsx, d, ext, cm) { + return tsx ? preserveJsx ? ".jsx" : ".js" : d && (ext && !cm || !ext) ? m : ((d || "") + (ext || "") + "." + (cm || "").toLowerCase() + "js"); }); } return path; diff --git a/tslib.js b/tslib.js index 88c717f..53455fd 100644 --- a/tslib.js +++ b/tslib.js @@ -397,12 +397,9 @@ var __rewriteRelativeImportExtension; }; __rewriteRelativeImportExtension = function (path, preserveJsx) { - if (typeof path === "string" && path[0] === "." && (path[1] === "/" || path[1] === "." && path[2] === "/")) { - if (path.substring(path.length - 4).toLowerCase() === ".tsx") { - return path.substring(0, path.length - 4) + (preserveJsx ? ".jsx" : ".js"); - } - return path.replace(/(\.d)?(\.[^./]+?)?\.([cm])?ts$/i, function (m, d, ext, cm) { - return d && (ext && !cm || !ext) ? m : ((d || "") + (ext || "") + "." + (cm || "").toLowerCase() + "js"); + if (typeof path === "string" && /^\.\.?\//.test(path)) { + return path.replace(/\.(tsx)$|(\.d)?(\.[^./]+?)?\.([cm])?ts$/i, function (m, tsx, d, ext, cm) { + return tsx ? preserveJsx ? ".jsx" : ".js" : d && (ext && !cm || !ext) ? m : ((d || "") + (ext || "") + "." + (cm || "").toLowerCase() + "js"); }); } return path; From fece22a6b42e378abcf7dfbefaa89b62e0b814f8 Mon Sep 17 00:00:00 2001 From: Andrew Branch Date: Tue, 24 Sep 2024 15:33:34 -0700 Subject: [PATCH 11/19] Add URL-ish test --- test/node/rewriteRelativeImportExtension.test.js | 1 + 1 file changed, 1 insertion(+) diff --git a/test/node/rewriteRelativeImportExtension.test.js b/test/node/rewriteRelativeImportExtension.test.js index af69458..6eb83d5 100644 --- a/test/node/rewriteRelativeImportExtension.test.js +++ b/test/node/rewriteRelativeImportExtension.test.js @@ -30,6 +30,7 @@ testHelper("__rewriteRelativeImportExtension", __rewriteRelativeImportExtension assert.equal(__rewriteRelativeImportExtension("./foo.json"), "./foo.json"); assert.equal(__rewriteRelativeImportExtension("./foo.css"), "./foo.css"); assert.equal(__rewriteRelativeImportExtension("./foo"), "./foo"); + assert.equal(__rewriteRelativeImportExtension("./foo.d.php?q=1.ts"), "./foo.d.php?q=1.ts"); }); test("does not rewrite non-relative imports", () => { From 27b219209a4d35308e9dd6a533e5169a981d2614 Mon Sep 17 00:00:00 2001 From: Andrew Branch Date: Tue, 24 Sep 2024 16:04:07 -0700 Subject: [PATCH 12/19] Little optimizations --- tslib.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tslib.js b/tslib.js index 53455fd..95beb91 100644 --- a/tslib.js +++ b/tslib.js @@ -398,8 +398,8 @@ var __rewriteRelativeImportExtension; __rewriteRelativeImportExtension = function (path, preserveJsx) { if (typeof path === "string" && /^\.\.?\//.test(path)) { - return path.replace(/\.(tsx)$|(\.d)?(\.[^./]+?)?\.([cm])?ts$/i, function (m, tsx, d, ext, cm) { - return tsx ? preserveJsx ? ".jsx" : ".js" : d && (ext && !cm || !ext) ? m : ((d || "") + (ext || "") + "." + (cm || "").toLowerCase() + "js"); + return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) { + return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js"); }); } return path; From c4cde745896b4d845a11dc5aeb72405074c9a0c5 Mon Sep 17 00:00:00 2001 From: Andrew Branch Date: Tue, 24 Sep 2024 16:52:24 -0700 Subject: [PATCH 13/19] Missed update --- tslib.es6.js | 4 ++-- tslib.es6.mjs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tslib.es6.js b/tslib.es6.js index 2c7eaad..ddd87f6 100644 --- a/tslib.es6.js +++ b/tslib.es6.js @@ -350,8 +350,8 @@ export function __disposeResources(env) { export function __rewriteRelativeImportExtension(path, preserveJsx) { if (typeof path === "string" && /^\.\.?\//.test(path)) { - return path.replace(/\.(tsx)$|(\.d)?(\.[^./]+?)?\.([cm])?ts$/i, function (m, tsx, d, ext, cm) { - return tsx ? preserveJsx ? ".jsx" : ".js" : d && (ext && !cm || !ext) ? m : ((d || "") + (ext || "") + "." + (cm || "").toLowerCase() + "js"); + return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) { + return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js"); }); } return path; diff --git a/tslib.es6.mjs b/tslib.es6.mjs index 9c2c3f3..a1d9ef5 100644 --- a/tslib.es6.mjs +++ b/tslib.es6.mjs @@ -349,8 +349,8 @@ export function __disposeResources(env) { export function __rewriteRelativeImportExtension(path, preserveJsx) { if (typeof path === "string" && /^\.\.?\//.test(path)) { - return path.replace(/\.(tsx)$|(\.d)?(\.[^./]+?)?\.([cm])?ts$/i, function (m, tsx, d, ext, cm) { - return tsx ? preserveJsx ? ".jsx" : ".js" : d && (ext && !cm || !ext) ? m : ((d || "") + (ext || "") + "." + (cm || "").toLowerCase() + "js"); + return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) { + return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js"); }); } return path; From ca5f7fb791f85ebf17c0102cdc632e9577b3e483 Mon Sep 17 00:00:00 2001 From: Andrew Branch Date: Tue, 15 Oct 2024 10:11:14 -0700 Subject: [PATCH 14/19] 2.8.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a068b42..731dab4 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "tslib", "author": "Microsoft Corp.", "homepage": "https://www.typescriptlang.org/", - "version": "2.7.0", + "version": "2.8.0", "license": "0BSD", "description": "Runtime library for TypeScript helper functions", "keywords": [ From 097e99eae872e743dda18aaee034118fb9c7c063 Mon Sep 17 00:00:00 2001 From: Andrew Branch Date: Tue, 15 Oct 2024 10:32:19 -0700 Subject: [PATCH 15/19] Fix publish workflow --- .github/workflows/publish.yaml | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml index 7ce57f9..8c5d734 100644 --- a/.github/workflows/publish.yaml +++ b/.github/workflows/publish.yaml @@ -3,21 +3,30 @@ name: Publish to NPM on: release: types: [created] + workflow_dispatch: permissions: contents: read jobs: - publish-npm: + test: runs-on: ubuntu-latest steps: - - uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2 - - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2 + - uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2 + - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2 with: - node-version: 14 - registry-url: https://registry.npmjs.org/ + node-version: 22.x - run: npm i - - run: node test/validateModuleExportsMatchCommonJS/index.js + - run: node ./test/runTests.js + + publish-npm: + runs-on: ubuntu-latest + needs: test + steps: + - uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2 + - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2 + with: + node-version: 22.x - run: npm publish env: NODE_AUTH_TOKEN: ${{secrets.npm_token}} From 7c11588c364da4267328cfd32ed20de57494db67 Mon Sep 17 00:00:00 2001 From: Andrew Branch Date: Tue, 15 Oct 2024 10:51:20 -0700 Subject: [PATCH 16/19] Add missing registry-url parameter --- .github/workflows/publish.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml index 8c5d734..6dab32a 100644 --- a/.github/workflows/publish.yaml +++ b/.github/workflows/publish.yaml @@ -27,6 +27,7 @@ jobs: - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2 with: node-version: 22.x + registry-url: https://registry.npmjs.org/ - run: npm publish env: NODE_AUTH_TOKEN: ${{secrets.npm_token}} From b0076c4070f7bae5730b49903529d8b27bc43e96 Mon Sep 17 00:00:00 2001 From: Ron Buckton Date: Fri, 18 Oct 2024 10:26:13 -0400 Subject: [PATCH 17/19] Include non-enumerable keys in __importStar helper (#272) --- tslib.es6.js | 11 ++++++++++- tslib.es6.mjs | 11 ++++++++++- tslib.js | 11 ++++++++++- 3 files changed, 30 insertions(+), 3 deletions(-) diff --git a/tslib.es6.js b/tslib.es6.js index ddd87f6..6c1739b 100644 --- a/tslib.es6.js +++ b/tslib.es6.js @@ -263,10 +263,19 @@ var __setModuleDefault = Object.create ? (function(o, v) { o["default"] = v; }; +var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); +}; + export function __importStar(mod) { if (mod && mod.__esModule) return mod; var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; } diff --git a/tslib.es6.mjs b/tslib.es6.mjs index a1d9ef5..c17990a 100644 --- a/tslib.es6.mjs +++ b/tslib.es6.mjs @@ -263,10 +263,19 @@ var __setModuleDefault = Object.create ? (function(o, v) { o["default"] = v; }; +var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); +}; + export function __importStar(mod) { if (mod && mod.__esModule) return mod; var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; } diff --git a/tslib.js b/tslib.js index 95beb91..332d349 100644 --- a/tslib.js +++ b/tslib.js @@ -312,10 +312,19 @@ var __rewriteRelativeImportExtension; o["default"] = v; }; + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + __importStar = function (mod) { if (mod && mod.__esModule) return mod; var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; From 3c532ebb15fabac8fb8b6bc08704283c1ce0fad0 Mon Sep 17 00:00:00 2001 From: Andrew Branch Date: Thu, 31 Oct 2024 15:10:46 -0700 Subject: [PATCH 18/19] Remove use of ES2015 syntax --- tslib.js | 64 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/tslib.js b/tslib.js index 95beb91..4dd4cdd 100644 --- a/tslib.js +++ b/tslib.js @@ -440,36 +440,36 @@ var __rewriteRelativeImportExtension; }); 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, - __rewriteRelativeImportExtension, + __extends: __extends, + __assign: __assign, + __rest: __rest, + __decorate: __decorate, + __param: __param, + __esDecorate: __esDecorate, + __runInitializers: __runInitializers, + __propKey: __propKey, + __setFunctionName: __setFunctionName, + __metadata: __metadata, + __awaiter: __awaiter, + __generator: __generator, + __exportStar: __exportStar, + __createBinding: __createBinding, + __values: __values, + __read: __read, + __spread: __spread, + __spreadArrays: __spreadArrays, + __spreadArray: __spreadArray, + __await: __await, + __asyncGenerator: __asyncGenerator, + __asyncDelegator: __asyncDelegator, + __asyncValues: __asyncValues, + __makeTemplateObject: __makeTemplateObject, + __importStar: __importStar, + __importDefault: __importDefault, + __classPrivateFieldGet: __classPrivateFieldGet, + __classPrivateFieldSet: __classPrivateFieldSet, + __classPrivateFieldIn: __classPrivateFieldIn, + __addDisposableResource: __addDisposableResource, + __disposeResources: __disposeResources, + __rewriteRelativeImportExtension: __rewriteRelativeImportExtension, }); From d72d6f70b36286bc3f94a3dda1e64dcb568b1370 Mon Sep 17 00:00:00 2001 From: Andrew Branch Date: Thu, 31 Oct 2024 15:40:16 -0700 Subject: [PATCH 19/19] 2.8.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 731dab4..57d0578 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "tslib", "author": "Microsoft Corp.", "homepage": "https://www.typescriptlang.org/", - "version": "2.8.0", + "version": "2.8.1", "license": "0BSD", "description": "Runtime library for TypeScript helper functions", "keywords": [