Switch to typescript

This commit is contained in:
Curt Spark 2024-04-12 10:50:48 +01:00
parent 8301ccf6eb
commit 3ae2231ea7
9 changed files with 108 additions and 18 deletions

View File

@ -1,3 +1,3 @@
{ {
"presets": ["@babel/preset-env", "@babel/preset-react"] "presets": ["@babel/preset-env", "@babel/preset-react", "@babel/preset-typescript"]
} }

67
package-lock.json generated
View File

@ -16,11 +16,13 @@
"react-dom": "^18.2.0" "react-dom": "^18.2.0"
}, },
"devDependencies": { "devDependencies": {
"@babel/preset-typescript": "^7.24.1",
"babel-loader": "^9.1.3", "babel-loader": "^9.1.3",
"css-loader": "^7.1.1", "css-loader": "^7.1.1",
"html-webpack-plugin": "^5.6.0", "html-webpack-plugin": "^5.6.0",
"prettier": "3.2.5", "prettier": "3.2.5",
"style-loader": "^4.0.0", "style-loader": "^4.0.0",
"typescript": "^5.4.5",
"webpack": "^5.91.0", "webpack": "^5.91.0",
"webpack-cli": "^5.1.4", "webpack-cli": "^5.1.4",
"webpack-dev-server": "^5.0.4" "webpack-dev-server": "^5.0.4"
@ -758,6 +760,21 @@
"@babel/core": "^7.0.0-0" "@babel/core": "^7.0.0-0"
} }
}, },
"node_modules/@babel/plugin-syntax-typescript": {
"version": "7.24.1",
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.1.tgz",
"integrity": "sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw==",
"dev": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.24.0"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-syntax-unicode-sets-regex": { "node_modules/@babel/plugin-syntax-unicode-sets-regex": {
"version": "7.18.6", "version": "7.18.6",
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz",
@ -1498,6 +1515,24 @@
"@babel/core": "^7.0.0-0" "@babel/core": "^7.0.0-0"
} }
}, },
"node_modules/@babel/plugin-transform-typescript": {
"version": "7.24.4",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.24.4.tgz",
"integrity": "sha512-79t3CQ8+oBGk/80SQ8MN3Bs3obf83zJ0YZjDmDaEZN8MqhMI760apl5z6a20kFeMXBwJX99VpKT8CKxEBp5H1g==",
"dev": true,
"dependencies": {
"@babel/helper-annotate-as-pure": "^7.22.5",
"@babel/helper-create-class-features-plugin": "^7.24.4",
"@babel/helper-plugin-utils": "^7.24.0",
"@babel/plugin-syntax-typescript": "^7.24.1"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-transform-unicode-escapes": { "node_modules/@babel/plugin-transform-unicode-escapes": {
"version": "7.24.1", "version": "7.24.1",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.1.tgz", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.1.tgz",
@ -1683,6 +1718,25 @@
"@babel/core": "^7.0.0-0" "@babel/core": "^7.0.0-0"
} }
}, },
"node_modules/@babel/preset-typescript": {
"version": "7.24.1",
"resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.24.1.tgz",
"integrity": "sha512-1DBaMmRDpuYQBPWD8Pf/WEwCrtgRHxsZnP4mIy9G/X+hFfbI47Q2G4t1Paakld84+qsk2fSsUPMKg71jkoOOaQ==",
"dev": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.24.0",
"@babel/helper-validator-option": "^7.23.5",
"@babel/plugin-syntax-jsx": "^7.24.1",
"@babel/plugin-transform-modules-commonjs": "^7.24.1",
"@babel/plugin-transform-typescript": "^7.24.1"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/regjsgen": { "node_modules/@babel/regjsgen": {
"version": "0.8.0", "version": "0.8.0",
"resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz",
@ -6241,6 +6295,19 @@
"node": ">= 0.6" "node": ">= 0.6"
} }
}, },
"node_modules/typescript": {
"version": "5.4.5",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz",
"integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==",
"dev": true,
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"
},
"engines": {
"node": ">=14.17"
}
},
"node_modules/undici-types": { "node_modules/undici-types": {
"version": "5.26.5", "version": "5.26.5",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",

View File

@ -5,7 +5,8 @@
"private": true, "private": true,
"scripts": { "scripts": {
"test": "echo \"Error: no test specified\" && exit 1", "test": "echo \"Error: no test specified\" && exit 1",
"build": "webpack" "build": "webpack",
"dev": "webpack-dev-server --mode development --open --hot"
}, },
"repository": { "repository": {
"type": "git", "type": "git",
@ -14,11 +15,13 @@
"author": "Curt Spark", "author": "Curt Spark",
"license": "GPL-3.0-or-later", "license": "GPL-3.0-or-later",
"devDependencies": { "devDependencies": {
"@babel/preset-typescript": "^7.24.1",
"babel-loader": "^9.1.3", "babel-loader": "^9.1.3",
"css-loader": "^7.1.1", "css-loader": "^7.1.1",
"html-webpack-plugin": "^5.6.0", "html-webpack-plugin": "^5.6.0",
"prettier": "3.2.5", "prettier": "3.2.5",
"style-loader": "^4.0.0", "style-loader": "^4.0.0",
"typescript": "^5.4.5",
"webpack": "^5.91.0", "webpack": "^5.91.0",
"webpack-cli": "^5.1.4", "webpack-cli": "^5.1.4",
"webpack-dev-server": "^5.0.4" "webpack-dev-server": "^5.0.4"

View File

@ -1,9 +0,0 @@
import React from "react";
class App extends React.Component {
render() {
return <div>Welcome to React!</div>;
}
}
export default App;

9
src/App.tsx Normal file
View File

@ -0,0 +1,9 @@
import * as React from "react";
export default function App() {
return (
<main>
<p>App</p>
</main>
);
}

View File

@ -1,5 +0,0 @@
import React from "react";
import ReactDOM from "react-dom";
import App from "./App";
ReactDOM.render(<App />, document.getElementById("root"));

11
src/index.tsx Normal file
View File

@ -0,0 +1,11 @@
import * as React from "react";
import * as ReactDOM from "react-dom/client";
import App from "./App.tsx";
const rootElement = document.getElementById("root");
const root = ReactDOM.createRoot(rootElement!);
root.render(
<App />
);

14
tsconfig.json Normal file
View File

@ -0,0 +1,14 @@
{
"compilerOptions": {
"jsx": "react-jsx" /* IMPORTANT! - this allows our JSX to be transpiled correctly */,
"target": "es5" /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */,
"esModuleInterop": true /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */,
"allowSyntheticDefaultImports": true /* Need for Webpack config file */,
"forceConsistentCasingInFileNames": true /* Ensure that casing is correct in imports. */,
"strict": true /* Enable all strict type-checking options. */,
"skipLibCheck": true /* Skip type checking all .d.ts files. */,
"outDir": "dist",
"moduleResolution": "node"
},
"include": ["**/*.ts", "**/*.tsx"]
}

View File

@ -2,7 +2,7 @@ const path = require("path");
const HtmlWebpackPlugin = require("html-webpack-plugin"); const HtmlWebpackPlugin = require("html-webpack-plugin");
module.exports = { module.exports = {
entry: "./src/index.js", entry: "./src/index.tsx",
output: { output: {
filename: "main.js", filename: "main.js",
path: path.resolve(__dirname, "dist"), path: path.resolve(__dirname, "dist"),
@ -10,7 +10,7 @@ module.exports = {
module: { module: {
rules: [ rules: [
{ {
test: /\.(js|jsx)$/, test: /\.(ts|tsx)$/,
exclude: /node_modules/, exclude: /node_modules/,
use: "babel-loader", use: "babel-loader",
}, },