From ce5ce9e88536192c60c4489ca34120679d2f1982 Mon Sep 17 00:00:00 2001 From: Alex Miller Date: Tue, 6 Jun 2023 16:54:54 +1200 Subject: [PATCH 01/11] refactor(build): Move build to scripts --- package.json | 2 +- esbuild.config.mjs => scripts/esbuild.config.mjs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename esbuild.config.mjs => scripts/esbuild.config.mjs (95%) diff --git a/package.json b/package.json index b713dfb..001ae59 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,7 @@ "types": "dist/types/index.d.ts", "scripts": { "build": "npm run build:types && npm run build:bundles", - "build:bundles": "node ./esbuild.config.mjs", + "build:bundles": "node ./scripts/esbuild.config.mjs", "build:types": "tsc -p tsconfig.build.json", "check:types": "tsc -p tsconfig.json", "format:check": "prettier --check \"{**/*,*}.{js,ts}\"", diff --git a/esbuild.config.mjs b/scripts/esbuild.config.mjs similarity index 95% rename from esbuild.config.mjs rename to scripts/esbuild.config.mjs index 89e8e9f..c13c752 100644 --- a/esbuild.config.mjs +++ b/scripts/esbuild.config.mjs @@ -7,7 +7,7 @@ import { fileURLToPath } from "url"; const nodeTargets = ["node14", "node16", "node18"]; const __dirname = path.dirname(fileURLToPath(import.meta.url)); -const packageJsonPath = path.resolve(__dirname, "package.json"); +const packageJsonPath = path.resolve(__dirname, "..", "package.json"); async function getExternals() { const packageJson = JSON.parse(await readFile(packageJsonPath)); From c879324bcaba06ce59d55627e22db4133de266a0 Mon Sep 17 00:00:00 2001 From: Alex Miller Date: Tue, 6 Jun 2023 17:42:50 +1200 Subject: [PATCH 02/11] feat(esm): Generate esm sources and support `import` --- lib/index.ts | 4 +- lib/loader.ts | 11 +- package.json | 15 ++- scripts/esbuild.config.mjs | 114 ++++++++++++++---- .../{smoke-test-cjs.js => smoke-test-cjs.cjs} | 2 +- smoke-tests/smoke-test-esm.mjs | 2 +- smoke-tests/smoke-test.js | 4 +- tsconfig.json | 3 +- 8 files changed, 118 insertions(+), 37 deletions(-) rename smoke-tests/{smoke-test-cjs.js => smoke-test-cjs.cjs} (51%) diff --git a/lib/index.ts b/lib/index.ts index bbbd207..203de7e 100644 --- a/lib/index.ts +++ b/lib/index.ts @@ -1,2 +1,2 @@ -export { TypeScriptLoader } from "./loader"; -export type { TypeScriptCompileError } from "./typescript-compile-error"; +export { TypeScriptLoader } from "./loader.js"; +export type { TypeScriptCompileError } from "./typescript-compile-error.js"; diff --git a/lib/loader.ts b/lib/loader.ts index e3d30e9..0322b0e 100644 --- a/lib/loader.ts +++ b/lib/loader.ts @@ -1,18 +1,23 @@ import type { Loader } from "cosmiconfig"; import { register, RegisterOptions } from "ts-node"; -import { TypeScriptCompileError } from "./typescript-compile-error"; +import { TypeScriptCompileError } from "./typescript-compile-error.js"; export function TypeScriptLoader(options?: RegisterOptions): Loader { const tsNodeInstance = register({ ...options, compilerOptions: { module: "commonjs" }, }); - return (path: string, content: string) => { + return async (path: string, content: string) => { try { // cosmiconfig requires the transpiled configuration to be CJS tsNodeInstance.compile(content, path); - const result = require(path); + let result; + if (typeof require !== "undefined") { + result = require(path); + } else { + result = await import(path); + } // `default` is used when exporting using export default, some modules // may still use `module.exports` or if in TS `export = ` diff --git a/package.json b/package.json index 001ae59..fc33256 100644 --- a/package.json +++ b/package.json @@ -15,8 +15,21 @@ "files": [ "dist/**/*" ], - "main": "dist/cjs/index.js", + "main": "dist/cjs/index.cjs", + "module": "dist/esm/index.mjs", "types": "dist/types/index.d.ts", + "exports": { + ".": { + "import": { + "types": "./dist/types/index.d.ts", + "default": "./dist/esm/index.mjs" + }, + "require": { + "types": "./dist/types/index.d.ts", + "default": "./dist/cjs/index.cjs" + } + } + }, "scripts": { "build": "npm run build:types && npm run build:bundles", "build:bundles": "node ./scripts/esbuild.config.mjs", diff --git a/scripts/esbuild.config.mjs b/scripts/esbuild.config.mjs index c13c752..4d82647 100644 --- a/scripts/esbuild.config.mjs +++ b/scripts/esbuild.config.mjs @@ -1,18 +1,73 @@ +// @ts-check +import fs from "node:fs/promises"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; + import chalk from "chalk"; import { analyzeMetafile, build } from "esbuild"; -import { readFile } from "fs/promises"; -import path from "path"; -import { fileURLToPath } from "url"; - -const nodeTargets = ["node14", "node16", "node18"]; const __dirname = path.dirname(fileURLToPath(import.meta.url)); -const packageJsonPath = path.resolve(__dirname, "..", "package.json"); -async function getExternals() { - const packageJson = JSON.parse(await readFile(packageJsonPath)); +/** + * Available formats: https://esbuild.github.io/api/#format + * + * @type {Array<"cjs" | "esm">} + */ +const FORMATS = ["cjs", "esm"]; +/** + * @type {import('esbuild').BuildOptions['target']} + */ +const TARGETS = ["node14", "node16", "node18", "node20", "esnext"]; + +const ROOT = path.resolve(__dirname, ".."); +const SOURCES_ROOT = path.resolve(ROOT, "./lib"); + +/** + * @param {"cjs" | "esm"} format + * @return {import('esbuild').Plugin} + */ +function addExtension(format) { + const newExtension = format === "cjs" ? ".cjs" : ".mjs"; + return { + name: "add-extension", + setup(build) { + build.onResolve({ filter: /.*/ }, (args) => { + if (args.importer) + return { + path: args.path.replace(/\.js$/, newExtension), + external: true, + }; + }); + }, + }; +} + +/** + * @param {string[]} entryPoints + * @param {"cjs" | "esm"} format + */ +async function buildSources(entryPoints, format) { + return build({ + entryPoints: entryPoints, + outdir: `${ROOT}/dist/${format}`, + target: TARGETS, + platform: "node", + format: format, + metafile: true, - return Object.keys(packageJson.peerDependencies); + // These allow us to build compliant exports and imports based on modern node + bundle: true, + outExtension: { ".js": format === "cjs" ? ".cjs" : ".mjs" }, + plugins: [addExtension(format)], + }); +} + +async function getSourceEntryPoints() { + const entryPoints = await fs.readdir(SOURCES_ROOT); + + return entryPoints + .filter((file) => !/__fixtures__|\.spec\./.test(file)) + .map((file) => path.resolve(SOURCES_ROOT, file)); } (async () => { @@ -24,27 +79,34 @@ async function getExternals() { ) ); - const externalDeps = await getExternals(); + console.info("- Generate sources"); - const result = await build({ - entryPoints: ["./lib/index.ts"], - outfile: "dist/cjs/index.js", - metafile: true, - bundle: true, - format: "cjs", - external: externalDeps, - platform: "node", - target: nodeTargets, - treeShaking: true, - }); + const sourceEntryPoints = await getSourceEntryPoints(); - const analysis = await analyzeMetafile(result.metafile); - console.info(`📝 Bundle Analysis:${analysis}`); + for (const format of FORMATS) { + console.info(`- Generating ${chalk.bold.greenBright(format)} sources`); + + const result = await buildSources(sourceEntryPoints, format); + const analysis = await analyzeMetafile(result.metafile); + console.info( + `${analysis + .trim() + .split(/\n\r/) + .map((line) => ` ${line}`) + .join()}` + ); + + console.info( + `${chalk.bold.greenBright("✔")} Generating ${chalk.bold.greenBright( + format + )} sources completed!\n` + ); + } console.info( - `${chalk.bold.green("✔ Bundled successfully!")} (${ - Date.now() - startTime - }ms)` + chalk.bold.green( + `✔ Generate sources completed! (${Date.now() - startTime}ms)` + ) ); } catch (error) { console.error(`🧨 ${chalk.red.bold("Failed:")} ${error.message}`); diff --git a/smoke-tests/smoke-test-cjs.js b/smoke-tests/smoke-test-cjs.cjs similarity index 51% rename from smoke-tests/smoke-test-cjs.js rename to smoke-tests/smoke-test-cjs.cjs index efa5cfb..3aa9210 100644 --- a/smoke-tests/smoke-test-cjs.js +++ b/smoke-tests/smoke-test-cjs.cjs @@ -1,4 +1,4 @@ -const { TypeScriptLoader } = require("../dist/cjs/index.js"); +const { TypeScriptLoader } = require("../dist/cjs/index.cjs"); TypeScriptLoader(); console.info("Loaded with CJS successfully"); diff --git a/smoke-tests/smoke-test-esm.mjs b/smoke-tests/smoke-test-esm.mjs index 85a5a4f..6baff6d 100644 --- a/smoke-tests/smoke-test-esm.mjs +++ b/smoke-tests/smoke-test-esm.mjs @@ -1,4 +1,4 @@ -import { TypeScriptLoader } from "../dist/cjs/index.js"; +import { TypeScriptLoader } from "../dist/esm/index.mjs"; TypeScriptLoader(); console.info("Loaded with ESM successfully"); diff --git a/smoke-tests/smoke-test.js b/smoke-tests/smoke-test.js index fc9d801..197f5bb 100644 --- a/smoke-tests/smoke-test.js +++ b/smoke-tests/smoke-test.js @@ -2,8 +2,8 @@ const assert = require("node:assert"); (async () => { try { - const { TypeScriptLoader: esm } = await import("../dist/cjs/index.js"); - const { TypeScriptLoader: cjs } = require("../dist/cjs/index.js"); + const { TypeScriptLoader: esm } = await import("../dist/esm/index.mjs"); + const { TypeScriptLoader: cjs } = require("../dist/cjs/index.cjs"); assert.strictEqual(esm, cjs, "esm === cjs"); diff --git a/tsconfig.json b/tsconfig.json index 196abc7..980f645 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,6 +1,7 @@ { "compilerOptions": { - "target": "es2016", + "module": "esnext", + "target": "es2020", "noEmit": true, "pretty": true, "sourceMap": true, From 29c806b605e324d21b533f34c4380bb0c90a6b15 Mon Sep 17 00:00:00 2001 From: Alex Miller Date: Tue, 6 Jun 2023 17:49:19 +1200 Subject: [PATCH 03/11] cicd(build): Drop node 14 support --- .github/workflows/build.yml | 2 +- .github/workflows/release.yml | 1 - package.json | 2 +- scripts/esbuild.config.mjs | 2 +- 4 files changed, 3 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 6f94bc0..5a49162 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -10,7 +10,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - node-version: [14.x, 16.x, 18.x] + node-version: [16.x, 18.x, 20.x] steps: - uses: actions/checkout@v3 - name: Use Node.js ${{ matrix.node-version }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 3d48f86..68f5377 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -17,7 +17,6 @@ jobs: env: CI: true GITHUB_TOKEN: ${{ secrets.ACTION_GITHUB_TOKEN }} - NPM_OTP_TOKEN: ${{ github.event.inputs.otp }} NPM_TOKEN: ${{ secrets.NPM_TOKEN }} runs-on: ubuntu-latest steps: diff --git a/package.json b/package.json index fc33256..7deb8e9 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,7 @@ "test:coverage": "jest --coverage" }, "engines": { - "node": ">=v14.21.3" + "node": ">=v16" }, "peerDependencies": { "@types/node": "*", diff --git a/scripts/esbuild.config.mjs b/scripts/esbuild.config.mjs index 4d82647..b6cbbe0 100644 --- a/scripts/esbuild.config.mjs +++ b/scripts/esbuild.config.mjs @@ -17,7 +17,7 @@ const FORMATS = ["cjs", "esm"]; /** * @type {import('esbuild').BuildOptions['target']} */ -const TARGETS = ["node14", "node16", "node18", "node20", "esnext"]; +const TARGETS = ["node16", "node18", "node20", "esnext"]; const ROOT = path.resolve(__dirname, ".."); const SOURCES_ROOT = path.resolve(ROOT, "./lib"); From 16f292bb7e3935041283b5ccc61bb3534db39dee Mon Sep 17 00:00:00 2001 From: Alex Miller Date: Mon, 24 Jul 2023 16:57:36 +1200 Subject: [PATCH 04/11] feat(esm): Correctly emit require vs import --- lib/loader.ts | 7 +------ scripts/esbuild.config.mjs | 15 ++++++++++++--- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/lib/loader.ts b/lib/loader.ts index 0322b0e..8ba396a 100644 --- a/lib/loader.ts +++ b/lib/loader.ts @@ -12,12 +12,7 @@ export function TypeScriptLoader(options?: RegisterOptions): Loader { try { // cosmiconfig requires the transpiled configuration to be CJS tsNodeInstance.compile(content, path); - let result; - if (typeof require !== "undefined") { - result = require(path); - } else { - result = await import(path); - } + const result = await import(path); // `default` is used when exporting using export default, some modules // may still use `module.exports` or if in TS `export = ` diff --git a/scripts/esbuild.config.mjs b/scripts/esbuild.config.mjs index b6cbbe0..d561e1c 100644 --- a/scripts/esbuild.config.mjs +++ b/scripts/esbuild.config.mjs @@ -47,19 +47,25 @@ function addExtension(format) { * @param {"cjs" | "esm"} format */ async function buildSources(entryPoints, format) { - return build({ + /** @type {import('esbuild').BuildOptions} */ + const options = { entryPoints: entryPoints, outdir: `${ROOT}/dist/${format}`, target: TARGETS, platform: "node", format: format, metafile: true, + supported: { + // Performs transform of `import` to `require` + "dynamic-import": format !== "cjs", + }, // These allow us to build compliant exports and imports based on modern node bundle: true, outExtension: { ".js": format === "cjs" ? ".cjs" : ".mjs" }, plugins: [addExtension(format)], - }); + }; + return build(options); } async function getSourceEntryPoints() { @@ -87,7 +93,10 @@ async function getSourceEntryPoints() { console.info(`- Generating ${chalk.bold.greenBright(format)} sources`); const result = await buildSources(sourceEntryPoints, format); - const analysis = await analyzeMetafile(result.metafile); + const analysis = await analyzeMetafile( + // @ts-ignore we know that the metafile will be emitted + result.metafile + ); console.info( `${analysis .trim() From ca6e2da5cadcccb525b4d1df809643c15399342e Mon Sep 17 00:00:00 2001 From: Alex Miller Date: Mon, 24 Jul 2023 17:27:15 +1200 Subject: [PATCH 05/11] feat(esm): Require cosmiconfig 8 and node 16 --- package-lock.json | 89 ++++++++++++++++++++++++++++++++++++----------- package.json | 3 +- 2 files changed, 71 insertions(+), 21 deletions(-) diff --git a/package-lock.json b/package-lock.json index ac1633f..b218f14 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,6 +14,7 @@ "@types/jest": "^29.5.3", "@typescript-eslint/eslint-plugin": "^5.62.0", "chalk": "^5.3.0", + "cosmiconfig": "^8.2.0", "esbuild": "^0.18.16", "eslint": "^8.45.0", "eslint-config-airbnb-typescript": "^17.1.0", @@ -26,11 +27,11 @@ "typescript": "^5.1.6" }, "engines": { - "node": ">=v14.21.3" + "node": ">=v16" }, "peerDependencies": { "@types/node": "*", - "cosmiconfig": ">=7", + "cosmiconfig": ">=8.2", "ts-node": ">=10", "typescript": ">=4" } @@ -61,6 +62,7 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", + "dev": true, "dependencies": { "@babel/highlight": "^7.22.5" }, @@ -276,6 +278,7 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", + "dev": true, "engines": { "node": ">=6.9.0" } @@ -307,6 +310,7 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz", "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==", + "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.22.5", "chalk": "^2.0.0", @@ -320,6 +324,7 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, "dependencies": { "color-convert": "^1.9.0" }, @@ -331,6 +336,7 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -344,6 +350,7 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, "engines": { "node": ">=0.8.0" } @@ -352,6 +359,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, "engines": { "node": ">=4" } @@ -360,6 +368,7 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, "dependencies": { "has-flag": "^3.0.0" }, @@ -3379,7 +3388,8 @@ "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true }, "node_modules/array-buffer-byte-length": { "version": "1.0.0", @@ -4000,6 +4010,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, "engines": { "node": ">=6" } @@ -4219,6 +4230,7 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, "dependencies": { "color-name": "1.1.3" } @@ -4226,7 +4238,8 @@ "node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true }, "node_modules/concat-map": { "version": "0.0.1", @@ -4297,6 +4310,7 @@ "version": "8.2.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.2.0.tgz", "integrity": "sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ==", + "dev": true, "dependencies": { "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", @@ -4753,6 +4767,7 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, "dependencies": { "is-arrayish": "^0.2.1" } @@ -6192,6 +6207,7 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -6513,7 +6529,8 @@ "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true }, "node_modules/is-bigint": { "version": "1.0.4", @@ -8907,12 +8924,14 @@ "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true }, "node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, "dependencies": { "argparse": "^2.0.1" }, @@ -8941,7 +8960,8 @@ "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true }, "node_modules/json-schema-traverse": { "version": "0.4.1", @@ -9040,7 +9060,8 @@ "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true }, "node_modules/locate-path": { "version": "6.0.0", @@ -9758,6 +9779,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, "dependencies": { "callsites": "^3.0.0" }, @@ -9769,6 +9791,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -9837,6 +9860,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, "engines": { "node": ">=8" } @@ -10503,6 +10527,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, "engines": { "node": ">=4" } @@ -11818,6 +11843,7 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", + "dev": true, "requires": { "@babel/highlight": "^7.22.5" } @@ -11978,7 +12004,8 @@ "@babel/helper-validator-identifier": { "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", - "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==" + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", + "dev": true }, "@babel/helper-validator-option": { "version": "7.22.5", @@ -12001,6 +12028,7 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz", "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==", + "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.22.5", "chalk": "^2.0.0", @@ -12011,6 +12039,7 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, "requires": { "color-convert": "^1.9.0" } @@ -12019,6 +12048,7 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -12028,17 +12058,20 @@ "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, "requires": { "has-flag": "^3.0.0" } @@ -14147,7 +14180,8 @@ "argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true }, "array-buffer-byte-length": { "version": "1.0.0", @@ -14573,7 +14607,8 @@ "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true }, "camelcase": { "version": "5.3.1", @@ -14714,6 +14749,7 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, "requires": { "color-name": "1.1.3" } @@ -14721,7 +14757,8 @@ "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true }, "concat-map": { "version": "0.0.1", @@ -14790,6 +14827,7 @@ "version": "8.2.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.2.0.tgz", "integrity": "sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ==", + "dev": true, "requires": { "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", @@ -15097,6 +15135,7 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, "requires": { "is-arrayish": "^0.2.1" } @@ -16154,6 +16193,7 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, "requires": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -16383,7 +16423,8 @@ "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true }, "is-bigint": { "version": "1.0.4", @@ -18182,12 +18223,14 @@ "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true }, "js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, "requires": { "argparse": "^2.0.1" } @@ -18207,7 +18250,8 @@ "json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true }, "json-schema-traverse": { "version": "0.4.1", @@ -18285,7 +18329,8 @@ "lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true }, "locate-path": { "version": "6.0.0", @@ -18794,6 +18839,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, "requires": { "callsites": "^3.0.0" } @@ -18802,6 +18848,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, "requires": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -18854,7 +18901,8 @@ "path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true }, "picocolors": { "version": "1.0.0", @@ -19317,7 +19365,8 @@ "resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true }, "resolve.exports": { "version": "2.0.2", diff --git a/package.json b/package.json index 7deb8e9..5a03171 100644 --- a/package.json +++ b/package.json @@ -48,7 +48,7 @@ }, "peerDependencies": { "@types/node": "*", - "cosmiconfig": ">=7", + "cosmiconfig": ">=8.2", "ts-node": ">=10", "typescript": ">=4" }, @@ -58,6 +58,7 @@ "@types/jest": "^29.5.3", "@typescript-eslint/eslint-plugin": "^5.62.0", "chalk": "^5.3.0", + "cosmiconfig": "^8.2.0", "esbuild": "^0.18.16", "eslint": "^8.45.0", "eslint-config-airbnb-typescript": "^17.1.0", From 50aad7e56d84001320fdb4cc3b2bcd733fde118f Mon Sep 17 00:00:00 2001 From: Alex Miller Date: Mon, 24 Jul 2023 17:27:58 +1200 Subject: [PATCH 06/11] feat(esm): Update testing to use async only --- jest.config.ts | 3 +++ lib/index.spec.ts | 16 ++++++++-------- lib/loader.spec.ts | 14 ++++++++------ 3 files changed, 19 insertions(+), 14 deletions(-) diff --git a/jest.config.ts b/jest.config.ts index d05273d..d9b6a6b 100644 --- a/jest.config.ts +++ b/jest.config.ts @@ -6,6 +6,9 @@ const config: Config.InitialOptions = { "!/lib/__fixtures__/**/*", ], moduleFileExtensions: ["ts", "js"], + moduleNameMapper: { + "^(\\.{1,2}/.*)\\.js$": "$1", + }, transform: { "^.+\\.ts$": "@swc/jest", }, diff --git a/lib/index.spec.ts b/lib/index.spec.ts index a5b3b0c..85d0b10 100644 --- a/lib/index.spec.ts +++ b/lib/index.spec.ts @@ -1,6 +1,6 @@ import path from "node:path"; -import { cosmiconfig, cosmiconfigSync } from "cosmiconfig"; +import { cosmiconfig } from "cosmiconfig"; import { TypeScriptLoader } from "."; @@ -46,13 +46,13 @@ describe("TypeScriptLoader", () => { }); describe("cosmiconfigSync", () => { - it("should load a valid TS file", () => { - const cfg = cosmiconfigSync("test", { + it("should load a valid TS file", async () => { + const cfg = cosmiconfig("test", { loaders: { ".ts": TypeScriptLoader(), }, }); - const loadedCfg = cfg.load( + const loadedCfg = await cfg.load( path.resolve(fixturesPath, "valid.fixture.ts") ); @@ -61,16 +61,16 @@ describe("TypeScriptLoader", () => { expect(loadedCfg!.config.test.cake).toStrictEqual("a lie"); }); - it("should throw an error on loading an invalid TS file", () => { - const cfg = cosmiconfigSync("test", { + it("should throw an error on loading an invalid TS file", async () => { + const cfg = cosmiconfig("test", { loaders: { ".ts": TypeScriptLoader(), }, }); - expect(() => + await expect(() => cfg.load(path.resolve(fixturesPath, "invalid.fixture.ts")) - ).toThrowError(); + ).rejects.toThrowError(); }); }); }); diff --git a/lib/loader.spec.ts b/lib/loader.spec.ts index 400e6e0..eb40343 100644 --- a/lib/loader.spec.ts +++ b/lib/loader.spec.ts @@ -26,9 +26,11 @@ describe("TypeScriptLoader", () => { loader(filePath, readFixtureContent(filePath)); }); - it("should fail on parsing an invalid TS file", () => { + it("should fail on parsing an invalid TS file", async () => { const filePath = path.resolve(fixturesPath, "invalid.fixture.ts"); - expect(() => loader(filePath, readFixtureContent(filePath))).toThrowError(); + await expect(() => + loader(filePath, readFixtureContent(filePath)) + ).rejects.toThrowError(); }); it("should use the same instance of ts-node across multiple calls", () => { @@ -38,10 +40,10 @@ describe("TypeScriptLoader", () => { expect(tsNodeSpy).toHaveBeenCalledTimes(1); }); - it("should throw a TypeScriptCompileError on error", () => { + it("should throw a TypeScriptCompileError on error", async () => { try { const filePath = path.resolve(fixturesPath, "invalid.fixture.ts"); - loader(filePath, readFixtureContent(filePath)); + await loader(filePath, readFixtureContent(filePath)); fail( "Error should be thrown upon failing to transpile an invalid TS file." ); @@ -72,9 +74,9 @@ describe("TypeScriptLoader", () => { stub.mockRestore(); }); - it("rethrows an error if it is not an instance of Error", () => { + it("rethrows an error if it is not an instance of Error", async () => { try { - loader("filePath", "readFixtureContent(filePath)"); + await loader("filePath", "readFixtureContent(filePath)"); fail( "Error should be thrown upon failing to transpile an invalid TS file." ); From 521386d9d3b19ab0e2d807721d7fa1302161d025 Mon Sep 17 00:00:00 2001 From: Alex Miller Date: Mon, 24 Jul 2023 17:28:08 +1200 Subject: [PATCH 07/11] chore(scripts): tidy up --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 5a03171..2d810da 100644 --- a/package.json +++ b/package.json @@ -35,9 +35,9 @@ "build:bundles": "node ./scripts/esbuild.config.mjs", "build:types": "tsc -p tsconfig.build.json", "check:types": "tsc -p tsconfig.json", - "format:check": "prettier --check \"{**/*,*}.{js,ts}\"", + "format:check": "prettier --check \"{**/*,*}.{js,cjs,mjs,ts}\"", "format:write": "npm run format:check -- --write", - "lint": "eslint --ext \".js,.ts\" .", + "lint": "eslint --ext \".js,.cjs,.mjs,.ts\" .", "lint:fix": "npm run lint -- --fix", "release": "release-it", "test": "jest", From f02d4dd14063795535e82cb8865addf9d06b18eb Mon Sep 17 00:00:00 2001 From: Alex Miller Date: Mon, 24 Jul 2023 17:33:57 +1200 Subject: [PATCH 08/11] feat(esm): Update smoke tests --- .github/workflows/build.yml | 2 +- smoke-tests/smoke-test.js | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 5a49162..51e7aa7 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -31,7 +31,7 @@ jobs: run: npm run test - name: Import with CJS if: ${{ always() }} - run: node smoke-tests/smoke-test-cjs.js + run: node smoke-tests/smoke-test-cjs.cjs - name: Import with ESM if: ${{ always() }} run: node smoke-tests/smoke-test-esm.mjs diff --git a/smoke-tests/smoke-test.js b/smoke-tests/smoke-test.js index 197f5bb..f3a1591 100644 --- a/smoke-tests/smoke-test.js +++ b/smoke-tests/smoke-test.js @@ -5,7 +5,11 @@ const assert = require("node:assert"); const { TypeScriptLoader: esm } = await import("../dist/esm/index.mjs"); const { TypeScriptLoader: cjs } = require("../dist/cjs/index.cjs"); - assert.strictEqual(esm, cjs, "esm === cjs"); + // Assert the functions loaded by checking their names load and types are correct + assert.strictEqual(esm.name === "TypeScriptLoader", true); + assert.strictEqual(typeof esm === "function", true); + assert.strictEqual(cjs.name === "TypeScriptLoader", true); + assert.strictEqual(typeof cjs === "function", true); // Try to create loaders esm(); From 5ab8f8fc6e2bc0e7171a108919b54e30e2e8f948 Mon Sep 17 00:00:00 2001 From: Alex Miller Date: Mon, 24 Jul 2023 17:34:50 +1200 Subject: [PATCH 09/11] chore(repo): update ignore --- .gitignore | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index a148dc4..d24de0a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,9 @@ .idea -.npmrc +.vscode + +node_modules + coverage dist -node_modules + +.npmrc From 68403dd97717dd7225a5f5409827889274b570b3 Mon Sep 17 00:00:00 2001 From: Alex Miller Date: Mon, 24 Jul 2023 17:37:52 +1200 Subject: [PATCH 10/11] feat(esm): No longer force to commonjs --- lib/loader.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/lib/loader.ts b/lib/loader.ts index 8ba396a..c60294a 100644 --- a/lib/loader.ts +++ b/lib/loader.ts @@ -4,10 +4,7 @@ import { register, RegisterOptions } from "ts-node"; import { TypeScriptCompileError } from "./typescript-compile-error.js"; export function TypeScriptLoader(options?: RegisterOptions): Loader { - const tsNodeInstance = register({ - ...options, - compilerOptions: { module: "commonjs" }, - }); + const tsNodeInstance = register(options); return async (path: string, content: string) => { try { // cosmiconfig requires the transpiled configuration to be CJS From 56f9e65e10c190201c896ca5bb55d73d88c36c79 Mon Sep 17 00:00:00 2001 From: Alex Miller Date: Tue, 25 Jul 2023 12:10:04 +1200 Subject: [PATCH 11/11] feat(jiti): Move away from ts-node, use jiti --- lib/index.spec.ts | 94 +++++++++++++++------- lib/loader.spec.ts | 49 ++++++------ lib/loader.ts | 12 ++- lib/typescript-compile-error.spec.ts | 17 ++-- lib/typescript-compile-error.ts | 7 +- package-lock.json | 115 +++++++++++++++++++++++++-- package.json | 4 +- scripts/esbuild.config.mjs | 4 - smoke-tests/config.ts | 3 + smoke-tests/smoke-test-cjs.cjs | 26 +++++- smoke-tests/smoke-test-esm.mjs | 26 +++++- 11 files changed, 264 insertions(+), 93 deletions(-) create mode 100644 smoke-tests/config.ts diff --git a/lib/index.spec.ts b/lib/index.spec.ts index 85d0b10..e7f0500 100644 --- a/lib/index.spec.ts +++ b/lib/index.spec.ts @@ -1,6 +1,6 @@ import path from "node:path"; -import { cosmiconfig } from "cosmiconfig"; +import { cosmiconfig, cosmiconfigSync } from "cosmiconfig"; import { TypeScriptLoader } from "."; @@ -14,45 +14,79 @@ describe("TypeScriptLoader", () => { }); describe("cosmiconfig", () => { - it("should load a valid TS file", async () => { - const cfg = cosmiconfig("test", { - loaders: { - ".ts": TypeScriptLoader(), - }, + describe("synchronous", () => { + it("should load a valid TS file", () => { + const cfg = cosmiconfigSync("test", { + loaders: { + ".ts": TypeScriptLoader(), + }, + }); + const loadedCfg = cfg.load( + path.resolve(fixturesPath, "valid.fixture.ts") + ); + + expect(typeof loadedCfg!.config).toStrictEqual("object"); + expect(typeof loadedCfg!.config.test).toStrictEqual("object"); + expect(loadedCfg!.config.test.cake).toStrictEqual("a lie"); }); - const loadedCfg = await cfg.load( - path.resolve(fixturesPath, "valid.fixture.ts") - ); - expect(typeof loadedCfg!.config).toStrictEqual("object"); - expect(typeof loadedCfg!.config.test).toStrictEqual("object"); - expect(loadedCfg!.config.test.cake).toStrictEqual("a lie"); + it("should throw an error on loading an invalid TS file", () => { + const cfg = cosmiconfigSync("test", { + loaders: { + ".ts": TypeScriptLoader(), + }, + }); + + try { + cfg.load(path.resolve(fixturesPath, "invalid.fixture.ts")); + fail("Should fail to load invalid TS"); + } catch (error: any) { + expect(error?.name).toStrictEqual("TypeScriptCompileError"); + } + }); }); - it("should throw an error on loading an invalid TS file", async () => { - const cfg = cosmiconfig("test", { - loaders: { - ".ts": TypeScriptLoader(), - }, + describe("asynchronous", () => { + it("should load a valid TS file", async () => { + const cfg = cosmiconfig("test", { + loaders: { + ".ts": TypeScriptLoader(), + }, + }); + const loadedCfg = await cfg.load( + path.resolve(fixturesPath, "valid.fixture.ts") + ); + + expect(typeof loadedCfg!.config).toStrictEqual("object"); + expect(typeof loadedCfg!.config.test).toStrictEqual("object"); + expect(loadedCfg!.config.test.cake).toStrictEqual("a lie"); }); - try { - await cfg.load(path.resolve(fixturesPath, "invalid.fixture.ts")); - fail("Should fail to load invalid TS"); - } catch (error: any) { - expect(error?.name).toStrictEqual("TypeScriptCompileError"); - } + it("should throw an error on loading an invalid TS file", async () => { + const cfg = cosmiconfig("test", { + loaders: { + ".ts": TypeScriptLoader(), + }, + }); + + try { + await cfg.load(path.resolve(fixturesPath, "invalid.fixture.ts")); + fail("Should fail to load invalid TS"); + } catch (error: any) { + expect(error?.name).toStrictEqual("TypeScriptCompileError"); + } + }); }); }); describe("cosmiconfigSync", () => { - it("should load a valid TS file", async () => { - const cfg = cosmiconfig("test", { + it("should load a valid TS file", () => { + const cfg = cosmiconfigSync("test", { loaders: { ".ts": TypeScriptLoader(), }, }); - const loadedCfg = await cfg.load( + const loadedCfg = cfg.load( path.resolve(fixturesPath, "valid.fixture.ts") ); @@ -61,16 +95,16 @@ describe("TypeScriptLoader", () => { expect(loadedCfg!.config.test.cake).toStrictEqual("a lie"); }); - it("should throw an error on loading an invalid TS file", async () => { - const cfg = cosmiconfig("test", { + it("should throw an error on loading an invalid TS file", () => { + const cfg = cosmiconfigSync("test", { loaders: { ".ts": TypeScriptLoader(), }, }); - await expect(() => + expect(() => cfg.load(path.resolve(fixturesPath, "invalid.fixture.ts")) - ).rejects.toThrowError(); + ).toThrowError(); }); }); }); diff --git a/lib/loader.spec.ts b/lib/loader.spec.ts index eb40343..193edd9 100644 --- a/lib/loader.spec.ts +++ b/lib/loader.spec.ts @@ -2,14 +2,23 @@ import fs from "node:fs"; import path from "node:path"; import { Loader } from "cosmiconfig"; -import * as tsnode from "ts-node"; +import * as jiti from "jiti"; import { TypeScriptLoader } from "./loader"; import { TypeScriptCompileError } from "./typescript-compile-error"; +// Handle jiti using `export default` +jest.mock("jiti", () => { + const actual = jest.requireActual("jiti"); + return { + __esModule: true, + default: jest.fn(actual), + }; +}); + describe("TypeScriptLoader", () => { const fixturesPath = path.resolve(__dirname, "__fixtures__"); - const tsNodeSpy = jest.spyOn(tsnode, "register"); + const jitiSpy = jest.spyOn(jiti, "default"); let loader: Loader; @@ -26,24 +35,22 @@ describe("TypeScriptLoader", () => { loader(filePath, readFixtureContent(filePath)); }); - it("should fail on parsing an invalid TS file", async () => { + it("should fail on parsing an invalid TS file", () => { const filePath = path.resolve(fixturesPath, "invalid.fixture.ts"); - await expect(() => - loader(filePath, readFixtureContent(filePath)) - ).rejects.toThrowError(); + expect(() => loader(filePath, readFixtureContent(filePath))).toThrowError(); }); - it("should use the same instance of ts-node across multiple calls", () => { + it("should use the same instance of jiti across multiple calls", () => { const filePath = path.resolve(fixturesPath, "valid.fixture.ts"); loader(filePath, readFixtureContent(filePath)); loader(filePath, readFixtureContent(filePath)); - expect(tsNodeSpy).toHaveBeenCalledTimes(1); + expect(jitiSpy).toHaveBeenCalledTimes(1); }); - it("should throw a TypeScriptCompileError on error", async () => { + it("should throw a TypeScriptCompileError on error", () => { try { const filePath = path.resolve(fixturesPath, "invalid.fixture.ts"); - await loader(filePath, readFixtureContent(filePath)); + loader(filePath, readFixtureContent(filePath)); fail( "Error should be thrown upon failing to transpile an invalid TS file." ); @@ -52,21 +59,17 @@ describe("TypeScriptLoader", () => { } }); - describe("ts-node", () => { + describe("jiti", () => { const unknownError = "Test Error"; - let stub: jest.SpyInstance; + let stub: jest.SpyInstance; beforeEach(() => { - stub = jest.spyOn(tsnode, "register").mockImplementation( - () => - ({ - compile: (): string => { - // eslint-disable-next-line @typescript-eslint/no-throw-literal - throw unknownError; - }, - } as any) - ); + stub = jest.spyOn(jiti, "default").mockImplementation((() => () => { + // eslint-disable-next-line @typescript-eslint/no-throw-literal + throw unknownError; + }) as any); + loader = TypeScriptLoader(); }); @@ -74,9 +77,9 @@ describe("TypeScriptLoader", () => { stub.mockRestore(); }); - it("rethrows an error if it is not an instance of Error", async () => { + it("rethrows an error if it is not an instance of Error", () => { try { - await loader("filePath", "readFixtureContent(filePath)"); + loader("filePath", "readFixtureContent(filePath)"); fail( "Error should be thrown upon failing to transpile an invalid TS file." ); diff --git a/lib/loader.ts b/lib/loader.ts index c60294a..3139357 100644 --- a/lib/loader.ts +++ b/lib/loader.ts @@ -1,15 +1,13 @@ import type { Loader } from "cosmiconfig"; -import { register, RegisterOptions } from "ts-node"; +import jiti, { type JITIOptions } from "jiti"; import { TypeScriptCompileError } from "./typescript-compile-error.js"; -export function TypeScriptLoader(options?: RegisterOptions): Loader { - const tsNodeInstance = register(options); - return async (path: string, content: string) => { +export function TypeScriptLoader(options?: JITIOptions): Loader { + const loader = jiti("", { interopDefault: true, ...options }); + return (path: string) => { try { - // cosmiconfig requires the transpiled configuration to be CJS - tsNodeInstance.compile(content, path); - const result = await import(path); + const result = loader(path); // `default` is used when exporting using export default, some modules // may still use `module.exports` or if in TS `export = ` diff --git a/lib/typescript-compile-error.spec.ts b/lib/typescript-compile-error.spec.ts index 656526c..dc35769 100644 --- a/lib/typescript-compile-error.spec.ts +++ b/lib/typescript-compile-error.spec.ts @@ -17,21 +17,14 @@ describe("TypeScriptCompileError", () => { expect(tscError.stack).toBe(testError.stack); }); - it("should replace the legacy tsc error string", () => { - const testMsg = - "TypeScript compiler encountered syntax errors while transpiling. Errors: "; + it("should prefix the jiti parser error", () => { + const testMsg = 'ParseError: Unexpected token, expected ","'; const legacyError = new Error(testMsg); const tscError = TypeScriptCompileError.fromError(legacyError); - expect(tscError).not.toContainEqual(testMsg); - }); - - it("should replace the tsc error string", () => { - const testMsg = "⨯ Unable to compile TypeScript:"; - const newError = new Error(testMsg); - const tscError = TypeScriptCompileError.fromError(newError); - - expect(tscError).not.toContainEqual(testMsg); + expect(tscError.message).toContain( + "TypeScriptLoader failed to compile TypeScript:" + ); }); }); }); diff --git a/lib/typescript-compile-error.ts b/lib/typescript-compile-error.ts index 4641de3..e5b1cb6 100644 --- a/lib/typescript-compile-error.ts +++ b/lib/typescript-compile-error.ts @@ -8,12 +8,7 @@ export class TypeScriptCompileError extends Error { } public static fromError(error: Error): TypeScriptCompileError { - const errMsg = error.message.replace( - /(TypeScript compiler encountered syntax errors while transpiling\. Errors:\s?)|(⨯ Unable to compile TypeScript:\s?)/, - "" - ); - - const message = `TypeScriptLoader failed to compile TypeScript:\n${errMsg}`; + const message = `TypeScriptLoader failed to compile TypeScript:\n${error.message}`; const newError = new TypeScriptCompileError(message); newError.stack = error.stack; diff --git a/package-lock.json b/package-lock.json index b218f14..284194e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,6 +8,9 @@ "name": "cosmiconfig-typescript-loader", "version": "4.4.0", "license": "MIT", + "dependencies": { + "jiti": "^1.19.1" + }, "devDependencies": { "@swc/core": "^1.3.70", "@swc/jest": "^0.2.27", @@ -32,7 +35,6 @@ "peerDependencies": { "@types/node": "*", "cosmiconfig": ">=8.2", - "ts-node": ">=10", "typescript": ">=4" } }, @@ -633,6 +635,8 @@ "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "optional": true, "peer": true, "dependencies": { "@jridgewell/trace-mapping": "0.3.9" @@ -645,6 +649,8 @@ "version": "0.3.9", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "optional": true, "peer": true, "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", @@ -2162,6 +2168,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true, "engines": { "node": ">=6.0.0" } @@ -2178,7 +2185,8 @@ "node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.15", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.18", @@ -2503,7 +2511,7 @@ "version": "1.3.70", "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.3.70.tgz", "integrity": "sha512-LWVWlEDLlOD25PvA2NEz41UzdwXnlDyBiZbe69s3zM0DfCPwZXLUm79uSqH9ItsOjTrXSL5/1+XUL6C/BZwChA==", - "devOptional": true, + "dev": true, "hasInstallScript": true, "engines": { "node": ">=10" @@ -2540,6 +2548,7 @@ "cpu": [ "arm64" ], + "dev": true, "optional": true, "os": [ "darwin" @@ -2555,6 +2564,7 @@ "cpu": [ "x64" ], + "dev": true, "optional": true, "os": [ "darwin" @@ -2570,6 +2580,7 @@ "cpu": [ "arm" ], + "dev": true, "optional": true, "os": [ "linux" @@ -2585,6 +2596,7 @@ "cpu": [ "arm64" ], + "dev": true, "optional": true, "os": [ "linux" @@ -2600,6 +2612,7 @@ "cpu": [ "arm64" ], + "dev": true, "optional": true, "os": [ "linux" @@ -2615,6 +2628,7 @@ "cpu": [ "x64" ], + "dev": true, "optional": true, "os": [ "linux" @@ -2630,6 +2644,7 @@ "cpu": [ "x64" ], + "dev": true, "optional": true, "os": [ "linux" @@ -2645,6 +2660,7 @@ "cpu": [ "arm64" ], + "dev": true, "optional": true, "os": [ "win32" @@ -2660,6 +2676,7 @@ "cpu": [ "ia32" ], + "dev": true, "optional": true, "os": [ "win32" @@ -2675,6 +2692,7 @@ "cpu": [ "x64" ], + "dev": true, "optional": true, "os": [ "win32" @@ -2721,24 +2739,32 @@ "version": "1.0.9", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true, + "optional": true, "peer": true }, "node_modules/@tsconfig/node12": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true, + "optional": true, "peer": true }, "node_modules/@tsconfig/node14": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true, + "optional": true, "peer": true }, "node_modules/@tsconfig/node16": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true, + "optional": true, "peer": true }, "node_modules/@types/babel__core": { @@ -3256,6 +3282,7 @@ "version": "8.9.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.9.0.tgz", "integrity": "sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==", + "dev": true, "bin": { "acorn": "bin/acorn" }, @@ -3276,6 +3303,8 @@ "version": "8.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true, + "optional": true, "peer": true, "engines": { "node": ">=0.4.0" @@ -3383,6 +3412,8 @@ "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true, + "optional": true, "peer": true }, "node_modules/argparse": { @@ -4328,6 +4359,8 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true, + "optional": true, "peer": true }, "node_modules/cross-spawn": { @@ -4680,6 +4713,8 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "optional": true, "peer": true, "engines": { "node": ">=0.3.1" @@ -8921,6 +8956,14 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "node_modules/jiti": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.19.1.tgz", + "integrity": "sha512-oVhqoRDaBXf7sjkll95LHVS6Myyyb1zaunVwk4Z0+WPSW4gjS0pl01zYKHScTuyEhQsFxV5L4DR5r+YqSyqyyg==", + "bin": { + "jiti": "bin/jiti.js" + } + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -9197,6 +9240,8 @@ "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true, + "optional": true, "peer": true }, "node_modules/makeerror": { @@ -11171,6 +11216,8 @@ "version": "10.9.1", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "optional": true, "peer": true, "dependencies": { "@cspotcode/source-map-support": "^0.8.0", @@ -11330,6 +11377,7 @@ "version": "5.1.6", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "dev": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -11478,6 +11526,8 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true, + "optional": true, "peer": true }, "node_modules/v8-to-istanbul": { @@ -11804,6 +11854,8 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "optional": true, "peer": true, "engines": { "node": ">=6" @@ -12268,6 +12320,8 @@ "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "optional": true, "peer": true, "requires": { "@jridgewell/trace-mapping": "0.3.9" @@ -12277,6 +12331,8 @@ "version": "0.3.9", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "optional": true, "peer": true, "requires": { "@jridgewell/resolve-uri": "^3.0.3", @@ -13339,7 +13395,8 @@ "@jridgewell/resolve-uri": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==" + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true }, "@jridgewell/set-array": { "version": "1.1.2", @@ -13350,7 +13407,8 @@ "@jridgewell/sourcemap-codec": { "version": "1.4.15", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true }, "@jridgewell/trace-mapping": { "version": "0.3.18", @@ -13613,7 +13671,7 @@ "version": "1.3.70", "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.3.70.tgz", "integrity": "sha512-LWVWlEDLlOD25PvA2NEz41UzdwXnlDyBiZbe69s3zM0DfCPwZXLUm79uSqH9ItsOjTrXSL5/1+XUL6C/BZwChA==", - "devOptional": true, + "dev": true, "requires": { "@swc/core-darwin-arm64": "1.3.70", "@swc/core-darwin-x64": "1.3.70", @@ -13631,60 +13689,70 @@ "version": "1.3.70", "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.70.tgz", "integrity": "sha512-31+mcl0dgdRHvZRjhLOK9V6B+qJ7nxDZYINr9pBlqGWxknz37Vld5KK19Kpr79r0dXUZvaaelLjCnJk9dA2PcQ==", + "dev": true, "optional": true }, "@swc/core-darwin-x64": { "version": "1.3.70", "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.3.70.tgz", "integrity": "sha512-GMFJ65E18zQC80t0os+TZvI+8lbRuitncWVge/RXmXbVLPRcdykP4EJ87cqzcG5Ah0z18/E0T+ixD6jHRisrYQ==", + "dev": true, "optional": true }, "@swc/core-linux-arm-gnueabihf": { "version": "1.3.70", "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.70.tgz", "integrity": "sha512-wjhCwS8LCiAq2VedF1b4Bryyw68xZnfMED4pLRazAl8BaUlDFANfRBORNunxlfHQj4V3x39IaiLgCZRHMdzXBg==", + "dev": true, "optional": true }, "@swc/core-linux-arm64-gnu": { "version": "1.3.70", "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.70.tgz", "integrity": "sha512-9D/Rx67cAOnMiexvCqARxvhj7coRajTp5HlJHuf+rfwMqI2hLhpO9/pBMQxBUAWxODO/ksQ/OF+GJRjmtWw/2A==", + "dev": true, "optional": true }, "@swc/core-linux-arm64-musl": { "version": "1.3.70", "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.70.tgz", "integrity": "sha512-gkjxBio7XD+1GlQVVyPP/qeFkLu83VhRHXaUrkNYpr5UZG9zZurBERT9nkS6Y+ouYh+Q9xmw57aIyd2KvD2zqQ==", + "dev": true, "optional": true }, "@swc/core-linux-x64-gnu": { "version": "1.3.70", "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.70.tgz", "integrity": "sha512-/nCly+V4xfMVwfEUoLLAukxUSot/RcSzsf6GdsGTjFcrp5sZIntAjokYRytm3VT1c2TK321AfBorsi9R5w8Y7Q==", + "dev": true, "optional": true }, "@swc/core-linux-x64-musl": { "version": "1.3.70", "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.70.tgz", "integrity": "sha512-HoOsPJbt361KGKaivAK0qIiYARkhzlxeAfvF5NlnKxkIMOZpQ46Lwj3tR0VWohKbrhS+cYKFlVuDi5XnDkx0XA==", + "dev": true, "optional": true }, "@swc/core-win32-arm64-msvc": { "version": "1.3.70", "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.70.tgz", "integrity": "sha512-hm4IBK/IaRil+aj1cWU6f0GyAdHpw/Jr5nyFYLM2c/tt7w2t5hgb8NjzM2iM84lOClrig1fG6edj2vCF1dFzNQ==", + "dev": true, "optional": true }, "@swc/core-win32-ia32-msvc": { "version": "1.3.70", "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.70.tgz", "integrity": "sha512-5cgKUKIT/9Fp5fCA+zIjYCQ4dSvjFYOeWGZR3QiTXGkC4bGa1Ji9SEPyeIAX0iruUnKjYaZB9RvHK2tNn7RLrQ==", + "dev": true, "optional": true }, "@swc/core-win32-x64-msvc": { "version": "1.3.70", "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.70.tgz", "integrity": "sha512-LE8lW46+TQBzVkn2mHBlk8DIElPIZ2dO5P8AbJiARNBAnlqQWu67l9gWM89UiZ2l33J2cI37pHzON3tKnT8f9g==", + "dev": true, "optional": true }, "@swc/jest": { @@ -13716,24 +13784,32 @@ "version": "1.0.9", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true, + "optional": true, "peer": true }, "@tsconfig/node12": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true, + "optional": true, "peer": true }, "@tsconfig/node14": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true, + "optional": true, "peer": true }, "@tsconfig/node16": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true, + "optional": true, "peer": true }, "@types/babel__core": { @@ -14087,7 +14163,8 @@ "acorn": { "version": "8.9.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.9.0.tgz", - "integrity": "sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==" + "integrity": "sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==", + "dev": true }, "acorn-jsx": { "version": "5.3.2", @@ -14100,6 +14177,8 @@ "version": "8.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true, + "optional": true, "peer": true }, "agent-base": { @@ -14175,6 +14254,8 @@ "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true, + "optional": true, "peer": true }, "argparse": { @@ -14839,6 +14920,8 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true, + "optional": true, "peer": true }, "cross-spawn": { @@ -15072,6 +15155,8 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "optional": true, "peer": true }, "diff-sequences": { @@ -18220,6 +18305,11 @@ } } }, + "jiti": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.19.1.tgz", + "integrity": "sha512-oVhqoRDaBXf7sjkll95LHVS6Myyyb1zaunVwk4Z0+WPSW4gjS0pl01zYKHScTuyEhQsFxV5L4DR5r+YqSyqyyg==" + }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -18435,6 +18525,8 @@ "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true, + "optional": true, "peer": true }, "makeerror": { @@ -19826,6 +19918,8 @@ "version": "10.9.1", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "optional": true, "peer": true, "requires": { "@cspotcode/source-map-support": "^0.8.0", @@ -19939,7 +20033,8 @@ "typescript": { "version": "5.1.6", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", - "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==" + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "dev": true }, "unbox-primitive": { "version": "1.0.2", @@ -20037,6 +20132,8 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true, + "optional": true, "peer": true }, "v8-to-istanbul": { @@ -20288,6 +20385,8 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "optional": true, "peer": true }, "yocto-queue": { diff --git a/package.json b/package.json index 2d810da..26d2cff 100644 --- a/package.json +++ b/package.json @@ -49,9 +49,11 @@ "peerDependencies": { "@types/node": "*", "cosmiconfig": ">=8.2", - "ts-node": ">=10", "typescript": ">=4" }, + "dependencies": { + "jiti": "^1.19.1" + }, "devDependencies": { "@swc/core": "^1.3.70", "@swc/jest": "^0.2.27", diff --git a/scripts/esbuild.config.mjs b/scripts/esbuild.config.mjs index d561e1c..0f4d570 100644 --- a/scripts/esbuild.config.mjs +++ b/scripts/esbuild.config.mjs @@ -55,10 +55,6 @@ async function buildSources(entryPoints, format) { platform: "node", format: format, metafile: true, - supported: { - // Performs transform of `import` to `require` - "dynamic-import": format !== "cjs", - }, // These allow us to build compliant exports and imports based on modern node bundle: true, diff --git a/smoke-tests/config.ts b/smoke-tests/config.ts new file mode 100644 index 0000000..0690e8a --- /dev/null +++ b/smoke-tests/config.ts @@ -0,0 +1,3 @@ +export default { + cake: "lie", +}; diff --git a/smoke-tests/smoke-test-cjs.cjs b/smoke-tests/smoke-test-cjs.cjs index 3aa9210..5fe64b6 100644 --- a/smoke-tests/smoke-test-cjs.cjs +++ b/smoke-tests/smoke-test-cjs.cjs @@ -1,4 +1,28 @@ +const assert = require("node:assert"); + +const { cosmiconfig } = require("cosmiconfig"); const { TypeScriptLoader } = require("../dist/cjs/index.cjs"); TypeScriptLoader(); -console.info("Loaded with CJS successfully"); +(async () => { + try { + const explorer = cosmiconfig("test", { + loaders: { + ".ts": TypeScriptLoader(), + }, + }); + + const cfg = await explorer.load("./smoke-tests/config.ts"); + + assert.deepStrictEqual(cfg.config, { + cake: "lie", + }); + + console.info("Loaded with CJS successfully"); + } catch (error) { + console.error(error); + console.debug(error.stack); + console.error("Failed to load with CJS"); + process.exit(1); + } +})(); diff --git a/smoke-tests/smoke-test-esm.mjs b/smoke-tests/smoke-test-esm.mjs index 6baff6d..e19e206 100644 --- a/smoke-tests/smoke-test-esm.mjs +++ b/smoke-tests/smoke-test-esm.mjs @@ -1,4 +1,28 @@ +import assert from "node:assert"; + +import { cosmiconfig } from "cosmiconfig"; import { TypeScriptLoader } from "../dist/esm/index.mjs"; TypeScriptLoader(); -console.info("Loaded with ESM successfully"); +(async () => { + try { + const explorer = cosmiconfig("test", { + loaders: { + ".ts": TypeScriptLoader(), + }, + }); + + const cfg = await explorer.load("./smoke-tests/config.ts"); + + assert.deepStrictEqual(cfg.config, { + cake: "lie", + }); + + console.info("Loaded with ESM successfully"); + } catch (error) { + console.error(error); + console.debug(error.stack); + console.error("Failed to load with ESM"); + process.exit(1); + } +})();