build: electron-webpack replacement (#130)
* some changes * improvements and dedicated webpeck configs for render and main * added debugging setup * vscode main process debug config * vue3 devtools
|
@ -46,6 +46,7 @@
|
||||||
"no-undef": "off",
|
"no-undef": "off",
|
||||||
"vue/no-side-effects-in-computed-properties": "off",
|
"vue/no-side-effects-in-computed-properties": "off",
|
||||||
"vue/require-default-prop": "off",
|
"vue/require-default-prop": "off",
|
||||||
|
"vue/comment-directive": "off",
|
||||||
"vue/no-v-html": "off",
|
"vue/no-v-html": "off",
|
||||||
"vue/html-indent": [
|
"vue/html-indent": [
|
||||||
"error",
|
"error",
|
||||||
|
|
|
@ -1,9 +1,8 @@
|
||||||
.DS_Store
|
.DS_Store
|
||||||
dist/
|
dist
|
||||||
node_modules/
|
build
|
||||||
|
node_modules
|
||||||
thumbs.db
|
thumbs.db
|
||||||
.idea/
|
|
||||||
.vscode
|
|
||||||
NOTES.md
|
NOTES.md
|
||||||
*.txt
|
*.txt
|
||||||
package-lock.json
|
package-lock.json
|
|
@ -0,0 +1,29 @@
|
||||||
|
{
|
||||||
|
"version": "0.2.0",
|
||||||
|
"configurations": [
|
||||||
|
{
|
||||||
|
"cwd": "${workspaceFolder}",
|
||||||
|
"name": "Electron: Main",
|
||||||
|
"port": 9222,
|
||||||
|
"protocol": "inspector",
|
||||||
|
"request": "attach",
|
||||||
|
"sourceMaps": true,
|
||||||
|
"type": "node",
|
||||||
|
"timeout": 1000000
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Electron: Renderer",
|
||||||
|
"port": 9223,
|
||||||
|
"request": "attach",
|
||||||
|
"sourceMaps": true,
|
||||||
|
"type": "chrome",
|
||||||
|
"webRoot": "${workspaceFolder}"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"compounds": [
|
||||||
|
{
|
||||||
|
"name": "Electron: All",
|
||||||
|
"configurations": ["Electron: Main", "Electron: Renderer"]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
|
@ -0,0 +1,9 @@
|
||||||
|
{
|
||||||
|
"conventionalCommits.scopes": [
|
||||||
|
"UI",
|
||||||
|
"core",
|
||||||
|
"MySQL",
|
||||||
|
"PostgreSQL"
|
||||||
|
],
|
||||||
|
"svg.preview.background": "transparent"
|
||||||
|
}
|
Before Width: | Height: | Size: 54 KiB After Width: | Height: | Size: 54 KiB |
Before Width: | Height: | Size: 7.4 KiB After Width: | Height: | Size: 7.4 KiB |
Before Width: | Height: | Size: 23 KiB After Width: | Height: | Size: 23 KiB |
Before Width: | Height: | Size: 4.0 KiB After Width: | Height: | Size: 4.0 KiB |
Before Width: | Height: | Size: 42 KiB After Width: | Height: | Size: 42 KiB |
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 17 KiB |
Before Width: | Height: | Size: 50 KiB After Width: | Height: | Size: 50 KiB |
|
@ -1,5 +0,0 @@
|
||||||
{
|
|
||||||
"include": [
|
|
||||||
"./src/renderer/**/*"
|
|
||||||
]
|
|
||||||
}
|
|
47
package.json
|
@ -6,22 +6,38 @@
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"repository": "https://github.com/Fabio286/antares.git",
|
"repository": "https://github.com/Fabio286/antares.git",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "cross-env NODE_ENV=development electron-webpack dev",
|
"debug": "npm run rebuild:electron && npm run debug-runner",
|
||||||
"compile": "electron-webpack",
|
"debug-runner": "node scripts/devRunner.js --remote-debug",
|
||||||
|
"compile": "npm run compile:main && npm run compile:renderer",
|
||||||
|
"compile:main": "webpack --mode=production --config webpack.main.config.js",
|
||||||
|
"compile:renderer": "webpack --mode=production --config webpack.renderer.config.js",
|
||||||
"build": "cross-env NODE_ENV=production npm run compile",
|
"build": "cross-env NODE_ENV=production npm run compile",
|
||||||
"build:local": "npm run build && electron-builder",
|
"build:local": "npm run build && electron-builder",
|
||||||
"build:appx": "npm run build:local -- --win appx",
|
"build:appx": "npm run build:local -- --win appx",
|
||||||
|
"rebuild:electron": "npm run postinstall && electron-rebuild",
|
||||||
"release": "standard-version",
|
"release": "standard-version",
|
||||||
"release:pre": "npm run release -- --prerelease alpha",
|
"release:pre": "npm run release -- --prerelease alpha",
|
||||||
|
"postinstall": "electron-builder install-app-deps",
|
||||||
"test": "npm run lint",
|
"test": "npm run lint",
|
||||||
"lint": "eslint . --ext .js,.vue && stylelint \"./src/**/*.{css,scss,sass,vue}\"",
|
"lint": "eslint . --ext .js,.vue && stylelint \"./src/**/*.{css,scss,sass,vue}\"",
|
||||||
"lint:fix": "eslint . --ext .js,.vue --fix && stylelint \"./src/**/*.{css,scss,sass,vue}\" --fix",
|
"lint:fix": "eslint . --ext .js,.vue --fix && stylelint \"./src/**/*.{css,scss,sass,vue}\" --fix"
|
||||||
"postinstall": "electron-builder install-app-deps"
|
|
||||||
},
|
},
|
||||||
"author": "Fabio Di Stasio <fabio286@gmail.com>",
|
"author": "Fabio Di Stasio <fabio286@gmail.com>",
|
||||||
|
"main": "./dist/main.js",
|
||||||
"build": {
|
"build": {
|
||||||
"appId": "com.fabio286.antares",
|
"appId": "com.fabio286.antares",
|
||||||
"artifactName": "${productName}-${version}-${os}_${arch}.${ext}",
|
"artifactName": "${productName}-${version}-${os}_${arch}.${ext}",
|
||||||
|
"asar": true,
|
||||||
|
"directories": {
|
||||||
|
"output": "build",
|
||||||
|
"buildResources": "assets"
|
||||||
|
},
|
||||||
|
"asarUnpack": "**\\*.{node,dll}",
|
||||||
|
"files": [
|
||||||
|
"dist/**/*",
|
||||||
|
"node_modules",
|
||||||
|
"package.json"
|
||||||
|
],
|
||||||
"win": {
|
"win": {
|
||||||
"target": [
|
"target": [
|
||||||
"nsis",
|
"nsis",
|
||||||
|
@ -81,11 +97,6 @@
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"electronWebpack": {
|
|
||||||
"renderer": {
|
|
||||||
"webpackConfig": "webpack.config.js"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@electron/remote": "^2.0.1",
|
"@electron/remote": "^2.0.1",
|
||||||
"@mdi/font": "^6.1.95",
|
"@mdi/font": "^6.1.95",
|
||||||
|
@ -110,28 +121,40 @@
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@babel/eslint-parser": "^7.15.7",
|
"@babel/eslint-parser": "^7.15.7",
|
||||||
|
"@babel/preset-env": "^7.15.8",
|
||||||
"babel-loader": "^8.2.3",
|
"babel-loader": "^8.2.3",
|
||||||
|
"chalk": "^4.1.2",
|
||||||
|
"clean-webpack-plugin": "^4.0.0",
|
||||||
"cross-env": "^7.0.2",
|
"cross-env": "^7.0.2",
|
||||||
|
"css-loader": "^6.5.0",
|
||||||
"electron": "^15.3.0",
|
"electron": "^15.3.0",
|
||||||
"electron-builder": "^22.13.1",
|
"electron-builder": "^22.13.1",
|
||||||
"electron-devtools-installer": "^3.2.0",
|
"electron-devtools-installer": "^3.2.0",
|
||||||
"electron-webpack": "^2.8.2",
|
"electron-rebuild": "^3.2.3",
|
||||||
"electron-webpack-vue": "^2.4.0",
|
|
||||||
"eslint": "^7.32.0",
|
"eslint": "^7.32.0",
|
||||||
"eslint-config-standard": "^16.0.3",
|
"eslint-config-standard": "^16.0.3",
|
||||||
"eslint-plugin-import": "^2.24.2",
|
"eslint-plugin-import": "^2.24.2",
|
||||||
"eslint-plugin-node": "^11.1.0",
|
"eslint-plugin-node": "^11.1.0",
|
||||||
"eslint-plugin-promise": "^5.1.0",
|
"eslint-plugin-promise": "^5.1.0",
|
||||||
"eslint-plugin-vue": "^7.18.0",
|
"eslint-plugin-vue": "^7.18.0",
|
||||||
|
"file-loader": "^6.2.0",
|
||||||
|
"html-webpack-plugin": "^5.5.0",
|
||||||
|
"mini-css-extract-plugin": "^2.4.3",
|
||||||
|
"node-loader": "^2.0.0",
|
||||||
|
"progress-webpack-plugin": "^1.0.12",
|
||||||
"sass": "^1.42.1",
|
"sass": "^1.42.1",
|
||||||
"sass-loader": "^10.2.0",
|
"sass-loader": "^10.2.0",
|
||||||
"standard-version": "^9.3.1",
|
"standard-version": "^9.3.1",
|
||||||
|
"style-loader": "^3.3.1",
|
||||||
"stylelint": "^13.13.1",
|
"stylelint": "^13.13.1",
|
||||||
"stylelint-config-standard": "^22.0.0",
|
"stylelint-config-standard": "^22.0.0",
|
||||||
"stylelint-scss": "^3.21.0",
|
"stylelint-scss": "^3.21.0",
|
||||||
|
"tree-kill": "^1.2.2",
|
||||||
"vue": "^2.6.14",
|
"vue": "^2.6.14",
|
||||||
"vue-loader": "^15.9.8",
|
"vue-loader": "^15.9.8",
|
||||||
"vue-template-compiler": "^2.6.14",
|
"vue-template-compiler": "^2.6.14",
|
||||||
"webpack": "^4.46.0"
|
"webpack": "^5.60.0",
|
||||||
|
"webpack-cli": "^4.9.1",
|
||||||
|
"webpack-dev-server": "^3.11.2"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,130 @@
|
||||||
|
process.env.NODE_ENV = 'development';
|
||||||
|
// process.env.ELECTRON_ENABLE_LOGGING = true
|
||||||
|
|
||||||
|
const chalk = require('chalk');
|
||||||
|
const electron = require('electron');
|
||||||
|
const webpack = require('webpack');
|
||||||
|
const WebpackDevServer = require('webpack-dev-server');
|
||||||
|
const kill = require('tree-kill');
|
||||||
|
|
||||||
|
const path = require('path');
|
||||||
|
const { spawn } = require('child_process');
|
||||||
|
|
||||||
|
const mainConfig = require('../webpack.main.config');
|
||||||
|
const rendererConfig = require('../webpack.renderer.config');
|
||||||
|
// const workersConfig = require('../webpack.workers.config');
|
||||||
|
|
||||||
|
let electronProcess = null;
|
||||||
|
let manualRestart = null;
|
||||||
|
const remoteDebugging = process.argv.includes('--remote-debug');
|
||||||
|
|
||||||
|
if (remoteDebugging) {
|
||||||
|
// disable dvtools open in electron
|
||||||
|
process.env.RENDERER_REMOTE_DEBUGGING = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function killElectron (pid) {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
if (pid) {
|
||||||
|
kill(pid, 'SIGKILL', err => {
|
||||||
|
if (err) reject(err);
|
||||||
|
|
||||||
|
resolve();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else
|
||||||
|
resolve();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function restartElectron () {
|
||||||
|
console.log(chalk.gray('\nStarting electron...'));
|
||||||
|
|
||||||
|
const { pid } = electronProcess || {};
|
||||||
|
await killElectron(pid);
|
||||||
|
|
||||||
|
electronProcess = spawn(electron, [
|
||||||
|
path.join(__dirname, '../dist/main.js'),
|
||||||
|
// '--enable-logging', // Enable to show logs from all electron processes
|
||||||
|
remoteDebugging ? '--inspect=9222' : '',
|
||||||
|
remoteDebugging ? '--remote-debugging-port=9223' : ''
|
||||||
|
]);
|
||||||
|
|
||||||
|
electronProcess.stdout.on('data', data => {
|
||||||
|
console.log(chalk.white(data.toString()));
|
||||||
|
});
|
||||||
|
|
||||||
|
electronProcess.stderr.on('data', data => {
|
||||||
|
console.error(chalk.red(data.toString()));
|
||||||
|
});
|
||||||
|
|
||||||
|
electronProcess.on('exit', (code, signal) => {
|
||||||
|
if (!manualRestart) process.exit(0);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function startMain () {
|
||||||
|
const webpackSetup = webpack(mainConfig);
|
||||||
|
|
||||||
|
webpackSetup.compilers.forEach((compiler) => {
|
||||||
|
const { name } = compiler;
|
||||||
|
|
||||||
|
switch (name) {
|
||||||
|
case 'workers':
|
||||||
|
compiler.hooks.afterEmit.tap('afterEmit', async () => {
|
||||||
|
console.log(chalk.gray(`\nCompiled ${name} script!`));
|
||||||
|
console.log(
|
||||||
|
chalk.gray(`\nWatching file changes for ${name} script...`)
|
||||||
|
);
|
||||||
|
});
|
||||||
|
break;
|
||||||
|
case 'main':
|
||||||
|
default:
|
||||||
|
compiler.hooks.afterEmit.tap('afterEmit', async () => {
|
||||||
|
console.log(chalk.gray(`\nCompiled ${name} script!`));
|
||||||
|
|
||||||
|
manualRestart = true;
|
||||||
|
await restartElectron();
|
||||||
|
|
||||||
|
setTimeout(() => {
|
||||||
|
manualRestart = false;
|
||||||
|
}, 2500);
|
||||||
|
|
||||||
|
console.log(
|
||||||
|
chalk.gray(`\nWatching file changes for ${name} script...`)
|
||||||
|
);
|
||||||
|
});
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
webpackSetup.watch({ aggregateTimeout: 500 }, err => {
|
||||||
|
if (err) console.error(chalk.red(err));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function startRenderer (callback) {
|
||||||
|
const compiler = webpack(rendererConfig);
|
||||||
|
const { name } = compiler;
|
||||||
|
|
||||||
|
compiler.hooks.afterEmit.tap('afterEmit', () => {
|
||||||
|
console.log(chalk.gray(`\nCompiled ${name} script!`));
|
||||||
|
console.log(chalk.gray(`\nWatching file changes for ${name} script...`));
|
||||||
|
});
|
||||||
|
|
||||||
|
const server = new WebpackDevServer(compiler, {
|
||||||
|
contentBase: path.join(__dirname, '../'),
|
||||||
|
hot: true,
|
||||||
|
noInfo: true,
|
||||||
|
overlay: true,
|
||||||
|
clientLogLevel: 'warning'
|
||||||
|
});
|
||||||
|
|
||||||
|
server.listen(9080, '', err => {
|
||||||
|
if (err) console.error(chalk.red(err));
|
||||||
|
|
||||||
|
callback();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
startRenderer(startMain);
|
|
@ -44,17 +44,26 @@ async function createMainWindow () {
|
||||||
remoteMain.enable(window.webContents);
|
remoteMain.enable(window.webContents);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
if (isDevelopment) { //
|
if (isDevelopment) {
|
||||||
await window.loadURL(`http://localhost:${process.env.ELECTRON_WEBPACK_WDS_PORT}`);
|
const { default: installExtension, VUEJS3_DEVTOOLS } = require('electron-devtools-installer');
|
||||||
|
const options = {
|
||||||
|
loadExtensionOptions: { allowFileAccess: true }
|
||||||
|
};
|
||||||
|
|
||||||
// const { default: installExtension, VUEJS3_DEVTOOLS } = require('electron-devtools-installer');
|
try {
|
||||||
|
const name = await installExtension(VUEJS3_DEVTOOLS, options);
|
||||||
|
console.log(`Added Extension: ${name}`);
|
||||||
|
}
|
||||||
|
catch (err) {
|
||||||
|
console.log('An error occurred: ', err);
|
||||||
|
}
|
||||||
|
|
||||||
// const oldDevToolsID = session.defaultSession.getAllExtensions().find(ext => ext.name === 'Vue.js devtools').id;
|
await window.loadURL('http://localhost:9080');
|
||||||
// session.defaultSession.removeExtension(oldDevToolsID);
|
}
|
||||||
// const toolName = await installExtension(VUEJS3_DEVTOOLS);
|
else {
|
||||||
// console.log(toolName, 'installed');
|
const indexPath = path.resolve(__dirname, 'index.html');
|
||||||
|
await window.loadFile(indexPath);
|
||||||
}
|
}
|
||||||
else await window.loadURL(new URL(`file:///${path.join(__dirname, 'index.html')}`).href);
|
|
||||||
}
|
}
|
||||||
catch (err) {
|
catch (err) {
|
||||||
console.log(err);
|
console.log(err);
|
||||||
|
@ -89,10 +98,8 @@ else {
|
||||||
|
|
||||||
app.on('activate', async () => {
|
app.on('activate', async () => {
|
||||||
// on macOS it is common to re-create a window even after all windows have been closed
|
// on macOS it is common to re-create a window even after all windows have been closed
|
||||||
if (mainWindow === null) {
|
if (mainWindow === null)
|
||||||
mainWindow = await createMainWindow();
|
mainWindow = await createMainWindow();
|
||||||
if (isDevelopment) mainWindow.webContents.openDevTools();
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
// create main BrowserWindow when electron is ready
|
// create main BrowserWindow when electron is ready
|
||||||
|
@ -100,7 +107,8 @@ else {
|
||||||
mainWindow = await createMainWindow();
|
mainWindow = await createMainWindow();
|
||||||
createAppMenu();
|
createAppMenu();
|
||||||
|
|
||||||
if (isDevelopment) mainWindow.webContents.openDevTools();
|
if (isDevelopment)
|
||||||
|
mainWindow.webContents.openDevTools();
|
||||||
|
|
||||||
process.on('uncaughtException', (error) => {
|
process.on('uncaughtException', (error) => {
|
||||||
mainWindow.webContents.send('unhandled-exception', error);
|
mainWindow.webContents.send('unhandled-exception', error);
|
|
@ -184,7 +184,7 @@
|
||||||
:class="{'selected': applicationTheme === 'dark'}"
|
:class="{'selected': applicationTheme === 'dark'}"
|
||||||
@click="changeApplicationTheme('dark')"
|
@click="changeApplicationTheme('dark')"
|
||||||
>
|
>
|
||||||
<img :src="require('@/images/dark.png').default" class="img-responsive img-fit-cover s-rounded">
|
<img src="../images/dark.png" class="img-responsive img-fit-cover s-rounded">
|
||||||
<div class="theme-name text-light">
|
<div class="theme-name text-light">
|
||||||
<i class="mdi mdi-moon-waning-crescent mdi-48px" />
|
<i class="mdi mdi-moon-waning-crescent mdi-48px" />
|
||||||
<div class="h6 mt-4">
|
<div class="h6 mt-4">
|
||||||
|
@ -197,7 +197,7 @@
|
||||||
:class="{'selected': applicationTheme === 'light'}"
|
:class="{'selected': applicationTheme === 'light'}"
|
||||||
@click="changeApplicationTheme('light')"
|
@click="changeApplicationTheme('light')"
|
||||||
>
|
>
|
||||||
<img :src="require('@/images/light.png').default" class="img-responsive img-fit-cover s-rounded">
|
<img src="../images/light.png" class="img-responsive img-fit-cover s-rounded">
|
||||||
<div class="theme-name text-dark">
|
<div class="theme-name text-dark">
|
||||||
<i class="mdi mdi-white-balance-sunny mdi-48px" />
|
<i class="mdi mdi-white-balance-sunny mdi-48px" />
|
||||||
<div class="h6 mt-4">
|
<div class="h6 mt-4">
|
||||||
|
@ -280,7 +280,7 @@
|
||||||
|
|
||||||
<div v-show="selectedTab === 'about'" class="panel-body py-4">
|
<div v-show="selectedTab === 'about'" class="panel-body py-4">
|
||||||
<div class="text-center">
|
<div class="text-center">
|
||||||
<img :src="require('@/images/logo.svg').default" width="128">
|
<img src="../images/logo.svg" width="128">
|
||||||
<h4>{{ appName }}</h4>
|
<h4>{{ appName }}</h4>
|
||||||
<p>
|
<p>
|
||||||
{{ $t('word.version') }} {{ appVersion }}<br>
|
{{ $t('word.version') }} {{ appVersion }}<br>
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
<img
|
<img
|
||||||
v-if="!isMacOS"
|
v-if="!isMacOS"
|
||||||
class="titlebar-logo"
|
class="titlebar-logo"
|
||||||
:src="require('@/images/logo.svg').default"
|
src="@/images/logo.svg"
|
||||||
>
|
>
|
||||||
</div>
|
</div>
|
||||||
<div class="titlebar-elements titlebar-title">
|
<div class="titlebar-elements titlebar-title">
|
||||||
|
|
|
@ -1,7 +1,16 @@
|
||||||
<template>
|
<template>
|
||||||
<div class="column col-12 empty">
|
<div class="column col-12 empty">
|
||||||
<div class="empty-icon">
|
<div class="empty-icon">
|
||||||
<img :src="require(`@/images/logo-${applicationTheme}.svg`).default" width="200">
|
<img
|
||||||
|
v-if="applicationTheme === 'dark'"
|
||||||
|
src="../images/logo-dark.svg"
|
||||||
|
width="200"
|
||||||
|
>
|
||||||
|
<img
|
||||||
|
v-if="applicationTheme === 'light'"
|
||||||
|
src="../images/logo-light.svg"
|
||||||
|
width="200"
|
||||||
|
>
|
||||||
</div>
|
</div>
|
||||||
<p class="h6 empty-subtitle">
|
<p class="h6 empty-subtitle">
|
||||||
{{ $t('message.noOpenTabs') }}
|
{{ $t('message.noOpenTabs') }}
|
||||||
|
|
|
@ -1,413 +1,413 @@
|
||||||
module.exports = {
|
module.exports = {
|
||||||
word: {
|
word: {
|
||||||
edit: 'Chỉnh sửa',
|
edit: 'Chỉnh sửa',
|
||||||
save: 'Lưu',
|
save: 'Lưu',
|
||||||
close: 'Đóng',
|
close: 'Đóng',
|
||||||
delete: 'Xoá',
|
delete: 'Xoá',
|
||||||
confirm: 'Xác nhận',
|
confirm: 'Xác nhận',
|
||||||
cancel: 'Huỷ',
|
cancel: 'Huỷ',
|
||||||
send: 'Gửi',
|
send: 'Gửi',
|
||||||
connectionName: 'Tên kết nối',
|
connectionName: 'Tên kết nối',
|
||||||
client: 'Client',
|
client: 'Client',
|
||||||
hostName: 'Tên máy chủ',
|
hostName: 'Tên máy chủ',
|
||||||
port: 'Cổng',
|
port: 'Cổng',
|
||||||
user: 'Người dùng',
|
user: 'Người dùng',
|
||||||
password: 'Mật khẩu',
|
password: 'Mật khẩu',
|
||||||
credentials: 'Thông tin xác thực',
|
credentials: 'Thông tin xác thực',
|
||||||
connect: 'Kết nối',
|
connect: 'Kết nối',
|
||||||
connected: 'Đã kết nối',
|
connected: 'Đã kết nối',
|
||||||
disconnect: 'Ngắt kết nối',
|
disconnect: 'Ngắt kết nối',
|
||||||
disconnected: 'Đã ngắt kết nối',
|
disconnected: 'Đã ngắt kết nối',
|
||||||
refresh: 'Làm mới',
|
refresh: 'Làm mới',
|
||||||
settings: 'Cài đặt',
|
settings: 'Cài đặt',
|
||||||
general: 'Chung',
|
general: 'Chung',
|
||||||
themes: 'Giao diện',
|
themes: 'Giao diện',
|
||||||
update: 'Cập nhật',
|
update: 'Cập nhật',
|
||||||
about: 'Giới thiệu',
|
about: 'Giới thiệu',
|
||||||
language: 'Ngôn ngữ',
|
language: 'Ngôn ngữ',
|
||||||
version: 'Phiên bản',
|
version: 'Phiên bản',
|
||||||
donate: 'Ủng hộ',
|
donate: 'Ủng hộ',
|
||||||
run: 'Chạy',
|
run: 'Chạy',
|
||||||
schema: 'Schema',
|
schema: 'Schema',
|
||||||
results: 'Kết quả',
|
results: 'Kết quả',
|
||||||
size: 'Kích thước',
|
size: 'Kích thước',
|
||||||
seconds: 'Giây',
|
seconds: 'Giây',
|
||||||
type: 'Kiểu',
|
type: 'Kiểu',
|
||||||
mimeType: 'Mime-Type',
|
mimeType: 'Mime-Type',
|
||||||
download: 'Tải xuống',
|
download: 'Tải xuống',
|
||||||
add: 'Thêm',
|
add: 'Thêm',
|
||||||
data: 'Dữ liệu',
|
data: 'Dữ liệu',
|
||||||
properties: 'Thuộc tính',
|
properties: 'Thuộc tính',
|
||||||
insert: 'Nhập',
|
insert: 'Nhập',
|
||||||
connecting: 'Đang kết nối',
|
connecting: 'Đang kết nối',
|
||||||
name: 'Tên',
|
name: 'Tên',
|
||||||
collation: 'Đối chiếu',
|
collation: 'Đối chiếu',
|
||||||
clear: 'Xoá',
|
clear: 'Xoá',
|
||||||
options: 'Tuỳ chọn',
|
options: 'Tuỳ chọn',
|
||||||
autoRefresh: 'Tự động làm mới',
|
autoRefresh: 'Tự động làm mới',
|
||||||
indexes: 'Index',
|
indexes: 'Index',
|
||||||
foreignKeys: 'Khoá ngoại',
|
foreignKeys: 'Khoá ngoại',
|
||||||
length: 'Độ dài',
|
length: 'Độ dài',
|
||||||
unsigned: 'Unsigned',
|
unsigned: 'Unsigned',
|
||||||
default: 'Mặc định',
|
default: 'Mặc định',
|
||||||
comment: 'Nhận xét',
|
comment: 'Nhận xét',
|
||||||
key: 'Khoá | Khoá',
|
key: 'Khoá | Khoá',
|
||||||
order: 'Sắp xếp',
|
order: 'Sắp xếp',
|
||||||
expression: 'Biểu hiện',
|
expression: 'Biểu hiện',
|
||||||
autoIncrement: 'Tự động tăng',
|
autoIncrement: 'Tự động tăng',
|
||||||
engine: 'Engine',
|
engine: 'Engine',
|
||||||
field: 'Trường | Trường',
|
field: 'Trường | Trường',
|
||||||
approximately: 'Khoảng',
|
approximately: 'Khoảng',
|
||||||
total: 'Toàn bộ',
|
total: 'Toàn bộ',
|
||||||
table: 'Bảng',
|
table: 'Bảng',
|
||||||
discard: 'Bỏ',
|
discard: 'Bỏ',
|
||||||
stay: 'Ở lại',
|
stay: 'Ở lại',
|
||||||
author: 'Tác giả',
|
author: 'Tác giả',
|
||||||
light: 'Sáng',
|
light: 'Sáng',
|
||||||
dark: 'Tối',
|
dark: 'Tối',
|
||||||
autoCompletion: 'Tự động hoàn thành',
|
autoCompletion: 'Tự động hoàn thành',
|
||||||
application: 'Ứng dụng',
|
application: 'Ứng dụng',
|
||||||
editor: 'Người chỉnh sửa',
|
editor: 'Người chỉnh sửa',
|
||||||
view: 'Xem',
|
view: 'Xem',
|
||||||
definer: 'Định nghĩa',
|
definer: 'Định nghĩa',
|
||||||
algorithm: 'Thuật toán',
|
algorithm: 'Thuật toán',
|
||||||
trigger: 'Kích hoạt | Kích hoạt',
|
trigger: 'Kích hoạt | Kích hoạt',
|
||||||
storedRoutine: 'Quy trình đã lưu | Quy trình đã lưu',
|
storedRoutine: 'Quy trình đã lưu | Quy trình đã lưu',
|
||||||
scheduler: 'Lập lịch trình | Lập lịch trình',
|
scheduler: 'Lập lịch trình | Lập lịch trình',
|
||||||
event: 'Sự kiện',
|
event: 'Sự kiện',
|
||||||
parameters: 'Tham số',
|
parameters: 'Tham số',
|
||||||
function: 'Chức năng | Chức năng',
|
function: 'Chức năng | Chức năng',
|
||||||
deterministic: 'Xác định',
|
deterministic: 'Xác định',
|
||||||
context: 'Context',
|
context: 'Context',
|
||||||
export: 'Xuất',
|
export: 'Xuất',
|
||||||
returns: 'Returns',
|
returns: 'Returns',
|
||||||
timing: 'Thời gian',
|
timing: 'Thời gian',
|
||||||
state: 'Trạng thái',
|
state: 'Trạng thái',
|
||||||
execution: 'Thực thi',
|
execution: 'Thực thi',
|
||||||
starts: 'Bắt đầu',
|
starts: 'Bắt đầu',
|
||||||
ends: 'Kết thúc',
|
ends: 'Kết thúc',
|
||||||
ssl: 'SSL',
|
ssl: 'SSL',
|
||||||
privateKey: 'Mã khoá riêng tư',
|
privateKey: 'Mã khoá riêng tư',
|
||||||
certificate: 'Chứng chỉ',
|
certificate: 'Chứng chỉ',
|
||||||
caCertificate: 'Chứng chỉ CA',
|
caCertificate: 'Chứng chỉ CA',
|
||||||
ciphers: 'Ciphers',
|
ciphers: 'Ciphers',
|
||||||
upload: 'Tải lên',
|
upload: 'Tải lên',
|
||||||
browse: 'Duyệt',
|
browse: 'Duyệt',
|
||||||
faker: 'Faker',
|
faker: 'Faker',
|
||||||
content: 'Nội dung',
|
content: 'Nội dung',
|
||||||
cut: 'Cắt',
|
cut: 'Cắt',
|
||||||
copy: 'Sao chép',
|
copy: 'Sao chép',
|
||||||
paste: 'Dán',
|
paste: 'Dán',
|
||||||
tools: 'Công cụ',
|
tools: 'Công cụ',
|
||||||
variables: 'Biến',
|
variables: 'Biến',
|
||||||
processes: 'Quá trình',
|
processes: 'Quá trình',
|
||||||
database: 'Cơ sở dữ liệu',
|
database: 'Cơ sở dữ liệu',
|
||||||
scratchpad: 'Scratchpad',
|
scratchpad: 'Scratchpad',
|
||||||
array: 'Mảng',
|
array: 'Mảng',
|
||||||
changelog: 'Nhật ký thay đổi',
|
changelog: 'Nhật ký thay đổi',
|
||||||
format: 'Định dạng',
|
format: 'Định dạng',
|
||||||
sshTunnel: 'SSH tunnel',
|
sshTunnel: 'SSH tunnel',
|
||||||
structure: 'Structure',
|
structure: 'Structure',
|
||||||
small: 'Nhỏ',
|
small: 'Nhỏ',
|
||||||
medium: 'Vừa',
|
medium: 'Vừa',
|
||||||
large: 'Lớn',
|
large: 'Lớn',
|
||||||
row: 'Hàng | Hàng',
|
row: 'Hàng | Hàng',
|
||||||
cell: 'Ô | Ô',
|
cell: 'Ô | Ô',
|
||||||
triggerFunction: 'Trigger function | Trigger functions',
|
triggerFunction: 'Trigger function | Trigger functions',
|
||||||
all: 'Tất cả',
|
all: 'Tất cả',
|
||||||
duplicate: 'Bản sao',
|
duplicate: 'Bản sao',
|
||||||
routine: 'Routine',
|
routine: 'Routine',
|
||||||
new: 'Mới',
|
new: 'Mới',
|
||||||
history: 'Lịch sử',
|
history: 'Lịch sử',
|
||||||
select: 'Chọn',
|
select: 'Chọn',
|
||||||
passphrase: 'Cụm mật khẩu'
|
passphrase: 'Cụm mật khẩu'
|
||||||
},
|
},
|
||||||
message: {
|
message: {
|
||||||
appWelcome: 'Chào bạn đến với Antares SQL Client!',
|
appWelcome: 'Chào bạn đến với Antares SQL Client!',
|
||||||
appFirstStep: 'Bước đầu tiên: tạo một kết nối tới cơ sở dữ liệu.',
|
appFirstStep: 'Bước đầu tiên: tạo một kết nối tới cơ sở dữ liệu.',
|
||||||
addConnection: 'Thêm kết nối',
|
addConnection: 'Thêm kết nối',
|
||||||
createConnection: 'Tạo kết nối',
|
createConnection: 'Tạo kết nối',
|
||||||
createNewConnection: 'Tạo kết nối mới',
|
createNewConnection: 'Tạo kết nối mới',
|
||||||
askCredentials: 'Yêu cầu thông tin đăng nhập',
|
askCredentials: 'Yêu cầu thông tin đăng nhập',
|
||||||
testConnection: 'Chạy thử kết nối',
|
testConnection: 'Chạy thử kết nối',
|
||||||
editConnection: 'Sửa kết nối',
|
editConnection: 'Sửa kết nối',
|
||||||
deleteConnection: 'Xoá kết nối',
|
deleteConnection: 'Xoá kết nối',
|
||||||
deleteCorfirm: 'Bạn có xác nhận việc hủy bỏ',
|
deleteCorfirm: 'Bạn có xác nhận việc hủy bỏ',
|
||||||
connectionSuccessfullyMade: 'Kết nối được thực hiện thành công!',
|
connectionSuccessfullyMade: 'Kết nối được thực hiện thành công!',
|
||||||
madeWithJS: 'Được tạo bằng 💛 và JavaScript!',
|
madeWithJS: 'Được tạo bằng 💛 và JavaScript!',
|
||||||
checkForUpdates: 'Kiểm tra cập nhật',
|
checkForUpdates: 'Kiểm tra cập nhật',
|
||||||
noUpdatesAvailable: 'Không có bản cập nhật nào',
|
noUpdatesAvailable: 'Không có bản cập nhật nào',
|
||||||
checkingForUpdate: 'Đang kiểm tra cập nhật',
|
checkingForUpdate: 'Đang kiểm tra cập nhật',
|
||||||
checkFailure: 'Kiểm tra thất bại, vui lòng thử lại sau',
|
checkFailure: 'Kiểm tra thất bại, vui lòng thử lại sau',
|
||||||
updateAvailable: 'Cập nhật có sẵn',
|
updateAvailable: 'Cập nhật có sẵn',
|
||||||
downloadingUpdate: 'Đang tải bản cập nhật',
|
downloadingUpdate: 'Đang tải bản cập nhật',
|
||||||
updateDownloaded: 'Đã tải bản cập nhạt',
|
updateDownloaded: 'Đã tải bản cập nhạt',
|
||||||
restartToInstall: 'Khởi động lại Antares để cài đặt',
|
restartToInstall: 'Khởi động lại Antares để cài đặt',
|
||||||
unableEditFieldWithoutPrimary: 'Không thể chỉnh sửa trường mà không có khóa chính trong kết quả',
|
unableEditFieldWithoutPrimary: 'Không thể chỉnh sửa trường mà không có khóa chính trong kết quả',
|
||||||
editCell: 'Sửa ô',
|
editCell: 'Sửa ô',
|
||||||
deleteRows: 'Xoá hàng | Xoá {count} hàng',
|
deleteRows: 'Xoá hàng | Xoá {count} hàng',
|
||||||
confirmToDeleteRows: 'Bạn có xác nhận xóa một hàng không? | Bạn có xác nhận xóa {count} hàng không?',
|
confirmToDeleteRows: 'Bạn có xác nhận xóa một hàng không? | Bạn có xác nhận xóa {count} hàng không?',
|
||||||
notificationsTimeout: 'Thông báo hết giờ',
|
notificationsTimeout: 'Thông báo hết giờ',
|
||||||
uploadFile: 'Tải lên tệp',
|
uploadFile: 'Tải lên tệp',
|
||||||
addNewRow: 'Thêm hàng mới',
|
addNewRow: 'Thêm hàng mới',
|
||||||
numberOfInserts: 'Số lần nhập',
|
numberOfInserts: 'Số lần nhập',
|
||||||
openNewTab: 'Mở trong tab mới',
|
openNewTab: 'Mở trong tab mới',
|
||||||
affectedRows: 'Các hàng bị ảnh hưởng',
|
affectedRows: 'Các hàng bị ảnh hưởng',
|
||||||
createNewDatabase: 'Tạo Cơ sở dữ liệu mới',
|
createNewDatabase: 'Tạo Cơ sở dữ liệu mới',
|
||||||
databaseName: 'Tên cơ sở dữ liệu',
|
databaseName: 'Tên cơ sở dữ liệu',
|
||||||
serverDefault: 'Máy chủ mặc định',
|
serverDefault: 'Máy chủ mặc định',
|
||||||
deleteDatabase: 'Xoá cơ sở dữ liệu',
|
deleteDatabase: 'Xoá cơ sở dữ liệu',
|
||||||
editDatabase: 'Sửa cơ sở dữ liệu',
|
editDatabase: 'Sửa cơ sở dữ liệu',
|
||||||
clearChanges: 'Xóa các thay đổi',
|
clearChanges: 'Xóa các thay đổi',
|
||||||
addNewField: 'Thêm trường mới',
|
addNewField: 'Thêm trường mới',
|
||||||
manageIndexes: 'Quản lý index',
|
manageIndexes: 'Quản lý index',
|
||||||
manageForeignKeys: 'Quản lý khoá ngoại',
|
manageForeignKeys: 'Quản lý khoá ngoại',
|
||||||
allowNull: 'Cho phép NULL',
|
allowNull: 'Cho phép NULL',
|
||||||
zeroFill: 'Không điền',
|
zeroFill: 'Không điền',
|
||||||
customValue: 'Tuỳ chỉnh giá trị',
|
customValue: 'Tuỳ chỉnh giá trị',
|
||||||
onUpdate: 'Đang cập nhật',
|
onUpdate: 'Đang cập nhật',
|
||||||
deleteField: 'Xoá trường',
|
deleteField: 'Xoá trường',
|
||||||
createNewIndex: 'Tạo index mới',
|
createNewIndex: 'Tạo index mới',
|
||||||
addToIndex: 'Thêm vào index',
|
addToIndex: 'Thêm vào index',
|
||||||
createNewTable: 'Tạo bảng mới',
|
createNewTable: 'Tạo bảng mới',
|
||||||
emptyTable: 'Bảng trống',
|
emptyTable: 'Bảng trống',
|
||||||
deleteTable: 'Xoá bảng',
|
deleteTable: 'Xoá bảng',
|
||||||
emptyCorfirm: 'Bạn có xác nhận để làm trống không',
|
emptyCorfirm: 'Bạn có xác nhận để làm trống không',
|
||||||
unsavedChanges: 'Chưa lưu lại thay đổi',
|
unsavedChanges: 'Chưa lưu lại thay đổi',
|
||||||
discardUnsavedChanges: 'Bạn có một số thay đổi chưa được lưu. Đóng tab này, những thay đổi này sẽ bị huỷ bỏ.',
|
discardUnsavedChanges: 'Bạn có một số thay đổi chưa được lưu. Đóng tab này, những thay đổi này sẽ bị huỷ bỏ.',
|
||||||
thereAreNoIndexes: 'Không có index',
|
thereAreNoIndexes: 'Không có index',
|
||||||
thereAreNoForeign: 'Không có khoá ngoại',
|
thereAreNoForeign: 'Không có khoá ngoại',
|
||||||
createNewForeign: 'Tạo khoá ngoại mới',
|
createNewForeign: 'Tạo khoá ngoại mới',
|
||||||
referenceTable: 'Tham khảo bảng',
|
referenceTable: 'Tham khảo bảng',
|
||||||
referenceField: 'Tham khảo trường',
|
referenceField: 'Tham khảo trường',
|
||||||
foreignFields: 'Trường ngoại',
|
foreignFields: 'Trường ngoại',
|
||||||
invalidDefault: 'Mặc định không hợp lệ',
|
invalidDefault: 'Mặc định không hợp lệ',
|
||||||
onDelete: 'Đang xoá',
|
onDelete: 'Đang xoá',
|
||||||
applicationTheme: 'Chủ đề ứng dụng',
|
applicationTheme: 'Chủ đề ứng dụng',
|
||||||
editorTheme: 'Trình chỉnh sửa chủ đề',
|
editorTheme: 'Trình chỉnh sửa chủ đề',
|
||||||
wrapLongLines: 'Wrap long lines',
|
wrapLongLines: 'Wrap long lines',
|
||||||
selectStatement: 'Chọn câu lệnh',
|
selectStatement: 'Chọn câu lệnh',
|
||||||
triggerStatement: 'Kích hoạt câu lệnh',
|
triggerStatement: 'Kích hoạt câu lệnh',
|
||||||
sqlSecurity: 'Bảo mật SQL',
|
sqlSecurity: 'Bảo mật SQL',
|
||||||
updateOption: 'Cập nhật tuỳ chọn',
|
updateOption: 'Cập nhật tuỳ chọn',
|
||||||
deleteView: 'Xóa chế độ xem',
|
deleteView: 'Xóa chế độ xem',
|
||||||
createNewView: 'Tạo chế độ xem mới',
|
createNewView: 'Tạo chế độ xem mới',
|
||||||
deleteTrigger: 'Xóa trình kích hoạt',
|
deleteTrigger: 'Xóa trình kích hoạt',
|
||||||
createNewTrigger: 'Tạo trình kích hoạt mới',
|
createNewTrigger: 'Tạo trình kích hoạt mới',
|
||||||
currentUser: 'Người dùng hiện tại',
|
currentUser: 'Người dùng hiện tại',
|
||||||
routineBody: 'Body quy trình',
|
routineBody: 'Body quy trình',
|
||||||
dataAccess: 'Truy cập dữ liệu',
|
dataAccess: 'Truy cập dữ liệu',
|
||||||
thereAreNoParameters: 'Không có tham số',
|
thereAreNoParameters: 'Không có tham số',
|
||||||
createNewParameter: 'Tạo tham số mới',
|
createNewParameter: 'Tạo tham số mới',
|
||||||
createNewRoutine: 'Tạo quy trình lưu trữ mới',
|
createNewRoutine: 'Tạo quy trình lưu trữ mới',
|
||||||
deleteRoutine: 'Xoá quy trình lưu trữ',
|
deleteRoutine: 'Xoá quy trình lưu trữ',
|
||||||
functionBody: 'Body chức năng',
|
functionBody: 'Body chức năng',
|
||||||
createNewFunction: 'Tạo chức năng mới',
|
createNewFunction: 'Tạo chức năng mới',
|
||||||
deleteFunction: 'Xoá chức năng',
|
deleteFunction: 'Xoá chức năng',
|
||||||
schedulerBody: 'Body trình lập lịch',
|
schedulerBody: 'Body trình lập lịch',
|
||||||
createNewScheduler: 'Tạo lịch trình mới',
|
createNewScheduler: 'Tạo lịch trình mới',
|
||||||
deleteScheduler: 'Xóa trình lên lịch',
|
deleteScheduler: 'Xóa trình lên lịch',
|
||||||
preserveOnCompletion: 'Bảo tồn khi hoàn thành',
|
preserveOnCompletion: 'Bảo tồn khi hoàn thành',
|
||||||
enableSsl: 'Bật SSL',
|
enableSsl: 'Bật SSL',
|
||||||
manualValue: 'Giá trị thủ công',
|
manualValue: 'Giá trị thủ công',
|
||||||
tableFiller: 'Bộ lọc bảng',
|
tableFiller: 'Bộ lọc bảng',
|
||||||
fakeDataLanguage: 'Ngôn ngữ dữ liệu giả mạo',
|
fakeDataLanguage: 'Ngôn ngữ dữ liệu giả mạo',
|
||||||
searchForElements: 'Tìm kiếm yếu tố',
|
searchForElements: 'Tìm kiếm yếu tố',
|
||||||
selectAll: 'Chọn tất cả',
|
selectAll: 'Chọn tất cả',
|
||||||
queryDuration: 'Thời lượng truy vấn',
|
queryDuration: 'Thời lượng truy vấn',
|
||||||
includeBetaUpdates: 'Bao gồm các bản cập nhật beta',
|
includeBetaUpdates: 'Bao gồm các bản cập nhật beta',
|
||||||
setNull: 'Đặt NULL',
|
setNull: 'Đặt NULL',
|
||||||
processesList: 'Danh sách quy trình',
|
processesList: 'Danh sách quy trình',
|
||||||
processInfo: 'Thông tin quá trình',
|
processInfo: 'Thông tin quá trình',
|
||||||
manageUsers: 'Quản lý người dùng',
|
manageUsers: 'Quản lý người dùng',
|
||||||
createNewSchema: 'Tạo schema mới',
|
createNewSchema: 'Tạo schema mới',
|
||||||
schemaName: 'Tên schema',
|
schemaName: 'Tên schema',
|
||||||
editSchema: 'Sửa schema',
|
editSchema: 'Sửa schema',
|
||||||
deleteSchema: 'Xoá schema',
|
deleteSchema: 'Xoá schema',
|
||||||
markdownSupported: 'Hỗ trợ Markdown',
|
markdownSupported: 'Hỗ trợ Markdown',
|
||||||
plantATree: 'Trồng cây',
|
plantATree: 'Trồng cây',
|
||||||
dataTabPageSize: 'Kích thước trang tab DATA',
|
dataTabPageSize: 'Kích thước trang tab DATA',
|
||||||
enableSsh: 'Bật SSH',
|
enableSsh: 'Bật SSH',
|
||||||
pageNumber: 'Số trang',
|
pageNumber: 'Số trang',
|
||||||
duplicateTable: 'Sao chép bản',
|
duplicateTable: 'Sao chép bản',
|
||||||
noOpenTabs: 'Không có tab nào đang mở, điều hướng trên thanh bên trái hoặc:',
|
noOpenTabs: 'Không có tab nào đang mở, điều hướng trên thanh bên trái hoặc:',
|
||||||
noSchema: 'Không có schema',
|
noSchema: 'Không có schema',
|
||||||
restorePreviourSession: 'Khôi phục phiên trước',
|
restorePreviourSession: 'Khôi phục phiên trước',
|
||||||
runQuery: 'Chạy truy vấn',
|
runQuery: 'Chạy truy vấn',
|
||||||
thereAreNoTableFields: 'Không có trường bảng',
|
thereAreNoTableFields: 'Không có trường bảng',
|
||||||
newTable: 'Bảng mới',
|
newTable: 'Bảng mới',
|
||||||
newView: 'Chế độ xem mới',
|
newView: 'Chế độ xem mới',
|
||||||
newTrigger: 'Trình kích hoạt mới',
|
newTrigger: 'Trình kích hoạt mới',
|
||||||
newRoutine: 'Quy trình mới',
|
newRoutine: 'Quy trình mới',
|
||||||
newFunction: 'Chức năng mới',
|
newFunction: 'Chức năng mới',
|
||||||
newScheduler: 'Bộ lập lịch mới',
|
newScheduler: 'Bộ lập lịch mới',
|
||||||
newTriggerFunction: 'Chức năng kích hoạt mới',
|
newTriggerFunction: 'Chức năng kích hoạt mới',
|
||||||
thereIsNoQueriesYet: 'Không có truy vấn nào',
|
thereIsNoQueriesYet: 'Không có truy vấn nào',
|
||||||
searchForQueries: 'Tìm kiếm truy vấn',
|
searchForQueries: 'Tìm kiếm truy vấn',
|
||||||
killProcess: 'Huỷ quá trình'
|
killProcess: 'Huỷ quá trình'
|
||||||
},
|
},
|
||||||
faker: {
|
faker: {
|
||||||
address: 'Địa chỉ',
|
address: 'Địa chỉ',
|
||||||
commerce: 'Thương mại',
|
commerce: 'Thương mại',
|
||||||
company: 'Công ty',
|
company: 'Công ty',
|
||||||
database: 'Cơ sở dữ liệu',
|
database: 'Cơ sở dữ liệu',
|
||||||
date: 'Ngày',
|
date: 'Ngày',
|
||||||
finance: 'Tài chánh',
|
finance: 'Tài chánh',
|
||||||
git: 'Git',
|
git: 'Git',
|
||||||
hacker: 'Tin tặc',
|
hacker: 'Tin tặc',
|
||||||
internet: 'Mạng Internet',
|
internet: 'Mạng Internet',
|
||||||
lorem: 'Lorem',
|
lorem: 'Lorem',
|
||||||
name: 'Tên',
|
name: 'Tên',
|
||||||
music: 'Âm nhạc',
|
music: 'Âm nhạc',
|
||||||
phone: 'Số điện thoại',
|
phone: 'Số điện thoại',
|
||||||
random: 'Ngẫu nhiên',
|
random: 'Ngẫu nhiên',
|
||||||
system: 'Hệ thống',
|
system: 'Hệ thống',
|
||||||
time: 'Thời gian',
|
time: 'Thời gian',
|
||||||
vehicle: 'Phương tiện giao thông',
|
vehicle: 'Phương tiện giao thông',
|
||||||
zipCode: 'Mã Bưu Chính',
|
zipCode: 'Mã Bưu Chính',
|
||||||
zipCodeByState: 'Mã Bưu Chính theo tiểu bang',
|
zipCodeByState: 'Mã Bưu Chính theo tiểu bang',
|
||||||
city: 'Thành phố',
|
city: 'Thành phố',
|
||||||
cityPrefix: 'Tiền tố thành phố',
|
cityPrefix: 'Tiền tố thành phố',
|
||||||
citySuffix: 'Hậu tố thành phố',
|
citySuffix: 'Hậu tố thành phố',
|
||||||
streetName: 'Tên đường',
|
streetName: 'Tên đường',
|
||||||
streetAddress: 'Địa chỉ đường',
|
streetAddress: 'Địa chỉ đường',
|
||||||
streetSuffix: 'Hậu tố đường',
|
streetSuffix: 'Hậu tố đường',
|
||||||
streetPrefix: 'Tiền tố đường',
|
streetPrefix: 'Tiền tố đường',
|
||||||
secondaryAddress: 'Địa chỉ phụ',
|
secondaryAddress: 'Địa chỉ phụ',
|
||||||
county: 'Quận',
|
county: 'Quận',
|
||||||
country: 'Quốc gia',
|
country: 'Quốc gia',
|
||||||
countryCode: 'Mã quốc gia',
|
countryCode: 'Mã quốc gia',
|
||||||
state: 'Tiểu bang',
|
state: 'Tiểu bang',
|
||||||
stateAbbr: 'Viết tắt của tiểu bang',
|
stateAbbr: 'Viết tắt của tiểu bang',
|
||||||
latitude: 'Vĩ độ',
|
latitude: 'Vĩ độ',
|
||||||
longitude: 'Kinh độ',
|
longitude: 'Kinh độ',
|
||||||
direction: 'Hướng',
|
direction: 'Hướng',
|
||||||
cardinalDirection: 'Hướng cốt yếu',
|
cardinalDirection: 'Hướng cốt yếu',
|
||||||
ordinalDirection: 'Hướng thứ tự',
|
ordinalDirection: 'Hướng thứ tự',
|
||||||
nearbyGPSCoordinate: 'Tọa độ GPS lân cận',
|
nearbyGPSCoordinate: 'Tọa độ GPS lân cận',
|
||||||
timeZone: 'Múi giờ',
|
timeZone: 'Múi giờ',
|
||||||
color: 'Màu',
|
color: 'Màu',
|
||||||
department: 'Phòng',
|
department: 'Phòng',
|
||||||
productName: 'Tên sản phẩm',
|
productName: 'Tên sản phẩm',
|
||||||
price: 'Giá',
|
price: 'Giá',
|
||||||
productAdjective: 'Tính từ sản phẩm',
|
productAdjective: 'Tính từ sản phẩm',
|
||||||
productMaterial: 'Chất liệu sản phẩm',
|
productMaterial: 'Chất liệu sản phẩm',
|
||||||
product: 'Sản phẩm',
|
product: 'Sản phẩm',
|
||||||
productDescription: 'Mô tả sản phẩm',
|
productDescription: 'Mô tả sản phẩm',
|
||||||
suffixes: 'Hậu tố',
|
suffixes: 'Hậu tố',
|
||||||
companyName: 'Tên công ty',
|
companyName: 'Tên công ty',
|
||||||
companySuffix: 'Hậu tố công ty',
|
companySuffix: 'Hậu tố công ty',
|
||||||
catchPhrase: 'Khẩu hiệu',
|
catchPhrase: 'Khẩu hiệu',
|
||||||
bs: 'BS',
|
bs: 'BS',
|
||||||
catchPhraseAdjective: 'Bắt cụm từ tính từ',
|
catchPhraseAdjective: 'Bắt cụm từ tính từ',
|
||||||
catchPhraseDescriptor: 'Bắt bộ mô tả cụm từ',
|
catchPhraseDescriptor: 'Bắt bộ mô tả cụm từ',
|
||||||
catchPhraseNoun: 'Bắt cụm từ danh từ',
|
catchPhraseNoun: 'Bắt cụm từ danh từ',
|
||||||
bsAdjective: 'BS tính từ',
|
bsAdjective: 'BS tính từ',
|
||||||
bsBuzz: 'BS buzz',
|
bsBuzz: 'BS buzz',
|
||||||
bsNoun: 'BS danh từ',
|
bsNoun: 'BS danh từ',
|
||||||
column: 'Cột',
|
column: 'Cột',
|
||||||
type: 'Loại',
|
type: 'Loại',
|
||||||
collation: 'Đối chiếu',
|
collation: 'Đối chiếu',
|
||||||
engine: 'Engine',
|
engine: 'Engine',
|
||||||
past: 'Quá khứ',
|
past: 'Quá khứ',
|
||||||
future: 'Tương lai',
|
future: 'Tương lai',
|
||||||
between: 'Giữa',
|
between: 'Giữa',
|
||||||
recent: 'Gần đây',
|
recent: 'Gần đây',
|
||||||
soon: 'Sớm',
|
soon: 'Sớm',
|
||||||
month: 'Tháng',
|
month: 'Tháng',
|
||||||
weekday: 'Ngày trong tuần',
|
weekday: 'Ngày trong tuần',
|
||||||
account: 'Tài khoản',
|
account: 'Tài khoản',
|
||||||
accountName: 'Tên tài khoản',
|
accountName: 'Tên tài khoản',
|
||||||
routingNumber: 'Số định tuyến',
|
routingNumber: 'Số định tuyến',
|
||||||
mask: 'Mặt nạ',
|
mask: 'Mặt nạ',
|
||||||
amount: 'Số tiền',
|
amount: 'Số tiền',
|
||||||
transactionType: 'Loại giao dịch',
|
transactionType: 'Loại giao dịch',
|
||||||
currencyCode: 'Mã tiền tệ',
|
currencyCode: 'Mã tiền tệ',
|
||||||
currencyName: 'Tên tiền tệ',
|
currencyName: 'Tên tiền tệ',
|
||||||
currencySymbol: 'Ký hiệu tiền tệ',
|
currencySymbol: 'Ký hiệu tiền tệ',
|
||||||
bitcoinAddress: 'Địa chỉ Bitcoin',
|
bitcoinAddress: 'Địa chỉ Bitcoin',
|
||||||
litecoinAddress: 'Địa chỉ Litecoin',
|
litecoinAddress: 'Địa chỉ Litecoin',
|
||||||
creditCardNumber: 'Số thẻ tín dụng',
|
creditCardNumber: 'Số thẻ tín dụng',
|
||||||
creditCardCVV: 'CVV thẻ tín dụng',
|
creditCardCVV: 'CVV thẻ tín dụng',
|
||||||
ethereumAddress: 'Địa chỉ Ethereum',
|
ethereumAddress: 'Địa chỉ Ethereum',
|
||||||
iban: 'Iban',
|
iban: 'Iban',
|
||||||
bic: 'Bic',
|
bic: 'Bic',
|
||||||
transactionDescription: 'Mô tả giao dịch',
|
transactionDescription: 'Mô tả giao dịch',
|
||||||
branch: 'Nhánh',
|
branch: 'Nhánh',
|
||||||
commitEntry: 'Nhập cam kết',
|
commitEntry: 'Nhập cam kết',
|
||||||
commitMessage: 'Thông báo cam kết',
|
commitMessage: 'Thông báo cam kết',
|
||||||
commitSha: 'Cam kết SHA',
|
commitSha: 'Cam kết SHA',
|
||||||
shortSha: 'SHA ngắn',
|
shortSha: 'SHA ngắn',
|
||||||
abbreviation: 'Viết tắt',
|
abbreviation: 'Viết tắt',
|
||||||
adjective: 'Tính từ',
|
adjective: 'Tính từ',
|
||||||
noun: 'Danh từ',
|
noun: 'Danh từ',
|
||||||
verb: 'Động từ',
|
verb: 'Động từ',
|
||||||
ingverb: 'Động từ ing',
|
ingverb: 'Động từ ing',
|
||||||
phrase: 'Cụm từ',
|
phrase: 'Cụm từ',
|
||||||
avatar: 'Ảnh đại diện',
|
avatar: 'Ảnh đại diện',
|
||||||
email: 'Email',
|
email: 'Email',
|
||||||
exampleEmail: 'Email ví dụ',
|
exampleEmail: 'Email ví dụ',
|
||||||
userName: 'Tên người dùng',
|
userName: 'Tên người dùng',
|
||||||
protocol: 'Giao thức',
|
protocol: 'Giao thức',
|
||||||
url: 'Url',
|
url: 'Url',
|
||||||
domainName: 'Tên miền',
|
domainName: 'Tên miền',
|
||||||
domainSuffix: 'Hậu tố miền',
|
domainSuffix: 'Hậu tố miền',
|
||||||
domainWord: 'Từ miền',
|
domainWord: 'Từ miền',
|
||||||
ip: 'Ip',
|
ip: 'Ip',
|
||||||
ipv6: 'Ipv6',
|
ipv6: 'Ipv6',
|
||||||
userAgent: 'User agent',
|
userAgent: 'User agent',
|
||||||
mac: 'Mac',
|
mac: 'Mac',
|
||||||
password: 'Mật khẩu',
|
password: 'Mật khẩu',
|
||||||
word: 'Từ',
|
word: 'Từ',
|
||||||
words: 'Từ',
|
words: 'Từ',
|
||||||
sentence: 'Câu',
|
sentence: 'Câu',
|
||||||
slug: 'Slug',
|
slug: 'Slug',
|
||||||
sentences: 'Câu',
|
sentences: 'Câu',
|
||||||
paragraph: 'Đoạn văn',
|
paragraph: 'Đoạn văn',
|
||||||
paragraphs: 'Đoạn văn',
|
paragraphs: 'Đoạn văn',
|
||||||
text: 'Văn bản',
|
text: 'Văn bản',
|
||||||
lines: 'Dòng',
|
lines: 'Dòng',
|
||||||
genre: 'Thể loại',
|
genre: 'Thể loại',
|
||||||
firstName: 'Tên',
|
firstName: 'Tên',
|
||||||
lastName: 'Họ',
|
lastName: 'Họ',
|
||||||
middleName: 'Tên đệm',
|
middleName: 'Tên đệm',
|
||||||
findName: 'Tên đầy đủ',
|
findName: 'Tên đầy đủ',
|
||||||
jobTitle: 'Chức vụ',
|
jobTitle: 'Chức vụ',
|
||||||
gender: 'Giới tính',
|
gender: 'Giới tính',
|
||||||
prefix: 'Tiền tố',
|
prefix: 'Tiền tố',
|
||||||
suffix: 'Hậu tố',
|
suffix: 'Hậu tố',
|
||||||
title: 'Tiêu đề',
|
title: 'Tiêu đề',
|
||||||
jobDescriptor: 'Mô tả công việc',
|
jobDescriptor: 'Mô tả công việc',
|
||||||
jobArea: 'Lĩnh vực việc làm',
|
jobArea: 'Lĩnh vực việc làm',
|
||||||
jobType: 'Loại công việc',
|
jobType: 'Loại công việc',
|
||||||
phoneNumber: 'Số điện thoại',
|
phoneNumber: 'Số điện thoại',
|
||||||
phoneNumberFormat: 'Định dạng số điện thoại',
|
phoneNumberFormat: 'Định dạng số điện thoại',
|
||||||
phoneFormats: 'Định dạng điện thoại',
|
phoneFormats: 'Định dạng điện thoại',
|
||||||
number: 'Số',
|
number: 'Số',
|
||||||
float: 'Float',
|
float: 'Float',
|
||||||
arrayElement: 'Phân tử array',
|
arrayElement: 'Phân tử array',
|
||||||
arrayElements: 'Phân tử array',
|
arrayElements: 'Phân tử array',
|
||||||
objectElement: 'Phần tử object',
|
objectElement: 'Phần tử object',
|
||||||
uuid: 'Uuid',
|
uuid: 'Uuid',
|
||||||
boolean: 'Boolean',
|
boolean: 'Boolean',
|
||||||
image: 'Hình ảnh',
|
image: 'Hình ảnh',
|
||||||
locale: 'Ngôn ngữ',
|
locale: 'Ngôn ngữ',
|
||||||
alpha: 'Alpha',
|
alpha: 'Alpha',
|
||||||
alphaNumeric: 'Chữ và số',
|
alphaNumeric: 'Chữ và số',
|
||||||
hexaDecimal: 'Hệ thập lục phân',
|
hexaDecimal: 'Hệ thập lục phân',
|
||||||
fileName: 'File name',
|
fileName: 'File name',
|
||||||
commonFileName: 'Tên tệp chung',
|
commonFileName: 'Tên tệp chung',
|
||||||
mimeType: 'Kiểu mine',
|
mimeType: 'Kiểu mine',
|
||||||
commonFileType: 'Loại tệp chung',
|
commonFileType: 'Loại tệp chung',
|
||||||
commonFileExt: 'Phần mở rộng tệp chung',
|
commonFileExt: 'Phần mở rộng tệp chung',
|
||||||
fileType: 'Loại tệp',
|
fileType: 'Loại tệp',
|
||||||
fileExt: 'Phần mở rộng tệp',
|
fileExt: 'Phần mở rộng tệp',
|
||||||
directoryPath: 'Đường dẫn thư mục',
|
directoryPath: 'Đường dẫn thư mục',
|
||||||
filePath: 'Đường dẫn tệp',
|
filePath: 'Đường dẫn tệp',
|
||||||
semver: 'Semver',
|
semver: 'Semver',
|
||||||
manufacturer: 'Manufacturer',
|
manufacturer: 'Manufacturer',
|
||||||
model: 'Model',
|
model: 'Model',
|
||||||
fuel: 'Fuel',
|
fuel: 'Fuel',
|
||||||
vin: 'Vin'
|
vin: 'Vin'
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -0,0 +1,22 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
|
<title></title>
|
||||||
|
<script>
|
||||||
|
global = globalThis
|
||||||
|
</script>
|
||||||
|
<% if (htmlWebpackPlugin.options.nodeModules) { %>
|
||||||
|
<script>
|
||||||
|
require('module').globalPaths.push(
|
||||||
|
`<%= htmlWebpackPlugin.options.nodeModules.replace(/\\/g, '\\\\') %>`
|
||||||
|
)
|
||||||
|
</script>
|
||||||
|
<% } %>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="app"></div>
|
||||||
|
<!-- webpack builds are automatically injected -->
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -1,27 +0,0 @@
|
||||||
const webpack = require('webpack');
|
|
||||||
|
|
||||||
module.exports = {
|
|
||||||
stats: 'errors-warnings',
|
|
||||||
plugins: [
|
|
||||||
new webpack.DefinePlugin({
|
|
||||||
'process.env': {
|
|
||||||
PACKAGE_VERSION: JSON.stringify(require('./package.json').version)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
],
|
|
||||||
module: {
|
|
||||||
rules: [
|
|
||||||
{
|
|
||||||
test: /\.scss$/,
|
|
||||||
use: [
|
|
||||||
{
|
|
||||||
loader: 'sass-loader',
|
|
||||||
options: {
|
|
||||||
additionalData: '@import "@/scss/_variables.scss";'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
};
|
|
|
@ -0,0 +1,70 @@
|
||||||
|
const path = require('path');
|
||||||
|
const { CleanWebpackPlugin } = require('clean-webpack-plugin');
|
||||||
|
const ProgressPlugin = require('progress-webpack-plugin');
|
||||||
|
|
||||||
|
const { dependencies, devDependencies } = require('./package.json');
|
||||||
|
|
||||||
|
const externals = Object.keys(dependencies).concat(Object.keys(devDependencies));
|
||||||
|
const isDevMode = process.env.NODE_ENV === 'development';
|
||||||
|
const whiteListedModules = [];
|
||||||
|
|
||||||
|
module.exports = [
|
||||||
|
{ // Main
|
||||||
|
name: 'main',
|
||||||
|
mode: process.env.NODE_ENV,
|
||||||
|
devtool: isDevMode ? 'eval-source-map' : false,
|
||||||
|
entry: {
|
||||||
|
main: path.join(__dirname, './src/main/main.js')
|
||||||
|
},
|
||||||
|
target: 'electron-main',
|
||||||
|
output: {
|
||||||
|
libraryTarget: 'commonjs2',
|
||||||
|
path: path.join(__dirname, 'dist'),
|
||||||
|
filename: '[name].js'
|
||||||
|
},
|
||||||
|
node: {
|
||||||
|
global: true,
|
||||||
|
__dirname: isDevMode,
|
||||||
|
__filename: isDevMode
|
||||||
|
},
|
||||||
|
externals: externals.filter((d) => !whiteListedModules.includes(d)),
|
||||||
|
resolve: {
|
||||||
|
extensions: ['.js', '.json'],
|
||||||
|
alias: {
|
||||||
|
src: path.join(__dirname, 'src/'),
|
||||||
|
common: path.resolve(__dirname, 'src/common')
|
||||||
|
},
|
||||||
|
fallback: {
|
||||||
|
'pg-native': false,
|
||||||
|
'cpu-features': false,
|
||||||
|
cardinal: false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
plugins: [
|
||||||
|
new ProgressPlugin(true),
|
||||||
|
new CleanWebpackPlugin({ root: path.join(__dirname, 'dist') })
|
||||||
|
],
|
||||||
|
module: {
|
||||||
|
rules: [
|
||||||
|
{
|
||||||
|
test: /\.node$/,
|
||||||
|
loader: 'node-loader',
|
||||||
|
options: {
|
||||||
|
name: '[path][name].[ext]'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
test: /\.js$/,
|
||||||
|
exclude: /node_modules/,
|
||||||
|
loader: 'babel-loader'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
test: /\.(png|jpg|gif)$/,
|
||||||
|
use: [{
|
||||||
|
loader: 'file-loader'
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
];
|
|
@ -0,0 +1,147 @@
|
||||||
|
const path = require('path');
|
||||||
|
const webpack = require('webpack');
|
||||||
|
const HtmlWebpackPlugin = require('html-webpack-plugin');
|
||||||
|
const { VueLoaderPlugin } = require('vue-loader');
|
||||||
|
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
|
||||||
|
const ProgressPlugin = require('progress-webpack-plugin');
|
||||||
|
|
||||||
|
const { dependencies, devDependencies, version } = require('./package.json');
|
||||||
|
|
||||||
|
const externals = Object.keys(dependencies).concat(Object.keys(devDependencies));
|
||||||
|
const isDevMode = process.env.NODE_ENV === 'development';
|
||||||
|
const whiteListedModules = ['vue'];
|
||||||
|
|
||||||
|
const config = {
|
||||||
|
name: 'renderer',
|
||||||
|
mode: process.env.NODE_ENV,
|
||||||
|
devtool: isDevMode ? 'eval-source-map' : false,
|
||||||
|
entry: {
|
||||||
|
renderer: path.join(__dirname, './src/renderer/index.js')
|
||||||
|
},
|
||||||
|
target: 'electron-renderer',
|
||||||
|
output: {
|
||||||
|
libraryTarget: 'commonjs2',
|
||||||
|
path: path.resolve(__dirname, 'dist'),
|
||||||
|
filename: '[name].js',
|
||||||
|
publicPath: ''
|
||||||
|
},
|
||||||
|
node: {
|
||||||
|
global: true,
|
||||||
|
__dirname: isDevMode,
|
||||||
|
__filename: isDevMode
|
||||||
|
},
|
||||||
|
externals: externals.filter((d) => !whiteListedModules.includes(d)),
|
||||||
|
resolve: {
|
||||||
|
alias: {
|
||||||
|
vue$: 'vue/dist/vue.common.js',
|
||||||
|
common: path.resolve(__dirname, 'src/common'),
|
||||||
|
'@': path.resolve(__dirname, 'src/renderer')
|
||||||
|
},
|
||||||
|
extensions: ['', '.js', '.vue', '.json'],
|
||||||
|
fallback: {
|
||||||
|
fs: false,
|
||||||
|
path: false,
|
||||||
|
util: false,
|
||||||
|
crypto: false,
|
||||||
|
assert: false,
|
||||||
|
os: false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
plugins: [
|
||||||
|
new ProgressPlugin(true),
|
||||||
|
new HtmlWebpackPlugin({
|
||||||
|
excludeChunks: ['processTaskWorker'],
|
||||||
|
filename: 'index.html',
|
||||||
|
template: path.resolve(__dirname, 'src/renderer/index.ejs'),
|
||||||
|
nodeModules: isDevMode
|
||||||
|
? path.resolve(__dirname, '../node_modules')
|
||||||
|
: false
|
||||||
|
}),
|
||||||
|
new MiniCssExtractPlugin({
|
||||||
|
filename: '[name].css',
|
||||||
|
chunkFilename: '[id].css'
|
||||||
|
}),
|
||||||
|
new VueLoaderPlugin(),
|
||||||
|
new webpack.DefinePlugin({
|
||||||
|
'process.env': {
|
||||||
|
PACKAGE_VERSION: `"${version}"`
|
||||||
|
}
|
||||||
|
})
|
||||||
|
],
|
||||||
|
module: {
|
||||||
|
rules: [
|
||||||
|
{
|
||||||
|
test: /\.js$/,
|
||||||
|
use: 'babel-loader',
|
||||||
|
exclude: /node_modules/
|
||||||
|
},
|
||||||
|
{
|
||||||
|
test: /\.node$/,
|
||||||
|
use: 'node-loader'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
test: /\.vue$/,
|
||||||
|
loader: 'vue-loader'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
test: /\.s(c|a)ss$/,
|
||||||
|
use: [
|
||||||
|
{ loader: MiniCssExtractPlugin.loader },
|
||||||
|
{ loader: 'css-loader' },
|
||||||
|
{
|
||||||
|
loader: 'sass-loader',
|
||||||
|
options: {
|
||||||
|
additionalData: '@import "@/scss/_variables.scss";',
|
||||||
|
sassOptions: { quietDeps: true }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
test: /\.css$/,
|
||||||
|
use: [
|
||||||
|
{
|
||||||
|
loader: MiniCssExtractPlugin.loader,
|
||||||
|
options: {
|
||||||
|
publicPath: ''
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
loader: 'css-loader',
|
||||||
|
options: {
|
||||||
|
url: true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
test: /\.(png|jpe?g|gif|tif?f|bmp|webp|svg)(\?.*)?$/,
|
||||||
|
type: 'asset/resource',
|
||||||
|
generator: {
|
||||||
|
filename: 'images/[hash][ext][query]'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
test: /\.(woff|woff2|ttf|eot)$/,
|
||||||
|
type: 'asset',
|
||||||
|
parser: {
|
||||||
|
dataUrlCondition: {
|
||||||
|
maxSize: 8 * 1024
|
||||||
|
}
|
||||||
|
},
|
||||||
|
generator: {
|
||||||
|
filename: 'fonts/[hash][ext][query]'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
if (isDevMode) {
|
||||||
|
// any dev only config
|
||||||
|
config.plugins.push(
|
||||||
|
new webpack.HotModuleReplacementPlugin()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = config;
|