Skip to content

Commit 2b4b2bc

Browse files
committed
feat(Reader): v0.1.0
1 parent f79d5e0 commit 2b4b2bc

File tree

106 files changed

+23883
-1
lines changed

Some content is hidden

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

106 files changed

+23883
-1
lines changed

.editorconfig

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
# http://editorconfig.org
2+
3+
root = true
4+
5+
[*]
6+
charset = utf-8
7+
indent_style = space
8+
indent_size = 2
9+
end_of_line = lf
10+
insert_final_newline = true
11+
trim_trailing_whitespace = true

.env.development

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
NODE_ENV=development

.env.production

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
NODE_ENV=production

.eslintrc.js

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
module.exports = {
2+
root: true,
3+
env: {
4+
browser: true,
5+
node: true,
6+
es2023: true,
7+
},
8+
parser: '@typescript-eslint/parser',
9+
plugins: [
10+
'@typescript-eslint',
11+
'sonarjs',
12+
],
13+
extends: [
14+
'airbnb',
15+
'plugin:react/jsx-runtime',
16+
'plugin:sonarjs/recommended',
17+
'plugin:import/typescript',
18+
],
19+
settings: {
20+
'import/core-modules': ['electron'],
21+
'import/resolver': {
22+
typescript: {},
23+
node: {
24+
extensions: ['.ts', '.tsx', '.js', '.jsx'],
25+
},
26+
},
27+
},
28+
rules: {
29+
'max-len': ['error', { code: 120 }],
30+
complexity: ['error', { max: 10 }],
31+
semi: ['error', 'never'],
32+
'no-confusing-arrow': ['off'],
33+
'no-restricted-syntax': ['off'],
34+
'no-unused-vars': ['off'],
35+
'@typescript-eslint/no-unused-vars': ['error'],
36+
'no-nested-ternary': ['off'],
37+
38+
'react/jsx-filename-extension': ['error', { extensions: ['.tsx'] }],
39+
'react/require-default-props': ['off'],
40+
'jsx-a11y/click-events-have-key-events': ['off'],
41+
'jsx-a11y/interactive-supports-focus': ['off'],
42+
43+
'import/extensions': ['error', {
44+
js: 'never',
45+
jsx: 'never',
46+
ts: 'never',
47+
tsx: 'never',
48+
json: 'always',
49+
}],
50+
'import/no-extraneous-dependencies': ['error', {
51+
devDependencies: [
52+
'**/*.test.js',
53+
'**/*.spec.js',
54+
'build/**/*',
55+
'./*.js',
56+
'./*.ts',
57+
],
58+
}],
59+
'import/prefer-default-export': ['off'],
60+
},
61+
}

.github/workflows/release.yml

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
name: Release
2+
on:
3+
push:
4+
tags:
5+
- 'v*'
6+
7+
jobs:
8+
Release:
9+
strategy:
10+
matrix:
11+
os: [macos-latest, ubuntu-latest, windows-latest]
12+
runs-on: ${{ matrix.os }}
13+
permissions: write-all
14+
steps:
15+
- uses: actions/checkout@v4
16+
- uses: actions/setup-node@v3
17+
with:
18+
node-version: 20
19+
- name: Install dependens
20+
run: npm ci
21+
- name: Build
22+
run: npm run build
23+
- name: Pre release
24+
run: node scripts/prepackage.js
25+
- name: Publish
26+
env:
27+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
28+
run: npm run publish
29+

.gitignore

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
.DS_Store
2+
3+
node_modules/
4+
5+
out/
6+
dist/

.husky/commit-msg

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
#!/usr/bin/env sh
2+
. "$(dirname -- "$0")/_/husky.sh"
3+
4+
npx --no -- commitlint --edit ${1}

.husky/pre-commit

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
#!/usr/bin/env sh
2+
. "$(dirname -- "$0")/_/husky.sh"
3+
4+
npx lint-staged

.lintstagedrc.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"*.{js,jsx,ts,tsx}": "eslint"
3+
}

README.md

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,26 @@
1-
# emo
1+
# emo
2+
3+
I wish to develop **emo** as an **all in one** application. Now, it includes the follow apps:
4+
- **Reader** - A rss reader.
5+
6+
## Features
7+
- Support dark mode.
8+
- Support i18n (English and Simplified).
9+
- Support data sharing and synchronization between devices using cloud storage.
10+
11+
## Reader
12+
![Reader screenshot](./docs/images/screenshot.png)
13+
14+
### Keyboard shortcus
15+
- g then i: Go to Unread items
16+
- g then s: Go to Starred items
17+
- g then a: Go to All items
18+
- \* then a: Select all items
19+
- \* then n: Deselect all items
20+
- x: Select/Deselect item
21+
- s: Toggle star
22+
- j: Next item
23+
- k: Previous item
24+
- o: Open item
25+
- u: Close item
26+
- v: Open item in browser

assets/icons/icon.icns

199 KB
Binary file not shown.

assets/icons/icon.ico

6.08 KB
Binary file not shown.

assets/icons/icon.png

13.9 KB
Loading

babel.config.js

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
module.exports = (api) => {
2+
api.cache(true)
3+
4+
const plugins = []
5+
const presets = [
6+
'@babel/preset-env',
7+
[
8+
'@babel/preset-react',
9+
{
10+
runtime: 'automatic',
11+
},
12+
],
13+
'@babel/preset-typescript',
14+
]
15+
16+
const targets = {
17+
chrome: '116',
18+
}
19+
20+
if (process.env.NODE_ENV === 'development') {
21+
plugins.push('react-refresh/babel')
22+
}
23+
24+
return {
25+
targets,
26+
presets,
27+
plugins,
28+
}
29+
}

