Skip to content

Commit 3bd0cb3

Browse files
authored
Modernize tools, migrate to TypeScript (#31)
* Migrate to ts * Update tools * Fix CI to use Corepack Yarn 4
1 parent 337ecfc commit 3bd0cb3

File tree

119 files changed

+14060
-12348
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

119 files changed

+14060
-12348
lines changed

.babelrc.js

Lines changed: 0 additions & 9 deletions
This file was deleted.

.eslintrc.js

Lines changed: 0 additions & 20 deletions
This file was deleted.

.github/workflows/pr-test.yml

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
name: PR Test
2+
3+
on:
4+
pull_request:
5+
workflow_dispatch:
6+
7+
jobs:
8+
test:
9+
runs-on: ubuntu-latest
10+
11+
steps:
12+
- name: Checkout
13+
uses: actions/checkout@v4
14+
15+
- name: Setup Node.js
16+
uses: actions/setup-node@v4
17+
with:
18+
node-version: 24
19+
20+
- name: Enable Corepack
21+
run: |
22+
corepack enable
23+
corepack prepare yarn@4.12.0 --activate
24+
25+
- name: Install dependencies
26+
run: yarn install --immutable
27+
28+
- name: Run tests
29+
run: npm test

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,4 @@ node_modules
22
*.log
33
dist
44
.DS_Store
5+
.yarn/install-state.gz

.prettierrc.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,6 @@
1-
module.exports = require('@rtivital/eslint-config/.prettierrc');
1+
module.exports = {
2+
singleQuote: true,
3+
trailingComma: 'es5',
4+
printWidth: 100,
5+
semi: true,
6+
};

.yarnrc.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
nodeLinker: node-modules

eslint.config.mjs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import mantine from 'eslint-config-mantine';
2+
import { defineConfig } from 'eslint/config';
3+
import tseslint from 'typescript-eslint';
4+
5+
// @ts-check
6+
export default defineConfig(
7+
tseslint.configs.recommended,
8+
...mantine,
9+
{ ignores: ['**/*.{mjs,cjs,js,d.ts,d.mts}'] },
10+
{
11+
files: ['**/*.story.tsx'],
12+
rules: { 'no-console': 'off' },
13+
},
14+
{
15+
languageOptions: {
16+
parserOptions: {
17+
tsconfigRootDir: process.cwd(),
18+
project: ['./tsconfig.json'],
19+
},
20+
},
21+
}
22+
);

package.json

Lines changed: 59 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -1,89 +1,85 @@
11
{
2-
"name": "Omatsuri",
2+
"name": "omatsuri",
33
"version": "1.0.0",
44
"description": "Open source frontend focused tools",
55
"repository": "https://github.com/rtivital/tools.git",
66
"author": "Vitaly Rtishchev <rtivital@gmail.com>",
77
"license": "MIT",
88
"private": true,
9+
"packageManager": "yarn@4.12.0",
10+
"engines": {
11+
"node": ">=24.0.0"
12+
},
913
"scripts": {
10-
"start": "npm run clean && webpack-dev-server",
11-
"build": "npm run clean && cross-env NODE_ENV=production webpack --progress",
14+
"start": "yarn clean && webpack serve --mode development --open",
15+
"build": "yarn clean && cross-env NODE_ENV=production webpack --mode production --progress",
1216
"clean": "rimraf ./dist",
13-
"deploy": "npm run build && gh-pages -d dist",
14-
"lint": "eslint src --ext jsx --ext js",
15-
"serve": "npm run build && http-server dist -p 6002",
16-
"analyze": "npm run build -- --analyze"
17+
"deploy": "yarn build && gh-pages -d dist",
18+
"test": "npm run lint && prettier --check . && npm run typecheck",
19+
"lint": "eslint src --ext .js,.jsx,.ts,.tsx",
20+
"typecheck": "tsc --noEmit",
21+
"serve": "yarn build && http-server dist -p 6002",
22+
"analyze": "yarn build -- --analyze"
1723
},
1824
"browserslist": [
1925
"> 1%",
2026
"last 2 versions"
2127
],
2228
"devDependencies": {
23-
"@babel/core": "^7.11.6",
24-
"@babel/plugin-proposal-class-properties": "^7.10.4",
25-
"@babel/plugin-proposal-export-default-from": "^7.10.4",
26-
"@babel/plugin-proposal-export-namespace-from": "^7.10.4",
27-
"@babel/preset-env": "^7.11.5",
28-
"@babel/preset-react": "^7.10.4",
29-
"@rtivital/eslint-config": "1.0.1",
30-
"autoprefixer": "^9.8.6",
31-
"babel-eslint": "^10.1.0",
32-
"babel-loader": "^8.1.0",
29+
"@eslint/js": "^9.39.1",
30+
"@pmmmwh/react-refresh-webpack-plugin": "^0.6.1",
31+
"@types/react": "^18.3.18",
32+
"@types/react-dom": "^18.3.5",
33+
"autoprefixer": "^10.4.20",
3334
"cname-webpack-plugin": "^2.0.1",
34-
"cross-env": "^7.0.2",
35-
"css-loader": "^4.3.0",
36-
"eslint": "^7.9.0",
37-
"eslint-config-airbnb": "^18.2.0",
38-
"eslint-import-resolver-webpack": "^0.12.2",
39-
"eslint-plugin-import": "^2.22.0",
40-
"eslint-plugin-jsx-a11y": "^6.3.1",
41-
"eslint-plugin-react": "^7.20.6",
42-
"eslint-plugin-react-hooks": "^4.1.2",
43-
"favicons-webpack-plugin": "^4.2.0",
44-
"file-loader": "^6.1.0",
45-
"gh-pages": "^3.1.0",
46-
"html-webpack-plugin": "^4.4.1",
47-
"http-server": "^0.12.3",
48-
"less": "^3.12.2",
49-
"less-loader": "^7.0.1",
50-
"mini-css-extract-plugin": "^0.11.2",
51-
"open-browser-webpack-plugin": "^0.0.5",
52-
"optimize-css-assets-webpack-plugin": "^5.0.4",
53-
"postcss": "^7.0.32",
54-
"postcss-loader": "^4.0.1",
55-
"rimraf": "^3.0.2",
56-
"style-loader": "^1.2.1",
57-
"terser-webpack-plugin": "^4.2.0",
58-
"webpack": "^4.44.1",
59-
"webpack-bundle-analyzer": "^3.8.0",
60-
"webpack-cli": "^3.3.12",
61-
"webpack-dev-server": "^3.11.0",
62-
"worker-loader": "^3.0.2",
63-
"yargs": "^16.0.3"
35+
"cross-env": "^7.0.3",
36+
"css-loader": "^7.1.2",
37+
"css-minimizer-webpack-plugin": "^7.0.2",
38+
"eslint": "^9.39.1",
39+
"eslint-config-mantine": "^4.0.2",
40+
"eslint-plugin-jsx-a11y": "^6.10.2",
41+
"eslint-plugin-react": "^7.37.5",
42+
"eslint-plugin-react-hooks": "^5.2.0",
43+
"favicons": "^7.2.0",
44+
"favicons-webpack-plugin": "^6.0.1",
45+
"gh-pages": "^6.3.0",
46+
"html-webpack-plugin": "^5.6.3",
47+
"http-server": "^14.1.1",
48+
"less": "^4.2.2",
49+
"less-loader": "^12.2.0",
50+
"mini-css-extract-plugin": "^2.9.2",
51+
"postcss": "^8.5.3",
52+
"postcss-loader": "^8.1.1",
53+
"prettier": "^3.5.3",
54+
"react-refresh": "^0.16.0",
55+
"rimraf": "^6.0.1",
56+
"style-loader": "^4.0.0",
57+
"terser-webpack-plugin": "^5.3.14",
58+
"ts-loader": "^9.5.2",
59+
"typescript": "^5.8.2",
60+
"typescript-eslint": "^8.46.2",
61+
"webpack": "^5.98.0",
62+
"webpack-bundle-analyzer": "^4.10.2",
63+
"webpack-cli": "^6.0.1",
64+
"webpack-dev-server": "^5.2.0"
6465
},
6566
"dependencies": {
66-
"classnames": "^2.2.6",
67-
"color": "^3.1.2",
68-
"faker": "^4.1.0",
67+
"@faker-js/faker": "^9.5.0",
68+
"@mantine/hooks": "^7.17.8",
69+
"clsx": "^2.1.1",
70+
"color": "^5.0.2",
6971
"fuse.js": "^6.4.1",
70-
"lorem-ipsum": "^2.0.3",
72+
"lorem-ipsum": "^2.0.8",
7173
"normalize.css": "^8.0.1",
72-
"offline-plugin": "^5.0.7",
7374
"open-color": "^1.7.0",
7475
"pokeipsum": "^1.1.0",
75-
"prettier": "^2.1.1",
7676
"prop-types": "^15.7.2",
77-
"react": "^16.13.1",
78-
"react-colorful": "^4.0.4",
79-
"react-custom-scrollbars": "^4.2.1",
80-
"react-dom": "^16.13.1",
81-
"react-hot-loader": "^4.12.21",
82-
"react-router-dom": "^5.2.0",
77+
"react": "^18.3.1",
78+
"react-colorful": "^5.6.1",
79+
"react-custom-scrollbars-2": "^4.5.0",
80+
"react-dom": "^18.3.1",
81+
"react-router-dom": "^6.30.0",
8382
"samuel-ipsum": "^1.0.11",
84-
"svg-to-jsx": "^1.0.2",
85-
"svgo-browser": "^1.3.7",
86-
"uuid": "^8.3.0",
87-
"xooks": "^2.2.6"
83+
"uuid": "^11.1.0"
8884
}
8985
}

src/App.jsx

Lines changed: 0 additions & 57 deletions
This file was deleted.

src/App.tsx

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
import type { ReactElement } from 'react';
2+
import { BrowserRouter, Route, Routes } from 'react-router-dom';
3+
4+
import ThemeProvider from './ThemeProvider';
5+
import AppContainer from './components/AppContainer/AppContainer';
6+
7+
import Index from './pages/index/Index';
8+
import About from './pages/about/About';
9+
import NotFound from './pages/not-found/NotFound';
10+
11+
import TriangleGenerator from './apps/triangle-generator/TriangleGenerator';
12+
import LoremIpsum from './apps/lorem-ipsum/LoremIpsum';
13+
import SvgCompressor from './apps/svg-compressor/SvgCompressor';
14+
import SvgToJsx from './apps/svg-to-jsx/SvgToJsx';
15+
import HtmlSymbols from './apps/html-symbols/HtmlSymbols';
16+
import Base64Encoding from './apps/b64-encoding/B64Encoding';
17+
import ColorShadesGenerator from './apps/color-shades-generator/ColorShadesGenerator';
18+
import PageDividers from './apps/page-dividers/PageDividers';
19+
import FakeDataGenerator from './apps/fake-data-generator/FakeDataGenerator';
20+
import CssCursors from './apps/css-cursors/CssCursors';
21+
import EventsKeycode from './apps/events-keycode/EventsKeycode';
22+
import GradientGenerator from './apps/gradient-generator/GradientGenerator';
23+
24+
const withContainer = (component: ReactElement) => <AppContainer>{component}</AppContainer>;
25+
26+
export default function App() {
27+
return (
28+
<ThemeProvider>
29+
<BrowserRouter>
30+
<Routes>
31+
<Route path="/" element={<Index />} />
32+
<Route path="/about" element={<About />} />
33+
<Route path="/triangle-generator" element={withContainer(<TriangleGenerator />)} />
34+
<Route path="/lorem-ipsum" element={withContainer(<LoremIpsum />)} />
35+
<Route path="/svg-compressor" element={withContainer(<SvgCompressor />)} />
36+
<Route path="/svg-to-jsx" element={withContainer(<SvgToJsx />)} />
37+
<Route path="/html-symbols" element={withContainer(<HtmlSymbols />)} />
38+
<Route path="/b64-encoding" element={withContainer(<Base64Encoding />)} />
39+
<Route path="/color-shades-generator" element={withContainer(<ColorShadesGenerator />)} />
40+
<Route path="/page-dividers" element={withContainer(<PageDividers />)} />
41+
<Route path="/fake-data-generator" element={withContainer(<FakeDataGenerator />)} />
42+
<Route path="/css-cursors" element={withContainer(<CssCursors />)} />
43+
<Route path="/events-keycode" element={withContainer(<EventsKeycode />)} />
44+
<Route path="/gradient-generator" element={withContainer(<GradientGenerator />)} />
45+
<Route path="*" element={withContainer(<NotFound />)} />
46+
</Routes>
47+
</BrowserRouter>
48+
</ThemeProvider>
49+
);
50+
}

0 commit comments

Comments
 (0)