From bcaa531a5ba557cdb48e914cd9e3de4317ce8fd4 Mon Sep 17 00:00:00 2001 From: Lexus Drumgold Date: Sun, 12 Feb 2023 15:29:16 -0500 Subject: [PATCH] chore(loader): use `@flex-development/tsconfig-utils` - https://github.com/flex-development/tsconfig-utils/tree/1.1.1 Signed-off-by: Lexus Drumgold --- .cspell.json | 2 +- loader.mjs | 64 +++++++++++++++++++----------- package.json | 2 + yarn.lock | 108 +++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 152 insertions(+), 24 deletions(-) diff --git a/.cspell.json b/.cspell.json index bf3bf6c8..d586a6e0 100644 --- a/.cspell.json +++ b/.cspell.json @@ -48,5 +48,5 @@ "useGitignore": true, "usePnP": false, "version": "0.2", - "words": ["fldv", "flexdevelopmentllc", "mkbuild", "mlly"] + "words": ["fldv", "flexdevelopmentllc", "mkbuild", "mlly", "pathe", "tscu"] } diff --git a/loader.mjs b/loader.mjs index 34771ce9..08948531 100644 --- a/loader.mjs +++ b/loader.mjs @@ -1,31 +1,42 @@ /** - * @file Custom Loader + * @file Custom Loader Hooks * @module loader - * @see https://nodejs.org/docs/latest-v16.x/api/esm.html#loaders + * @see https://nodejs.org/api/esm.html#loaders */ import * as mlly from '@flex-development/mlly' +import * as pathe from '@flex-development/pathe' +import * as tscu from '@flex-development/tsconfig-utils' +import * as tutils from '@flex-development/tutils' import * as esbuild from 'esbuild' -import path from 'node:path' import { fileURLToPath, pathToFileURL } from 'node:url' -import tsconfig from './tsconfig.json' assert { type: 'json' } // add support for extensionless files in "bin" scripts // https://github.com/nodejs/modules/issues/488 mlly.EXTENSION_FORMAT_MAP.set('', mlly.Format.COMMONJS) /** - * URL of current working directory. + * URL of tsconfig file. * - * @const {URL} cwd + * @type {import('node:url').URL} + * @const tsconfig */ -const cwd = pathToFileURL(tsconfig.compilerOptions.baseUrl) +const tsconfig = mlly.toURL('tsconfig.json') /** - * Determines how `url` should be interpreted, retrieved, and parsed. + * TypeScript compiler options. + * + * @type {tscu.CompilerOptions} + * @const compilerOptions + */ +const compilerOptions = tscu.loadCompilerOptions(tsconfig) + +/** + * Determines how the module at the given `url` should be interpreted, + * retrieved, and parsed. * * @see {@linkcode LoadHookContext} - * @see https://nodejs.org/docs/latest-v16.x/api/esm.html#loadurl-context-nextload + * @see https://nodejs.org/api/esm.html#loadurl-context-nextload * * @async * @@ -43,25 +54,27 @@ export const load = async (url, context) => { /** * File extension of {@linkcode url}. * - * @const {string} ext + * @type {pathe.Ext | tutils.EmptyString} + * @const ext */ - const ext = path.extname(url) + const ext = pathe.extname(url) /** * Source code. * - * @var {Uint8Array | string | undefined} source + * @type {Uint8Array | string | undefined} + * @var source */ let source = await mlly.getSource(url, { format: context.format }) // transform typescript files if (/^\.(?:cts|mts|tsx?)$/.test(ext) && !/\.d\.(?:cts|mts|ts)$/.test(url)) { // resolve path aliases - source = await mlly.resolveAliases(source, { - aliases: tsconfig.compilerOptions.paths, + source = await tscu.resolvePaths(source, { conditions: context.conditions, - cwd, - parent: url + ext: '', + parent: url, + tsconfig }) // resolve modules @@ -73,11 +86,12 @@ export const load = async (url, context) => { // transpile source code const { code } = await esbuild.transform(source, { format: ext === '.cts' ? 'cjs' : 'esm', - loader: /^[cm]/.test(ext) ? 'ts' : ext.slice(1), + loader: ext.slice(/^\.[cm]/.test(ext) ? 2 : 1), minify: false, sourcefile: fileURLToPath(url), sourcemap: 'inline', - tsconfigRaw: { compilerOptions: tsconfig.compilerOptions } + target: `node${process.versions.node}`, + tsconfigRaw: { compilerOptions } }) // set source code to transpiled source @@ -96,7 +110,7 @@ export const load = async (url, context) => { * - Extensionless file and directory index resolution * * @see {@linkcode ResolveHookContext} - * @see https://nodejs.org/docs/latest-v16.x/api/esm.html#resolvespecifier-context-nextresolve + * @see https://nodejs.org/api/esm.html#resolvespecifier-context-nextresolve * * @async * @@ -110,18 +124,22 @@ export const resolve = async (specifier, context) => { // resolve path alias specifier = await mlly.resolveAlias(specifier, { - aliases: tsconfig.compilerOptions.paths, + aliases: tscu.loadPaths(tsconfig), conditions, - cwd, + cwd: pathToFileURL(compilerOptions.baseUrl), parent }) /** * Resolved module URL. * - * @const {URL} url + * @type {import('node:url').URL} + * @const url */ - const url = await mlly.resolveModule(specifier, { conditions, parent }) + const url = await mlly.resolveModule(specifier, { + conditions, + parent: parent?.startsWith('file:') ? parent : specifier + }) return { format: await mlly.getFormat(url), diff --git a/package.json b/package.json index 2a499443..19aea057 100644 --- a/package.json +++ b/package.json @@ -74,6 +74,8 @@ "@commitlint/config-conventional": "17.4.2", "@flex-development/mkbuild": "1.0.0-alpha.9", "@flex-development/mlly": "1.0.0-alpha.11", + "@flex-development/pathe": "1.0.3", + "@flex-development/tsconfig-utils": "1.1.1", "@flex-development/tutils": "6.0.0-alpha.10", "@graphql-eslint/eslint-plugin": "3.15.0", "@types/chai": "4.3.4", diff --git a/yarn.lock b/yarn.lock index 841caa82..57274af0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1161,6 +1161,8 @@ __metadata: "@commitlint/config-conventional": "npm:17.4.2" "@flex-development/mkbuild": "npm:1.0.0-alpha.9" "@flex-development/mlly": "npm:1.0.0-alpha.11" + "@flex-development/pathe": "npm:1.0.3" + "@flex-development/tsconfig-utils": "npm:1.1.1" "@flex-development/tutils": "npm:6.0.0-alpha.10" "@graphql-eslint/eslint-plugin": "npm:3.15.0" "@types/chai": "npm:4.3.4" @@ -1257,6 +1259,18 @@ __metadata: languageName: node linkType: hard +"@flex-development/errnode@npm:1.5.0": + version: 1.5.0 + resolution: "@flex-development/errnode@npm:1.5.0::__archiveUrl=https%3A%2F%2Fnpm.pkg.github.com%2Fdownload%2F%40flex-development%2Ferrnode%2F1.5.0%2F33dedbfaeb3139375e41d4382a8de53f9415a261" + dependencies: + "@flex-development/tutils": "npm:6.0.0-alpha.10" + node-inspect-extracted: "npm:2.0.0" + peerDependencies: + "@types/node": ">=14" + checksum: 884d5339afb245fdb3e635ba599e373ba1dd9f68e789c796817fe4fbe15317fb0192f49684b524c3baba1d4b70934799a5b353439543f29ee36b513d63e53bfa + languageName: node + linkType: hard + "@flex-development/export-regex@npm:1.0.0": version: 1.0.0 resolution: "@flex-development/export-regex@npm:1.0.0::__archiveUrl=https%3A%2F%2Fnpm.pkg.github.com%2Fdownload%2F%40flex-development%2Fexport-regex%2F1.0.0%2Fee7486c94c3ecbb392ae3beff0c9ecc4f1ce7282" @@ -1315,6 +1329,24 @@ __metadata: languageName: node linkType: hard +"@flex-development/mlly@npm:1.0.0-alpha.10": + version: 1.0.0-alpha.10 + resolution: "@flex-development/mlly@npm:1.0.0-alpha.10::__archiveUrl=https%3A%2F%2Fnpm.pkg.github.com%2Fdownload%2F%40flex-development%2Fmlly%2F1.0.0-alpha.10%2F6e84e05b66e57a92d750539044617fce7304b80f" + dependencies: + "@flex-development/errnode": "npm:1.4.0" + "@flex-development/export-regex": "npm:1.0.0" + "@flex-development/import-regex": "npm:2.0.1" + "@flex-development/is-builtin": "npm:2.0.0" + "@flex-development/pathe": "npm:1.0.3" + "@flex-development/pkg-types": "npm:2.0.0" + "@flex-development/tutils": "npm:6.0.0-alpha.9" + peerDependencies: + "@types/node": ">=14.17.0" + node-fetch: ">=3.3.0" + checksum: 198d01ebe2c226b9df0aecb35eaf4e1bc56dc87a07ac809b5c5b9a8b88a35382a90837ee4c295f0a598588c3b6c6affb9418b59f0d8ce2e806c4179aa4ad4c06 + languageName: node + linkType: hard + "@flex-development/mlly@npm:1.0.0-alpha.11": version: 1.0.0-alpha.11 resolution: "@flex-development/mlly@npm:1.0.0-alpha.11::__archiveUrl=https%3A%2F%2Fnpm.pkg.github.com%2Fdownload%2F%40flex-development%2Fmlly%2F1.0.0-alpha.11%2F4801f76b2e43ae5f14be38212e22c43cf335af48" @@ -1369,6 +1401,36 @@ __metadata: languageName: node linkType: hard +"@flex-development/tsconfig-types@npm:3.2.0": + version: 3.2.0 + resolution: "@flex-development/tsconfig-types@npm:3.2.0::__archiveUrl=https%3A%2F%2Fnpm.pkg.github.com%2Fdownload%2F%40flex-development%2Ftsconfig-types%2F3.2.0%2Fe49eb5faa42583a340fdff7c9ec64ac5feaf4529" + dependencies: + "@flex-development/pkg-types": "npm:2.0.0" + "@flex-development/tutils": "npm:6.0.0-alpha.10" + checksum: 3955eb124d092798c32f3d72f8b9c79e97464ad3f20521b448f1432a64762f939f04fb983299d5d38c5e0963ab4efad71f9e262a27101cc4e571e1e50f5afdf8 + languageName: node + linkType: hard + +"@flex-development/tsconfig-utils@npm:1.1.1": + version: 1.1.1 + resolution: "@flex-development/tsconfig-utils@npm:1.1.1::__archiveUrl=https%3A%2F%2Fnpm.pkg.github.com%2Fdownload%2F%40flex-development%2Ftsconfig-utils%2F1.1.1%2Ffe7f9d391c9d4f0d8d2c31ab11bd36aae172d7da" + dependencies: + "@flex-development/errnode": "npm:1.5.0" + "@flex-development/mlly": "npm:1.0.0-alpha.10" + "@flex-development/pathe": "npm:1.0.3" + "@flex-development/tsconfig-types": "npm:3.2.0" + "@flex-development/tutils": "npm:6.0.0-alpha.10" + merge-anything: "npm:5.1.4" + sort-keys: "npm:5.0.0" + strip-bom: "npm:5.0.0" + strip-json-comments: "npm:5.0.0" + peerDependencies: + "@types/node": ">=14.18.36" + typescript: ">=4.7" + checksum: 4a5cd5d2c2e89766ef036b834f0cb36f4c4d3ac1a7340efb8f15fd7448dace057d77756f49305af4a5b202f6d3a05db20680517b60af7e905a40ff7f3d1a6d2d + languageName: node + linkType: hard + "@flex-development/tutils@npm:6.0.0-alpha.10": version: 6.0.0-alpha.10 resolution: "@flex-development/tutils@npm:6.0.0-alpha.10::__archiveUrl=https%3A%2F%2Fnpm.pkg.github.com%2Fdownload%2F%40flex-development%2Ftutils%2F6.0.0-alpha.10%2Fb2085f42d62aedfabfae2ed016c0cc5c47192f81" @@ -5641,6 +5703,13 @@ __metadata: languageName: node linkType: hard +"is-plain-obj@npm:^4.0.0": + version: 4.1.0 + resolution: "is-plain-obj@npm:4.1.0" + checksum: 9d6bfe46ad30eda62cc2f0caec2ee980257a84a0a003523588c8c0e5eb33b6e42e73910f42c323490bfdfdd1bf7fd7854e8f156c275da7c12bebebb1be11c73a + languageName: node + linkType: hard + "is-port-reachable@npm:4.0.0": version: 4.0.0 resolution: "is-port-reachable@npm:4.0.0" @@ -5685,6 +5754,13 @@ __metadata: languageName: node linkType: hard +"is-what@npm:^4.1.8": + version: 4.1.8 + resolution: "is-what@npm:4.1.8" + checksum: c2e9f829658980ab7bc0d21be714e9683bef7a48b76e412792135f333105f940098a77258704d352d794f7766def0da36549ce6080d1cc3c8e1f3c45a728c8db + languageName: node + linkType: hard + "is-wsl@npm:^2.2.0": version: 2.2.0 resolution: "is-wsl@npm:2.2.0" @@ -6316,6 +6392,15 @@ __metadata: languageName: node linkType: hard +"merge-anything@npm:5.1.4": + version: 5.1.4 + resolution: "merge-anything@npm:5.1.4" + dependencies: + is-what: "npm:^4.1.8" + checksum: 489fbf11bb7455e397a59bb1ed46e577308d6822b26c81ca204974f251c1e30b0f8586910195a59769c3732b33d6026f254031c05f77d54c99dcc160b35cb9a4 + languageName: node + linkType: hard + "merge-stream@npm:^2.0.0": version: 2.0.0 resolution: "merge-stream@npm:2.0.0" @@ -8064,6 +8149,15 @@ __metadata: languageName: node linkType: hard +"sort-keys@npm:5.0.0": + version: 5.0.0 + resolution: "sort-keys@npm:5.0.0" + dependencies: + is-plain-obj: "npm:^4.0.0" + checksum: f8a0a3e63f2c1a30921b8693ac785f974dd496e9e849f39685c4ce9f5901fc0f597226130668f4d1b95cf4c5a1aab4744802713428ef4057fd5b9257f0c6dee8 + languageName: node + linkType: hard + "source-map-js@npm:^1.0.2": version: 1.0.2 resolution: "source-map-js@npm:1.0.2" @@ -8242,6 +8336,13 @@ __metadata: languageName: node linkType: hard +"strip-bom@npm:5.0.0": + version: 5.0.0 + resolution: "strip-bom@npm:5.0.0" + checksum: 66cc7a869ae43ff0d6b9f26e7f623495cbf8ae6062ef9425f71d507009114098591b1c3468288695374f941b69a0129300fb3837859377e73cddfb1266df2216 + languageName: node + linkType: hard + "strip-bom@npm:^3.0.0": version: 3.0.0 resolution: "strip-bom@npm:3.0.0" @@ -8281,6 +8382,13 @@ __metadata: languageName: node linkType: hard +"strip-json-comments@npm:5.0.0": + version: 5.0.0 + resolution: "strip-json-comments@npm:5.0.0" + checksum: 3987fe7ac03f1f912375b63bfa010c54cfcf93b464eead789bd9deb3911bcf8fdaa6d3335e20915a7debbe76754b8bba18c13568e7c27946c21bbda117567666 + languageName: node + linkType: hard + "strip-json-comments@npm:^3.1.0, strip-json-comments@npm:^3.1.1": version: 3.1.1 resolution: "strip-json-comments@npm:3.1.1"