build/main/webpack.config.common.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import * as path from 'node:path'
2+
import { merge } from 'webpack-merge'
3+
import baseConfig from '../webpack.config.base'
4+
import { src } from '../paths'
5+
6+
const context = path.resolve(src, './main')
7+
8+
const config = merge(baseConfig, {
9+
context,
10+
target: ['electron-main'],
11+
entry: ['./main.ts'],
12+
output: {
13+
filename: 'main.js',
14+
},
15+
externals: {
16+
sqlite3: 'commonjs sqlite3',
17+
},
18+
})
19+
20+
export default config

build/main/webpack.config.dev.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import { merge } from 'webpack-merge'
2+
import commonConfig from './webpack.config.common'
3+
4+
const config = merge(commonConfig, {
5+
mode: 'development',
6+
devtool: 'eval-source-map',
7+
watch: true,
8+
watchOptions: {
9+
ignored: /node_modules/,
10+
},
11+
})
12+
13+
export default config

build/main/webpack.config.prod.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import { merge } from 'webpack-merge'
2+
import commonConfig from './webpack.config.common'
3+
4+
const config = merge(commonConfig, {
5+
mode: 'production',
6+
devtool: 'source-map',
7+
optimization: {
8+
minimize: false,
9+
},
10+
})
11+
12+
export default config

build/paths.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import * as path from 'node:path'
2+
3+
export const root = path.resolve(__dirname, '../')
4+
export const dist = path.resolve(root, './dist')
5+
export const src = path.resolve(root, './src')
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import * as path from 'node:path'
2+
import { merge } from 'webpack-merge'
3+
import baseConfig from '../webpack.config.base'
4+
import { src } from '../paths'
5+
6+
const context = path.resolve(src, './preload')
7+
8+
const config = merge(baseConfig, {
9+
context,
10+
target: ['electron-preload'],
11+
entry: ['./index.ts'],
12+
output: {
13+
filename: 'preload.js',
14+
},
15+
})
16+
17+
export default config

build/preload/webpack.config.dev.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import { merge } from 'webpack-merge'
2+
import commonConfig from './webpack.config.common'
3+
4+
const config = merge(commonConfig, {
5+
mode: 'development',
6+
devtool: 'eval-source-map',
7+
watch: true,
8+
watchOptions: {
9+
ignored: /node_modules/,
10+
},
11+
})
12+
13+
export default config

build/preload/webpack.config.prod.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import { merge } from 'webpack-merge'
2+
import commonConfig from './webpack.config.common'
3+
4+
const config = merge(commonConfig, {
5+
mode: 'production',
6+
devtool: 'source-map',
7+
})
8+
9+
export default config
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import * as path from 'node:path'
2+
import { merge } from 'webpack-merge'
3+
import HtmlWebpackPlugin from 'html-webpack-plugin'
4+
import baseConfig from '../webpack.config.base'
5+
import { src, dist } from '../paths'
6+
7+
const context = path.resolve(src, './renderer')
8+
9+
const config = merge(baseConfig, {
10+
context,
11+
target: ['web'],
12+
entry: ['./index.tsx'],
13+
output: {
14+
path: path.resolve(dist, './renderer'),
15+
publicPath: './',
16+
},
17+
plugins: [
18+
new HtmlWebpackPlugin({
19+
template: './index.html',
20+
}),
21+
],
22+
})
23+
24+
export default config

build/renderer/webpack.config.dev.ts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import { merge } from 'webpack-merge'
2+
import 'webpack-dev-server'
3+
import ReactRefreshWebpackPlugin from '@pmmmwh/react-refresh-webpack-plugin'
4+
import commonConfig from './webpack.config.common'
5+
6+
const config = merge(commonConfig, {
7+
mode: 'development',
8+
devtool: 'eval-source-map',
9+
output: {
10+
filename: 'renderer.dev.js',
11+
publicPath: '/',
12+
},
13+
devServer: {
14+
compress: true,
15+
hot: true,
16+
historyApiFallback: true,
17+
port: 4000,
18+
},
19+
plugins: [
20+
new ReactRefreshWebpackPlugin(),
21+
],
22+
})
23+
24+
export default config

build/renderer/webpack.config.prod.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import { merge } from 'webpack-merge'
2+
import commonConfig from './webpack.config.common'
3+
4+
const config = merge(commonConfig, {
5+
mode: 'production',
6+
devtool: 'source-map',
7+
output: {
8+
filename: 'renderer.js',
9+
},
10+
})
11+
12+
export default config

build/webpack.config.base.ts

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import * as path from 'node:path'
2+
import type { Configuration } from 'webpack'
3+
import { src, dist } from './paths'
4+
5+
const config: Configuration = {
6+
output: {
7+
path: dist,
8+
},
9+
resolve: {
10+
extensions: ['.ts', '.tsx', '...'],
11+
alias: {
12+
'@': path.resolve(src),
13+
},
14+
},
15+
module: {
16+
rules: [
17+
{
18+
test: /\.(ts|js)x?$/,
19+
exclude: /node_modules/,
20+
use: ['babel-loader'],
21+
},
22+
{
23+
test: /\.css$/i,
24+
use: [
25+
'style-loader',
26+
'css-loader',
27+
'postcss-loader',
28+
],
29+
},
30+
{
31+
test: /\.(png|svg|jpg|jpeg|gif)$/i,
32+
type: 'asset/resource',
33+
},
34+
{
35+
test: /\.(woff|woff2|eot|ttf|otf)$/i,
36+
type: 'asset/resource',
37+
},
38+
],
39+
},
40+
}
41+
42+
export default config

commitlint.config.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
module.exports = { extends: ['@commitlint/config-conventional'] }

docs/images/screenshot.png

1.05 MB
Loading

0 commit comments

Comments
 (0)