pack: add .editorconfig and use tab instead of space

This commit is contained in:
leejooy96 committed 2022-10-29 12:35:12 +09:00
1 parent be3638b9d3
commit be7a8ac3ea
27 files changed
+571 -560

No files matched your search

+11
View File
@@ -0,0 +1,11 @@
# http://editorconfig.org
root = true
[*]
charset = utf-8
end_of_line = lf
indent_style = tab
indent_size = 2
insert_final_newline = true
max_line_length = 80
trim_trailing_whitespace = true
+29 -29
View File
@@ -1,31 +1,31 @@
{ {
"root": true, "root": true,
"parser": "vue-eslint-parser", "parser": "vue-eslint-parser",
"parserOptions": { "parserOptions": {
"parser": "@typescript-eslint/parser", "parser": "@typescript-eslint/parser",
"sourceType": "module", "sourceType": "module",
"ecmaVersion": 2022, "ecmaVersion": 2022,
"ecmaFeatures": { "ecmaFeatures": {
"jsx": true "jsx": true
} }
}, },
"env": { "env": {
"node": true, "node": true,
"es6": true "es6": true
}, },
"extends": ["standard", "plugin:vue/vue3-recommended", "prettier"], "extends": ["standard", "plugin:vue/vue3-recommended", "prettier"],
"globals": { "globals": {
"__static": true "__static": true
}, },
"plugins": ["vue"], "plugins": ["vue"],
"rules": { "rules": {
"arrow-parens": 0, "arrow-parens": 0,
"generator-star-spacing": 0, "generator-star-spacing": 0,
"no-case-declarations": 0, "no-case-declarations": 0,
"array-callback-return": 0, "array-callback-return": 0,
"no-trailing-spaces": 1, "no-trailing-spaces": 1,
"no-control-regex": 0, "no-control-regex": 0,
"no-useless-constructor": 0, "no-useless-constructor": 0,
"node/no-deprecated-api": 0 "node/no-deprecated-api": 0
} }
} }
+12 -12
View File
@@ -1,16 +1,16 @@
import { generateSidebar } from 'vitepress-sidebar' import { generateSidebar } from 'vitepress-sidebar'
export default { export default {
title: 'Vutron', title: 'Vutron',
description: 'Quick Start Templates for Vite + Vue 3 + Electron', description: 'Quick Start Templates for Vite + Vue 3 + Electron',
themeConfig: { themeConfig: {
sidebar: generateSidebar({ sidebar: generateSidebar({
root: 'docs', root: 'docs',
collapsible: false, collapsible: false,
collapsed: false, collapsed: false,
underscoreToSpace: true, underscoreToSpace: true,
hyphenToSpace: true hyphenToSpace: true
}), }),
socialLinks: [{ icon: 'github', link: 'https://github.com/jooy2/vutron' }] socialLinks: [{ icon: 'github', link: 'https://github.com/jooy2/vutron' }]
} }
} }
+21 -21
View File
@@ -21,9 +21,9 @@ For projects that use the **Native Node Module**, add the following script to yo
```json ```json
{ {
"scripts": { "scripts": {
"postinstall": "electron-builder install-app-deps" "postinstall": "electron-builder install-app-deps"
} }
} }
``` ```
@@ -49,23 +49,23 @@ Below is an unnecessary `node_modules` file pattern that can further save bundle
```json ```json
[ [
"!**/.*", "!**/.*",
"!**/node_modules/**/{CONTRIBUTORS,CNAME,AUTHOR,TODO,CONTRIBUTING,COPYING,INSTALL,NEWS,PORTING,Makefile,htdocs,CHANGELOG,ChangeLog,changelog,README,Readme,readme,test,sample,example,demo,composer.json,tsconfig.json,jsdoc.json,tslint.json,typings.json,gulpfile,bower.json,package-lock,Gruntfile,CMakeLists,karma.conf,yarn.lock}*", "!**/node_modules/**/{CONTRIBUTORS,CNAME,AUTHOR,TODO,CONTRIBUTING,COPYING,INSTALL,NEWS,PORTING,Makefile,htdocs,CHANGELOG,ChangeLog,changelog,README,Readme,readme,test,sample,example,demo,composer.json,tsconfig.json,jsdoc.json,tslint.json,typings.json,gulpfile,bower.json,package-lock,Gruntfile,CMakeLists,karma.conf,yarn.lock}*",
"!**/node_modules/**/{man,benchmark,node_modules,spec,cmake,browser,vagrant,doxy*,bin,obj,obj.target,example,examples,test,tests,doc,docs,msvc,Xcode,CVS,RCS,SCCS}{,/**/*}", "!**/node_modules/**/{man,benchmark,node_modules,spec,cmake,browser,vagrant,doxy*,bin,obj,obj.target,example,examples,test,tests,doc,docs,msvc,Xcode,CVS,RCS,SCCS}{,/**/*}",
"!**/node_modules/**/*.{conf,png,pc,coffee,txt,spec.js,ts,js.flow,html,def,jst,xml,ico,in,ac,sln,dsp,dsw,cmd,vcproj,vcxproj,vcxproj.filters,pdb,exp,obj,lib,map,md,sh,gypi,gyp,h,cpp,yml,log,tlog,Makefile,mk,c,cc,rc,xcodeproj,xcconfig,d.ts,yaml,hpp}", "!**/node_modules/**/*.{conf,png,pc,coffee,txt,spec.js,ts,js.flow,html,def,jst,xml,ico,in,ac,sln,dsp,dsw,cmd,vcproj,vcxproj,vcxproj.filters,pdb,exp,obj,lib,map,md,sh,gypi,gyp,h,cpp,yml,log,tlog,Makefile,mk,c,cc,rc,xcodeproj,xcconfig,d.ts,yaml,hpp}",
"!**/node_modules/**/node-v*-x64{,/**/*}", "!**/node_modules/**/node-v*-x64{,/**/*}",
"!**/node_modules/bluebird/js/browser{,/**/*}", "!**/node_modules/bluebird/js/browser{,/**/*}",
"!**/node_modules/bluebird/js/browser{,/**/*}", "!**/node_modules/bluebird/js/browser{,/**/*}",
"!**/node_modules/source-map/dist{,/**/*}", "!**/node_modules/source-map/dist{,/**/*}",
"!**/node_modules/lodash/fp{,/**/*}", "!**/node_modules/lodash/fp{,/**/*}",
"!**/node_modules/async/!(dist|package.json)", "!**/node_modules/async/!(dist|package.json)",
"!**/node_modules/async/internal{,/**/*}", "!**/node_modules/async/internal{,/**/*}",
"!**/node_modules/ajv/dist{,/**/*}", "!**/node_modules/ajv/dist{,/**/*}",
"!**/node_modules/ajv/scripts{,/**/*}", "!**/node_modules/ajv/scripts{,/**/*}",
"!**/node_modules/node-pre-gyp/!(lib|package.json)", "!**/node_modules/node-pre-gyp/!(lib|package.json)",
"!**/node_modules/node-pre-gyp/lib/!(util|pre-binding.js|node-pre-gyp.js)", "!**/node_modules/node-pre-gyp/lib/!(util|pre-binding.js|node-pre-gyp.js)",
"!**/node_modules/node-pre-gyp/lib/util/!(versioning.js|abi_crosswalk.json)", "!**/node_modules/node-pre-gyp/lib/util/!(versioning.js|abi_crosswalk.json)",
"!**/node_modules/source-map-support/browser-source-map-support.js", "!**/node_modules/source-map-support/browser-source-map-support.js",
"!**/node_modules/json-schema/!(package.json|lib)" "!**/node_modules/json-schema/!(package.json|lib)"
] ]
``` ```
+94 -94
View File
@@ -1,98 +1,98 @@
{ {
productName: 'Vutron', productName: 'Vutron',
appId: 'com.vutron.vutron', appId: 'com.vutron.vutron',
asar: true, asar: true,
extends: null, extends: null,
compression: 'maximum', compression: 'maximum',
copyright: 'ⓒ 2022 ${author}', copyright: 'ⓒ 2022 ${author}',
artifactName: '${productName} ${version}_${arch}.${ext}', artifactName: '${productName} ${version}_${arch}.${ext}',
directories: { directories: {
buildResources: 'buildRes', buildResources: 'buildRes',
output: './dist/release/${version}' output: './dist/release/${version}'
}, },
/* A list of files not to be included in the build. */ /* A list of files not to be included in the build. */
files: [ files: [
/* /*
(Required) The files and folders listed below should not be included in the build. (Required) The files and folders listed below should not be included in the build.
*/ */
'dist/**/*', 'dist/**/*',
'!docs/**/*', '!docs/**/*',
'!dist/release/**/*', '!dist/release/**/*',
'!dist/main/index.ts' '!dist/main/index.ts'
], ],
mac: { mac: {
bundleVersion: '1.0', bundleVersion: '1.0',
hardenedRuntime: true, hardenedRuntime: true,
gatekeeperAssess: false, gatekeeperAssess: false,
icon: 'buildRes/icons/icon.icns', icon: 'buildRes/icons/icon.icns',
type: 'distribution', type: 'distribution',
target: [ target: [
{ {
target: 'dmg', target: 'dmg',
arch: ['x64', 'arm64', 'universal'] arch: ['x64', 'arm64', 'universal']
} }
] ]
}, },
dmg: { dmg: {
contents: [ contents: [
{ {
x: 410, x: 410,
y: 150, y: 150,
type: 'link', type: 'link',
path: '/Applications' path: '/Applications'
}, },
{ {
x: 130, x: 130,
y: 150, y: 150,
type: 'file' type: 'file'
} }
], ],
sign: false sign: false
}, },
win: { win: {
icon: 'buildRes/icons/icon.ico', icon: 'buildRes/icons/icon.ico',
target: [ target: [
{ {
target: 'appx', target: 'appx',
arch: 'x64' arch: 'x64'
}, },
{ {
target: 'zip', target: 'zip',
arch: 'x64' arch: 'x64'
}, },
{ {
target: 'portable', target: 'portable',
arch: 'x64' arch: 'x64'
}, },
{ {
target: 'nsis', target: 'nsis',
arch: 'x64' arch: 'x64'
} }
] ]
}, },
portable: { portable: {
artifactName: '${productName} ${version}_${arch} Portable.${ext}' artifactName: '${productName} ${version}_${arch} Portable.${ext}'
}, },
nsis: { nsis: {
oneClick: true oneClick: true
}, },
linux: { linux: {
executableName: 'vutron', executableName: 'vutron',
icon: 'buildRes/icons', icon: 'buildRes/icons',
category: 'Utility', category: 'Utility',
target: [ target: [
{ {
target: 'snap', target: 'snap',
arch: 'x64' arch: 'x64'
}, },
{ {
target: 'deb', target: 'deb',
arch: 'x64' arch: 'x64'
}, },
{ {
target: 'rpm', target: 'rpm',
arch: 'x64' arch: 'x64'
} }
] ]
} }
} }
+59 -59
View File
@@ -1,61 +1,61 @@
{ {
"name": "vutron", "name": "vutron",
"version": "1.0.0", "version": "1.0.0",
"description": "Quick Start Templates for Vite + Vue 3 + Electron", "description": "Quick Start Templates for Vite + Vue 3 + Electron",
"homepage": "https://github.com/jooy2/vutron", "homepage": "https://github.com/jooy2/vutron",
"author": "jooy2 <jootc.help@gmail.com>", "author": "jooy2 <jootc.help@gmail.com>",
"license": "MIT", "license": "MIT",
"main": "dist/main/index.js", "main": "dist/main/index.js",
"scripts": { "scripts": {
"dev": "cross-env NODE_ENV=development vite", "dev": "cross-env NODE_ENV=development vite",
"build": "npm run build:pre && electron-builder -wml", "build": "npm run build:pre && electron-builder -wml",
"build:pre": "npm run format:fix && vue-tsc --noEmit && cross-env NODE_ENV=production vite build", "build:pre": "npm run format:fix && vue-tsc --noEmit && cross-env NODE_ENV=production vite build",
"build:dir": "npm run build:pre && electron-builder --dir", "build:dir": "npm run build:pre && electron-builder --dir",
"build:mac": "npm run build:pre && CSC_IDENTITY_AUTO_DISCOVERY=false electron-builder --mac", "build:mac": "npm run build:pre && CSC_IDENTITY_AUTO_DISCOVERY=false electron-builder --mac",
"build:linux": "npm run build:pre && electron-builder --linux", "build:linux": "npm run build:pre && electron-builder --linux",
"build:win": "npm run build:pre && electron-builder --windows", "build:win": "npm run build:pre && electron-builder --windows",
"lint": "eslint --ext .js,.ts,.vue -f ./node_modules/eslint-friendly-formatter src", "lint": "eslint --ext .js,.ts,.vue -f ./node_modules/eslint-friendly-formatter src",
"lint:fix": "eslint --ext .js,.ts,.vue -f ./node_modules/eslint-friendly-formatter --fix src", "lint:fix": "eslint --ext .js,.ts,.vue -f ./node_modules/eslint-friendly-formatter --fix src",
"format": "prettier .", "format": "prettier .",
"format:fix": "prettier . --write", "format:fix": "prettier . --write",
"docs:install": "npm i --no-save vitepress vitepress-sidebar", "docs:install": "npm i --no-save vitepress vitepress-sidebar",
"docs:dev": "vitepress dev docs", "docs:dev": "vitepress dev docs",
"docs:build": "npm run format:fix && vitepress build docs", "docs:build": "npm run format:fix && vitepress build docs",
"docs:serve": "npm run docs:build && vitepress serve docs" "docs:serve": "npm run docs:build && vitepress serve docs"
}, },
"engines": { "engines": {
"node": ">=16.0.0" "node": ">=16.0.0"
}, },
"dependencies": { "dependencies": {
"@electron/remote": "^2.0.8", "@electron/remote": "^2.0.8",
"pinia": "^2.0.22", "pinia": "^2.0.22",
"vue": "^3.2.39", "vue": "^3.2.39",
"vue-i18n": "^9.2.2", "vue-i18n": "^9.2.2",
"vue-router": "^4.1.5", "vue-router": "^4.1.5",
"vuetify": "^3.0.0-beta.13" "vuetify": "^3.0.0-beta.13"
}, },
"devDependencies": { "devDependencies": {
"@typescript-eslint/eslint-plugin": "^5.40.1", "@typescript-eslint/eslint-plugin": "^5.40.1",
"@typescript-eslint/parser": "^5.40.1", "@typescript-eslint/parser": "^5.40.1",
"@vitejs/plugin-vue": "^3.1.2", "@vitejs/plugin-vue": "^3.1.2",
"@vitejs/plugin-vue-jsx": "^2.0.1", "@vitejs/plugin-vue-jsx": "^2.0.1",
"cross-env": "^7.0.3", "cross-env": "^7.0.3",
"electron": "^21.2.0", "electron": "^21.2.0",
"electron-builder": "^23.3.3", "electron-builder": "^23.3.3",
"eslint": "^8.26.0", "eslint": "^8.26.0",
"eslint-config-prettier": "^8.5.0", "eslint-config-prettier": "^8.5.0",
"eslint-config-standard": "^17.0.0", "eslint-config-standard": "^17.0.0",
"eslint-friendly-formatter": "^4.0.1", "eslint-friendly-formatter": "^4.0.1",
"eslint-plugin-import": "^2.26.0", "eslint-plugin-import": "^2.26.0",
"eslint-plugin-n": "^15.3.0", "eslint-plugin-n": "^15.3.0",
"eslint-plugin-promise": "^6.1.1", "eslint-plugin-promise": "^6.1.1",
"eslint-plugin-vue": "^9.5.1", "eslint-plugin-vue": "^9.5.1",
"prettier": "^2.7.1", "prettier": "^2.7.1",
"typescript": "^4.8.4", "typescript": "^4.8.4",
"vite": "^3.1.4", "vite": "^3.1.4",
"vite-plugin-electron": "^0.9.3", "vite-plugin-electron": "^0.9.3",
"vite-plugin-eslint": "^1.8.1", "vite-plugin-eslint": "^1.8.1",
"vue-eslint-parser": "^9.1.0", "vue-eslint-parser": "^9.1.0",
"vue-tsc": "^1.0.9" "vue-tsc": "^1.0.9"
} }
} }
+18 -18
View File
@@ -1,20 +1,20 @@
module.exports = { module.exports = {
printWidth: 100, printWidth: 100,
tabWidth: 2, tabWidth: 2,
useTabs: false, useTabs: true,
semi: false, semi: false,
vueIndentScriptAndStyle: false, vueIndentScriptAndStyle: false,
singleQuote: true, singleQuote: true,
quoteProps: 'as-needed', quoteProps: 'as-needed',
trailingComma: 'none', trailingComma: 'none',
bracketSpacing: true, bracketSpacing: true,
bracketSameLine: false, bracketSameLine: false,
jsxBracketSameLine: false, jsxBracketSameLine: false,
jsxSingleQuote: false, jsxSingleQuote: false,
arrowParens: 'always', arrowParens: 'always',
insertPragma: false, insertPragma: false,
requirePragma: false, requirePragma: false,
proseWrap: 'never', proseWrap: 'never',
htmlWhitespaceSensitivity: 'strict', htmlWhitespaceSensitivity: 'strict',
endOfLine: 'lf' endOfLine: 'lf'
} }
+67 -67
View File
@@ -3,91 +3,91 @@ import Constants from './utils/Constants'
import * as electronRemote from '@electron/remote/main' import * as electronRemote from '@electron/remote/main'
const exitApp = (mainWindow: BrowserWindow): void => { const exitApp = (mainWindow: BrowserWindow): void => {
if (mainWindow && !mainWindow.isDestroyed()) { if (mainWindow && !mainWindow.isDestroyed()) {
mainWindow.hide() mainWindow.hide()
} }
mainWindow.destroy() mainWindow.destroy()
app.exit() app.exit()
} }
export const createMainWindow = async (mainWindow: BrowserWindow): Promise<BrowserWindow> => { export const createMainWindow = async (mainWindow: BrowserWindow): Promise<BrowserWindow> => {
mainWindow = new BrowserWindow({ mainWindow = new BrowserWindow({
title: Constants.APP_NAME, title: Constants.APP_NAME,
show: false, show: false,
width: Constants.IS_DEV_ENV ? 1500 : 1200, width: Constants.IS_DEV_ENV ? 1500 : 1200,
height: 650, height: 650,
useContentSize: true, useContentSize: true,
webPreferences: Constants.DEFAULT_WEB_PREFERENCES webPreferences: Constants.DEFAULT_WEB_PREFERENCES
}) })
mainWindow.setMenu(null) mainWindow.setMenu(null)
mainWindow.on('close', (event: Event) => { mainWindow.on('close', (event: Event) => {
event.preventDefault() event.preventDefault()
exitApp(mainWindow) exitApp(mainWindow)
}) })
mainWindow.webContents.on('did-frame-finish-load', () => { mainWindow.webContents.on('did-frame-finish-load', () => {
if (Constants.IS_DEV_ENV) { if (Constants.IS_DEV_ENV) {
mainWindow.webContents.openDevTools() mainWindow.webContents.openDevTools()
} }
}) })
mainWindow.once('ready-to-show', () => { mainWindow.once('ready-to-show', () => {
mainWindow.setAlwaysOnTop(true) mainWindow.setAlwaysOnTop(true)
mainWindow.show() mainWindow.show()
mainWindow.focus() mainWindow.focus()
mainWindow.setAlwaysOnTop(false) mainWindow.setAlwaysOnTop(false)
electronRemote.initialize() electronRemote.initialize()
}) })
if (Constants.IS_DEV_ENV) { if (Constants.IS_DEV_ENV) {
await mainWindow.loadURL(Constants.APP_INDEX_URL_DEV) await mainWindow.loadURL(Constants.APP_INDEX_URL_DEV)
} else { } else {
await mainWindow.loadFile(Constants.APP_INDEX_URL_PROD) await mainWindow.loadFile(Constants.APP_INDEX_URL_PROD)
} }
return mainWindow return mainWindow
} }
export const createErrorWindow = async ( export const createErrorWindow = async (
errorWindow: BrowserWindow, errorWindow: BrowserWindow,
mainWindow: BrowserWindow, mainWindow: BrowserWindow,
details?: RenderProcessGoneDetails details?: RenderProcessGoneDetails
): Promise<BrowserWindow> => { ): Promise<BrowserWindow> => {
if (!Constants.IS_DEV_ENV) { if (!Constants.IS_DEV_ENV) {
mainWindow?.hide() mainWindow?.hide()
} }
errorWindow = new BrowserWindow({ errorWindow = new BrowserWindow({
title: Constants.APP_NAME, title: Constants.APP_NAME,
show: false, show: false,
resizable: Constants.IS_DEV_ENV, resizable: Constants.IS_DEV_ENV,
webPreferences: Constants.DEFAULT_WEB_PREFERENCES webPreferences: Constants.DEFAULT_WEB_PREFERENCES
}) })
errorWindow.setMenu(null) errorWindow.setMenu(null)
if (Constants.IS_DEV_ENV) { if (Constants.IS_DEV_ENV) {
await errorWindow.loadURL(`${Constants.APP_INDEX_URL_DEV}#/error`) await errorWindow.loadURL(`${Constants.APP_INDEX_URL_DEV}#/error`)
} else { } else {
await errorWindow.loadFile(Constants.APP_INDEX_URL_PROD, { hash: 'error' }) await errorWindow.loadFile(Constants.APP_INDEX_URL_PROD, { hash: 'error' })
} }
errorWindow.on('ready-to-show', () => { errorWindow.on('ready-to-show', () => {
if (!Constants.IS_DEV_ENV && mainWindow && !mainWindow.isDestroyed()) { if (!Constants.IS_DEV_ENV && mainWindow && !mainWindow.isDestroyed()) {
mainWindow.destroy() mainWindow.destroy()
} }
errorWindow.show() errorWindow.show()
errorWindow.focus() errorWindow.focus()
}) })
errorWindow.webContents.on('did-frame-finish-load', () => { errorWindow.webContents.on('did-frame-finish-load', () => {
if (Constants.IS_DEV_ENV) { if (Constants.IS_DEV_ENV) {
errorWindow.webContents.openDevTools() errorWindow.webContents.openDevTools()
} }
}) })
return errorWindow return errorWindow
} }
+15 -15
View File
@@ -7,33 +7,33 @@ let mainWindow
let errorWindow let errorWindow
app.on('ready', () => { app.on('ready', () => {
macOSDisableDefaultMenuItem() macOSDisableDefaultMenuItem()
mainWindow = createMainWindow(mainWindow) mainWindow = createMainWindow(mainWindow)
}) })
app.on('activate', () => { app.on('activate', () => {
if (!mainWindow) { if (!mainWindow) {
mainWindow = createMainWindow(mainWindow) mainWindow = createMainWindow(mainWindow)
} }
}) })
app.on('window-all-closed', () => { app.on('window-all-closed', () => {
mainWindow = null mainWindow = null
errorWindow = null errorWindow = null
if (!Constants.IS_MAC) { if (!Constants.IS_MAC) {
app.quit() app.quit()
} }
}) })
app.on( app.on(
'render-process-gone', 'render-process-gone',
(event: Event, webContents: WebContents, details: RenderProcessGoneDetails) => { (event: Event, webContents: WebContents, details: RenderProcessGoneDetails) => {
errorWindow = createErrorWindow(errorWindow, mainWindow, details) errorWindow = createErrorWindow(errorWindow, mainWindow, details)
} }
) )
process.on('uncaughtException', () => { process.on('uncaughtException', () => {
errorWindow = createErrorWindow(errorWindow, mainWindow) errorWindow = createErrorWindow(errorWindow, mainWindow)
}) })
+11 -11
View File
@@ -1,19 +1,19 @@
import { join } from 'path' import { join } from 'path'
export default class Constants { export default class Constants {
static APP_NAME = 'Vutron' static APP_NAME = 'Vutron'
static IS_DEV_ENV = process.env.NODE_ENV === 'development' static IS_DEV_ENV = process.env.NODE_ENV === 'development'
static IS_MAC = process.platform === 'darwin' static IS_MAC = process.platform === 'darwin'
static DEFAULT_WEB_PREFERENCES = { static DEFAULT_WEB_PREFERENCES = {
nodeIntegration: true, nodeIntegration: true,
contextIsolation: false, contextIsolation: false,
nodeIntegrationInWorker: true, nodeIntegrationInWorker: true,
enableRemoteModule: true enableRemoteModule: true
} }
static APP_INDEX_URL_DEV = 'http://localhost:5173/index.html' static APP_INDEX_URL_DEV = 'http://localhost:5173/index.html'
static APP_INDEX_URL_PROD = join(__dirname, '../index.html') static APP_INDEX_URL_PROD = join(__dirname, '../index.html')
} }
+6 -6
View File
@@ -2,12 +2,12 @@ import { systemPreferences } from 'electron'
import Constants from './Constants' import Constants from './Constants'
export default class Menus { export default class Menus {
static macOSDisableDefaultMenuItem(): void { static macOSDisableDefaultMenuItem(): void {
if (Constants.IS_MAC) { if (Constants.IS_MAC) {
systemPreferences.setUserDefault('NSDisabledDictationMenuItem', 'boolean', true) systemPreferences.setUserDefault('NSDisabledDictationMenuItem', 'boolean', true)
systemPreferences.setUserDefault('NSDisabledCharacterPaletteMenuItem', 'boolean', true) systemPreferences.setUserDefault('NSDisabledCharacterPaletteMenuItem', 'boolean', true)
} }
} }
} }
export const { macOSDisableDefaultMenuItem } = Menus export const { macOSDisableDefaultMenuItem } = Menus
+7 -7
View File
@@ -3,22 +3,22 @@ import { DefaultLayout } from '@/renderer/components/layout'
</script> </script>
<template> <template>
<DefaultLayout> <DefaultLayout>
<router-view /> <router-view />
</DefaultLayout> </DefaultLayout>
</template> </template>
<style> <style>
html { html {
overflow-y: auto !important; overflow-y: auto !important;
} }
html, html,
body { body {
width: 100%; width: 100%;
height: 100%; height: 100%;
} }
/* Do not force capitalization of button text */ /* Do not force capitalization of button text */
.v-btn { .v-btn {
text-transform: unset !important; text-transform: unset !important;
} }
</style> </style>
@@ -3,12 +3,12 @@ import HeaderLayout from '@/renderer/components/layout/HeaderLayout.vue'
</script> </script>
<template> <template>
<v-app> <v-app>
<v-layout> <v-layout>
<HeaderLayout /> <HeaderLayout />
<v-main> <v-main>
<slot /> <slot />
</v-main> </v-main>
</v-layout> </v-layout>
</v-app> </v-app>
</template> </template>
@@ -1,5 +1,5 @@
<template> <template>
<v-app-bar color="primary" density="compact"> <v-app-bar color="primary" density="compact">
<v-app-bar-title>{{ $route.meta.title }}</v-app-bar-title> <v-app-bar-title>{{ $route.meta.title }}</v-app-bar-title>
</v-app-bar> </v-app-bar>
</template> </template>
+7 -7
View File
@@ -1,10 +1,10 @@
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head> <head>
<meta charset="utf-8" /> <meta charset="utf-8" />
</head> </head>
<body> <body>
<div id="app"></div> <div id="app"></div>
</body> </body>
<script type="module" src="./main.ts"></script> <script type="module" src="./main.ts"></script>
</html> </html>
+8 -8
View File
@@ -1,10 +1,10 @@
{ {
"desc": { "desc": {
"welcome": "Thank you for using Vutron. This cool template makes it easy to create a variety of cross-platform applications." "welcome": "Thank you for using Vutron. This cool template makes it easy to create a variety of cross-platform applications."
}, },
"menu": { "menu": {
"change-theme": "Change Theme", "change-theme": "Change Theme",
"change-language": "Change Language", "change-language": "Change Language",
"about": "About Vutron" "about": "About Vutron"
} }
} }
+8 -8
View File
@@ -1,10 +1,10 @@
{ {
"desc": { "desc": {
"welcome": "Vutron을 이용해주셔서 감사드립니다. 이 멋진 템플릿을 활용하면 다양한 크로스플랫폼 애플리케이션을 손쉽게 제작할 수 있습니다." "welcome": "Vutron을 이용해주셔서 감사드립니다. 이 멋진 템플릿을 활용하면 다양한 크로스플랫폼 애플리케이션을 손쉽게 제작할 수 있습니다."
}, },
"menu": { "menu": {
"change-theme": "테마 변경", "change-theme": "테마 변경",
"change-language": "언어 변경", "change-language": "언어 변경",
"about": "Vutron 정보" "about": "Vutron 정보"
} }
} }
+8 -8
View File
@@ -4,12 +4,12 @@ import ko from '@/renderer/locales/ko.json'
import { getCurrentLocale } from '@/renderer/utils' import { getCurrentLocale } from '@/renderer/utils'
export default createI18n({ export default createI18n({
legacy: false, legacy: false,
locale: getCurrentLocale(), locale: getCurrentLocale(),
fallbackLocale: 'en', fallbackLocale: 'en',
globalInjection: true, globalInjection: true,
messages: { messages: {
en, en,
ko ko
} }
}) })
+28 -28
View File
@@ -5,32 +5,32 @@ import { aliases, mdi } from 'vuetify/iconsets/mdi'
import colors from 'vuetify/lib/util/colors.mjs' import colors from 'vuetify/lib/util/colors.mjs'
export default createVuetify({ export default createVuetify({
locale: { locale: {
messages: { ko, en }, messages: { ko, en },
defaultLocale: 'en', defaultLocale: 'en',
fallbackLocale: 'en' fallbackLocale: 'en'
}, },
icons: { icons: {
defaultSet: 'mdi', defaultSet: 'mdi',
aliases, aliases,
sets: { sets: {
mdi mdi
} }
}, },
theme: { theme: {
themes: { themes: {
light: { light: {
dark: false, dark: false,
colors: { colors: {
primary: colors.green.darken2 primary: colors.green.darken2
} }
}, },
dark: { dark: {
dark: true, dark: true,
colors: { colors: {
primary: colors.green.darken4 primary: colors.green.darken4
} }
} }
} }
} }
}) })
+21 -21
View File
@@ -2,25 +2,25 @@ import { createRouter, createWebHashHistory } from 'vue-router/dist/vue-router.e
import { MainScreen, ErrorScreen } from '@/renderer/screens' import { MainScreen, ErrorScreen } from '@/renderer/screens'
export default createRouter({ export default createRouter({
history: createWebHashHistory(), history: createWebHashHistory(),
routes: [ routes: [
{ {
path: '/', path: '/',
component: MainScreen, component: MainScreen,
meta: { meta: {
title: 'Main' title: 'Main'
} }
}, },
{ {
path: '/error', path: '/error',
component: ErrorScreen, component: ErrorScreen,
meta: { meta: {
title: 'Unknown error occurred' title: 'Unknown error occurred'
} }
}, },
{ {
path: '/:pathMatch(.*)*', path: '/:pathMatch(.*)*',
redirect: '/' redirect: '/'
} }
] ]
}) })
+1 -1
View File
@@ -1,5 +1,5 @@
<script setup lang="tsx"></script> <script setup lang="tsx"></script>
<template> <template>
<div>Unknown error occurred</div> <div>Unknown error occurred</div>
</template> </template>
+37 -37
View File
@@ -11,54 +11,54 @@ const { counterIncrease } = useTempStore()
const { counter } = storeToRefs(useTempStore()) const { counter } = storeToRefs(useTempStore())
const handleChangeTheme = (): void => { const handleChangeTheme = (): void => {
theme.global.name.value = theme.global.current.value.dark ? 'light' : 'dark' theme.global.name.value = theme.global.current.value.dark ? 'light' : 'dark'
} }
const handleChangeLanguage = (): void => { const handleChangeLanguage = (): void => {
if (locale.value === 'en') { if (locale.value === 'en') {
locale.value = 'ko' locale.value = 'ko'
} else { } else {
locale.value = 'en' locale.value = 'en'
} }
} }
const handleAbout = async (): Promise<void> => { const handleAbout = async (): Promise<void> => {
await openExternal('https://github.com/jooy2/vutron') await openExternal('https://github.com/jooy2/vutron')
} }
const handleCountIncrease = (): void => { const handleCountIncrease = (): void => {
counterIncrease(1) counterIncrease(1)
} }
</script> </script>
<template> <template>
<v-container> <v-container>
<v-row align="center" class="text-center"> <v-row align="center" class="text-center">
<v-col cols="12"> <v-col cols="12">
<img alt="logo" class="ma-auto h-auto w-75" src="/images/vutron-logo.webp" /> <img alt="logo" class="ma-auto h-auto w-75" src="/images/vutron-logo.webp" />
</v-col> </v-col>
<v-col cols="12"> <v-col cols="12">
{{ $t('desc.welcome') }} {{ $t('desc.welcome') }}
</v-col> </v-col>
<v-col cols="12"> Counter: {{ counter }} </v-col> <v-col cols="12"> Counter: {{ counter }} </v-col>
<v-col cols="3"> <v-col cols="3">
<v-btn block color="primary" @click="handleChangeTheme"> <v-btn block color="primary" @click="handleChangeTheme">
{{ $t('menu.change-theme') }} {{ $t('menu.change-theme') }}
</v-btn> </v-btn>
</v-col> </v-col>
<v-col cols="3"> <v-col cols="3">
<v-btn block color="primary" @click="handleChangeLanguage"> <v-btn block color="primary" @click="handleChangeLanguage">
{{ $t('menu.change-language') }} {{ $t('menu.change-language') }}
</v-btn> </v-btn>
</v-col> </v-col>
<v-col cols="3"> <v-col cols="3">
<v-btn block color="primary" @click="handleAbout"> <v-btn block color="primary" @click="handleAbout">
{{ $t('menu.about') }} {{ $t('menu.about') }}
</v-btn> </v-btn>
</v-col> </v-col>
<v-col cols="3"> <v-col cols="3">
<v-btn block color="primary" @click="handleCountIncrease">Count + 1</v-btn> <v-btn block color="primary" @click="handleCountIncrease">Count + 1</v-btn>
</v-col> </v-col>
</v-row> </v-row>
</v-container> </v-container>
</template> </template>
+11 -11
View File
@@ -1,15 +1,15 @@
import { defineStore } from 'pinia' import { defineStore } from 'pinia'
export const useTempStore = defineStore('temp', { export const useTempStore = defineStore('temp', {
state: () => ({ state: () => ({
counter: 0 counter: 0
}), }),
getters: { getters: {
getCounter: (state): number => state.counter getCounter: (state): number => state.counter
}, },
actions: { actions: {
counterIncrease(amount: number) { counterIncrease(amount: number) {
this.counter += amount this.counter += amount
} }
} }
}) })
+6 -6
View File
@@ -1,13 +1,13 @@
import { shell } from 'electron' import { shell } from 'electron'
export default class Utils { export default class Utils {
static getCurrentLocale(): string { static getCurrentLocale(): string {
return navigator?.language?.split('-')[0] || 'en' return navigator?.language?.split('-')[0] || 'en'
} }
static async openExternal(url: string): Promise<void> { static async openExternal(url: string): Promise<void> {
await shell.openExternal(url) await shell.openExternal(url)
} }
} }
export const { getCurrentLocale, openExternal } = Utils export const { getCurrentLocale, openExternal } = Utils
+26 -26
View File
@@ -1,28 +1,28 @@
{ {
"compilerOptions": { "compilerOptions": {
"baseUrl": "./", "baseUrl": "./",
"outDir": "./dist", "outDir": "./dist",
"target": "esnext", "target": "esnext",
"module": "esnext", "module": "esnext",
"moduleResolution": "node", "moduleResolution": "node",
"jsx": "preserve", "jsx": "preserve",
"noImplicitAny": false, "noImplicitAny": false,
"allowSyntheticDefaultImports": true, "allowSyntheticDefaultImports": true,
"declaration": true, "declaration": true,
"resolveJsonModule": true, "resolveJsonModule": true,
"esModuleInterop": true, "esModuleInterop": true,
"sourceMap": true, "sourceMap": true,
"strict": true, "strict": true,
"skipLibCheck": true, "skipLibCheck": true,
"paths": { "paths": {
"@/*": ["./src/*"] "@/*": ["./src/*"]
}, },
"lib": ["esnext", "dom"] "lib": ["esnext", "dom"]
}, },
"include": ["src/**/*/*.ts", "src/**/*/*.d.ts", "src/**/*/*.tsx", "src/**/*/*.vue"], "include": ["src/**/*/*.ts", "src/**/*/*.d.ts", "src/**/*/*.tsx", "src/**/*/*.vue"],
"references": [ "references": [
{ {
"path": "./tsconfig.node.json" "path": "./tsconfig.node.json"
} }
] ]
} }
+10 -10
View File
@@ -1,12 +1,12 @@
{ {
"compilerOptions": { "compilerOptions": {
"target": "esnext", "target": "esnext",
"module": "esnext", "module": "esnext",
"jsx": "preserve", "jsx": "preserve",
"moduleResolution": "node", "moduleResolution": "node",
"composite": true, "composite": true,
"resolveJsonModule": true, "resolveJsonModule": true,
"allowSyntheticDefaultImports": true "allowSyntheticDefaultImports": true
}, },
"include": ["package.json", "electron"] "include": ["package.json"]
} }
+39 -39
View File
@@ -8,43 +8,43 @@ import { resolve, dirname } from 'path'
import { builtinModules } from 'module' import { builtinModules } from 'module'
export default defineConfig({ export default defineConfig({
define: { define: {
__VUE_I18N_FULL_INSTALL__: true, __VUE_I18N_FULL_INSTALL__: true,
__VUE_I18N_LEGACY_API__: false, __VUE_I18N_LEGACY_API__: false,
__INTLIFY_PROD_DEVTOOLS__: false __INTLIFY_PROD_DEVTOOLS__: false
}, },
resolve: { resolve: {
extensions: ['.mjs', '.js', '.ts', '.vue', '.json', '.scss'], extensions: ['.mjs', '.js', '.ts', '.vue', '.json', '.scss'],
alias: { alias: {
'@': resolve(dirname(fileURLToPath(import.meta.url)), 'src') '@': resolve(dirname(fileURLToPath(import.meta.url)), 'src')
} }
}, },
base: './', base: './',
root: resolve('./src/renderer'), root: resolve('./src/renderer'),
publicDir: resolve('./src/renderer/public'), publicDir: resolve('./src/renderer/public'),
build: { build: {
outDir: resolve('./dist') outDir: resolve('./dist')
}, },
plugins: [ plugins: [
vue(), vue(),
vueJsx(), vueJsx(),
eslintPlugin(), eslintPlugin(),
electronPlugin({ electronPlugin({
main: { main: {
entry: 'src/main/index.ts', entry: 'src/main/index.ts',
vite: { vite: {
publicDir: resolve('./src/main'), publicDir: resolve('./src/main'),
build: { build: {
emptyOutDir: true, emptyOutDir: true,
assetsDir: '.', assetsDir: '.',
outDir: 'dist/main', outDir: 'dist/main',
rollupOptions: { rollupOptions: {
external: ['electron', ...builtinModules] external: ['electron', ...builtinModules]
} }
} }
} }
}, },
renderer: {} renderer: {}
}) })
] ]
}) })