From 8830d6d965f1cb77fe0bedddf4db45da2ea60f0b Mon Sep 17 00:00:00 2001 From: mgermerie <73115044+mgermerie@users.noreply.github.com> Date: Tue, 24 Sep 2024 17:21:48 +0200 Subject: [PATCH] chore: update babel and webpack configs to support TypeScript --- .babelrc | 10 +++- config/babel-register/babel-hooks.mjs | 25 ++++++++- package-lock.json | 73 +++++++++++++++++++++++++++ package.json | 1 + webpack.config.cjs | 8 ++- 5 files changed, 112 insertions(+), 5 deletions(-) diff --git a/.babelrc b/.babelrc index ded830aa4d..02c1f168e9 100644 --- a/.babelrc +++ b/.babelrc @@ -1,5 +1,6 @@ { "presets": [ + ["@babel/preset-typescript"], ["@babel/preset-env", { "targets": { "browsers": "defaults and supports webgl2" @@ -8,7 +9,10 @@ }] ], "plugins": [ - ["module-resolver", { "root": ["./src"] } ], + ["module-resolver", { + "root": ["./src"], + "extensions": [".js", ".ts", ".tsx"] + }], ["babel-plugin-inline-import", { "extensions": [ ".json", @@ -17,7 +21,9 @@ ".css" ] }], - ["module-extension-resolver"], + ["module-extension-resolver", { + "srcExtensions": [".ts", ".js"] + }], ["@babel/plugin-transform-runtime", { "regenerator": false }], diff --git a/config/babel-register/babel-hooks.mjs b/config/babel-register/babel-hooks.mjs index 187d53c09f..58443a4929 100644 --- a/config/babel-register/babel-hooks.mjs +++ b/config/babel-register/babel-hooks.mjs @@ -71,7 +71,18 @@ async function transpile(source, context) { * the Node.js default resolve hook after the last user-supplied resolve hook */ export async function resolve(specifier, context, nextResolve) { - return nextResolve(specifier, context); + // Try to resolve the path of an imported module. + // If the resolver failed, retry substituting the extension with '.ts'. + try { + return await nextResolve(specifier, context); + } catch (err) { + if (err.code === 'ERR_MODULE_NOT_FOUND') { + const url = new URL(specifier, context.parentURL); + url.pathname = url.pathname.replace(/\.[^/.]+$/, '.ts'); + return nextResolve(url.href, context); + } + throw err; + } } /** @@ -87,7 +98,17 @@ export async function resolve(specifier, context, nextResolve) { * the last user-supplied load hook */ export async function load(url, context, nextLoad) { - const { format, shortCircuit, source } = await nextLoad(url, context); + // Try to load the file using the default loader (which supports both + // ESM/CJS modules) but does not support '.ts' extensions. Use the ESM + // module loader for typescript files. + const { format, shortCircuit, source } = await nextLoad(url, context) + .catch(async (error) => { + if (error.code === 'ERR_UNKNOWN_FILE_EXTENSION') { + return nextLoad(url, { ...context, format: 'module' }); + } + + throw error; + }); if (format !== 'module' && format !== 'commonjs') { return { format, shortCircuit, source }; diff --git a/package-lock.json b/package-lock.json index 82954ba883..574e210f9c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -27,6 +27,7 @@ "@babel/core": "^7.25.2", "@babel/plugin-transform-runtime": "^7.25.4", "@babel/preset-env": "^7.25.4", + "@babel/preset-typescript": "^7.24.7", "@babel/register": "^7.24.6", "@types/three": "^0.168.0", "@xmldom/xmldom": "^0.9.2", @@ -815,6 +816,22 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz", + "integrity": "sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-syntax-logical-assignment-operators": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", @@ -925,6 +942,22 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.4.tgz", + "integrity": "sha512-uMOCoHVU52BsSWxPOMVv5qKRdeSlPuImUCB2dlPuBSU+W2/ROE7/Zg8F2Kepbk+8yBa68LlRKxO+xgEVWorsDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-syntax-unicode-sets-regex": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", @@ -1730,6 +1763,26 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.25.2.tgz", + "integrity": "sha512-lBwRvjSmqiMYe/pS0+1gggjJleUJi7NzjvQ1Fkqtt69hBa/0t1YuW/MLQMAPixfwaQOHUXsd6jeU3Z+vdGv3+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-create-class-features-plugin": "^7.25.0", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/plugin-syntax-typescript": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-transform-unicode-escapes": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.7.tgz", @@ -1910,6 +1963,26 @@ "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" } }, + "node_modules/@babel/preset-typescript": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.24.7.tgz", + "integrity": "sha512-SyXRe3OdWwIwalxDg5UtJnJQO+YPcTfwiIY2B0Xlddh9o7jpWLvv8X1RthIeDOxQ+O1ML5BLPCONToObyVQVuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-validator-option": "^7.24.7", + "@babel/plugin-syntax-jsx": "^7.24.7", + "@babel/plugin-transform-modules-commonjs": "^7.24.7", + "@babel/plugin-transform-typescript": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/register": { "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.24.6.tgz", diff --git a/package.json b/package.json index cc9726156d..5c4d5564c4 100644 --- a/package.json +++ b/package.json @@ -79,6 +79,7 @@ "@babel/core": "^7.25.2", "@babel/plugin-transform-runtime": "^7.25.4", "@babel/preset-env": "^7.25.4", + "@babel/preset-typescript": "^7.24.7", "@babel/register": "^7.24.6", "@types/three": "^0.168.0", "@xmldom/xmldom": "^0.9.2", diff --git a/webpack.config.cjs b/webpack.config.cjs index 5cfa18f1ef..d954fb78c0 100644 --- a/webpack.config.cjs +++ b/webpack.config.cjs @@ -45,6 +45,12 @@ module.exports = () => { return { mode, context: path.resolve(__dirname), + resolve: { + extensions: ['.ts', '.js'], + extensionAlias: { + '.js': ['.ts', '.js'], + }, + }, entry: { itowns: [ 'core-js', @@ -76,7 +82,7 @@ module.exports = () => { module: { rules: [ { - test: /\.js$/, + test: /\.(js|ts)$/, exclude, include, use: babelLoaderOptions,