init
This commit is contained in:
24
.compilerc
Normal file
24
.compilerc
Normal file
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"env": {
|
||||
"development": {
|
||||
"application/javascript": {
|
||||
"presets": [
|
||||
["env", { "targets": { "electron": "1.4" } }],
|
||||
"react"
|
||||
],
|
||||
"plugins": ["transform-async-to-generator"],
|
||||
"sourceMaps": "inline"
|
||||
}
|
||||
},
|
||||
"production": {
|
||||
"application/javascript": {
|
||||
"presets": [
|
||||
["env", { "targets": { "electron": "1.4" } }],
|
||||
"react"
|
||||
],
|
||||
"plugins": ["transform-async-to-generator"],
|
||||
"sourceMaps": "none"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
node_modules
|
||||
out
|
||||
build
|
||||
6
.prettierrc
Normal file
6
.prettierrc
Normal file
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"singleQuote": true,
|
||||
"tabWidth": 2,
|
||||
"trailingComma": "all",
|
||||
"printWidth": 120
|
||||
}
|
||||
6
.vscode/settings.json
vendored
Normal file
6
.vscode/settings.json
vendored
Normal file
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"editor.formatOnSave": true,
|
||||
"editor.codeActionsOnSave": {
|
||||
"source.organizeImports": true
|
||||
}
|
||||
}
|
||||
2
@types/all/index.d.ts
vendored
Normal file
2
@types/all/index.d.ts
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
// for libraries that don't have types
|
||||
declare module 'this-is-a-test-module';
|
||||
6
app/app.tsx
Normal file
6
app/app.tsx
Normal file
@@ -0,0 +1,6 @@
|
||||
import React from 'react';
|
||||
import ReactDOM from 'react-dom';
|
||||
import { Home } from './components';
|
||||
import './scss/index.scss';
|
||||
|
||||
ReactDOM.render(<Home />, document.getElementById('app'));
|
||||
97
app/components/home.tsx
Normal file
97
app/components/home.tsx
Normal file
@@ -0,0 +1,97 @@
|
||||
import { WebviewTag } from 'electron';
|
||||
import React from 'react';
|
||||
import { PoeService } from '../services/poe.service';
|
||||
import { LoginWebview } from './login-webview';
|
||||
import { PriceListItem } from './price-list-item/price-list-item';
|
||||
|
||||
interface IState {
|
||||
showLogin: boolean;
|
||||
data: any;
|
||||
}
|
||||
|
||||
export class Home extends React.Component<any, IState> {
|
||||
private webview: WebviewTag;
|
||||
|
||||
constructor(props: any) {
|
||||
super(props);
|
||||
this.state = {
|
||||
showLogin: false,
|
||||
data: [],
|
||||
};
|
||||
}
|
||||
|
||||
componentDidMount() {
|
||||
this.addWebviewListeners();
|
||||
}
|
||||
|
||||
public addWebviewListeners() {
|
||||
this.webview = this.refs['webview'] as any;
|
||||
this.webview.addEventListener('dom-ready', () => {
|
||||
// this.webview.openDevTools();
|
||||
});
|
||||
|
||||
this.webview.addEventListener('ipc-message', e => {
|
||||
if (e.channel === 'html-content') {
|
||||
const htmlContents = e.args[0];
|
||||
this.handleResponse(htmlContents);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public handleResponse(res: any) {
|
||||
const json = JSON.parse(res);
|
||||
|
||||
if (json === null || json['error']) {
|
||||
this.setState({ showLogin: true });
|
||||
} else if (json.items) {
|
||||
this.setState({ showLogin: false, data: json.items });
|
||||
this.getItemPrice(json.items, 0);
|
||||
console.log(json.items);
|
||||
}
|
||||
}
|
||||
|
||||
onLogin = () => {
|
||||
this.setState({ showLogin: false });
|
||||
this.webview.reload();
|
||||
};
|
||||
|
||||
async getItemPrice(data: any[], index: number) {
|
||||
if (!data[index] || data !== this.state.data) {
|
||||
return;
|
||||
}
|
||||
|
||||
const res = await PoeService.priceCheck(data[index].typeLine);
|
||||
if (res.currency_rec && res.min_price) {
|
||||
const dataCopy: any = [...data];
|
||||
dataCopy[index].priceInfo = res;
|
||||
await new Promise(resolve => this.setState({ data: dataCopy }, resolve));
|
||||
}
|
||||
|
||||
setTimeout(() => {
|
||||
this.getItemPrice(this.state.data, index + 1);
|
||||
}, 1000);
|
||||
}
|
||||
|
||||
renderPriceList = (data: any[]) => {
|
||||
return data.map((item, index) => <PriceListItem data={item} key={index} />);
|
||||
};
|
||||
|
||||
public render() {
|
||||
const { data, showLogin } = this.state;
|
||||
|
||||
return (
|
||||
<div style={{ padding: '20px' }}>
|
||||
{showLogin && <LoginWebview onSuccess={this.onLogin} />}
|
||||
{data && this.renderPriceList(data)}
|
||||
{/* {data && <StashTab data={data} />} */}
|
||||
<webview
|
||||
ref="webview"
|
||||
partition="persist:poe"
|
||||
preload="ipc-renderer.js"
|
||||
src="https://www.pathofexile.com/character-window/get-stash-items?league=Incursion&tabs=1&tabIndex=13&accountName=DoctorCoctor"
|
||||
style={{ opacity: 0, width: '0', height: '0' }}
|
||||
/>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
}
|
||||
5
app/components/index.ts
Normal file
5
app/components/index.ts
Normal file
@@ -0,0 +1,5 @@
|
||||
export * from './home';
|
||||
export * from './login-webview';
|
||||
export * from './price-list';
|
||||
export * from './price-list-item/price-list-item';
|
||||
export * from './stash-tab';
|
||||
37
app/components/login-webview.tsx
Normal file
37
app/components/login-webview.tsx
Normal file
@@ -0,0 +1,37 @@
|
||||
import { WebviewTag } from 'electron';
|
||||
import React from 'react';
|
||||
|
||||
interface IProps {
|
||||
onSuccess: () => void;
|
||||
}
|
||||
|
||||
export class LoginWebview extends React.Component<IProps, any> {
|
||||
private webview: WebviewTag;
|
||||
|
||||
constructor(props: IProps) {
|
||||
super(props);
|
||||
}
|
||||
|
||||
componentDidMount() {
|
||||
this.webview = this.refs['webview'] as any;
|
||||
|
||||
this.webview.addEventListener('did-stop-loading', this.didStopLoading);
|
||||
}
|
||||
|
||||
didStopLoading = (event: any) => {
|
||||
if ((event.target.src as string).includes('my-account')) {
|
||||
this.props.onSuccess();
|
||||
}
|
||||
};
|
||||
|
||||
render() {
|
||||
return (
|
||||
<webview
|
||||
ref="webview"
|
||||
partition="persist:poe"
|
||||
src="https://www.pathofexile.com/login"
|
||||
style={{ height: '100%', width: '100%' }}
|
||||
/>
|
||||
);
|
||||
}
|
||||
}
|
||||
23
app/components/price-list-item/price-list-item.scss
Normal file
23
app/components/price-list-item/price-list-item.scss
Normal file
@@ -0,0 +1,23 @@
|
||||
@import '~open-color/open-color.scss';
|
||||
|
||||
.pli {
|
||||
padding: 20px;
|
||||
border-radius: 4px;
|
||||
background: $oc-gray-3;
|
||||
border-color: $oc-gray-5;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
width: 300px;
|
||||
word-break: break-word;
|
||||
|
||||
& + & {
|
||||
margin-top: 20px;
|
||||
}
|
||||
|
||||
&__img {
|
||||
max-width: 100px;
|
||||
max-height: 50px;
|
||||
padding-right: 20px;
|
||||
cursor: pointer;
|
||||
}
|
||||
}
|
||||
36
app/components/price-list-item/price-list-item.tsx
Normal file
36
app/components/price-list-item/price-list-item.tsx
Normal file
@@ -0,0 +1,36 @@
|
||||
import React from 'react';
|
||||
import './price-list-item.scss';
|
||||
|
||||
interface IProps {
|
||||
data: any;
|
||||
}
|
||||
|
||||
interface IState {
|
||||
price?: String;
|
||||
}
|
||||
|
||||
export class PriceListItem extends React.Component<IProps, IState> {
|
||||
constructor(props: IProps) {
|
||||
super(props);
|
||||
this.state = {};
|
||||
}
|
||||
|
||||
componentDidMount() {}
|
||||
|
||||
render() {
|
||||
const { data } = this.props;
|
||||
return (
|
||||
<div className="pli">
|
||||
<div style={{ width: '100px' }}>
|
||||
<img src={data.icon} className="pli__img" />
|
||||
</div>
|
||||
<div style={{ flex: 1 }}>
|
||||
<div style={{ marginBottom: '10px' }}>
|
||||
<b>{data.typeLine}</b>
|
||||
</div>
|
||||
<div>{data.priceInfo ? `${data.priceInfo.min_price} ${data.priceInfo.currency_rec}` : ''}</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
}
|
||||
25
app/components/price-list.tsx
Normal file
25
app/components/price-list.tsx
Normal file
@@ -0,0 +1,25 @@
|
||||
import React from 'react';
|
||||
import { PriceListItem } from './price-list-item/price-list-item';
|
||||
|
||||
interface IProps {
|
||||
data: any[];
|
||||
}
|
||||
|
||||
export class PriceList extends React.Component<IProps, any> {
|
||||
constructor(props: IProps) {
|
||||
super(props);
|
||||
}
|
||||
|
||||
// componentDidMount() {
|
||||
// console.log(this.props.data);
|
||||
// }
|
||||
|
||||
// componentWillReceiveProps(nextProps: IProps) {
|
||||
// if (this.props !== nextProps) {
|
||||
// // do stuff
|
||||
// console.log(nextProps);
|
||||
// }
|
||||
// }
|
||||
|
||||
render = () => this.props.data.map((value, index) => <PriceListItem data={value} key={index} />);
|
||||
}
|
||||
5
app/components/stash-tab.scss
Normal file
5
app/components/stash-tab.scss
Normal file
@@ -0,0 +1,5 @@
|
||||
.quad-tab {
|
||||
background-size: 24px 24px;
|
||||
background-image: linear-gradient(to right, grey 1px, transparent 1px),
|
||||
linear-gradient(to bottom, grey 1px, transparent 1px);
|
||||
}
|
||||
20
app/components/stash-tab.tsx
Normal file
20
app/components/stash-tab.tsx
Normal file
@@ -0,0 +1,20 @@
|
||||
import React from 'react';
|
||||
import { PoeService } from '../services/poe.service';
|
||||
import './stash-tab.scss';
|
||||
|
||||
interface IProps {
|
||||
data: any;
|
||||
}
|
||||
|
||||
export class StashTab extends React.Component<IProps, any> {
|
||||
componentDidMount() {
|
||||
console.log(this.props.data);
|
||||
PoeService.priceCheck(`Superior Laboratory Map`).then(res => {
|
||||
console.log(res);
|
||||
});
|
||||
}
|
||||
|
||||
render() {
|
||||
return <div style={{ height: '577px', width: '577px' }} className="quad-tab" />;
|
||||
}
|
||||
}
|
||||
3
app/http/http.ts
Normal file
3
app/http/http.ts
Normal file
@@ -0,0 +1,3 @@
|
||||
import axios from 'axios';
|
||||
|
||||
export const http = axios.create();
|
||||
1
app/http/index.ts
Normal file
1
app/http/index.ts
Normal file
@@ -0,0 +1 @@
|
||||
export * from './http';
|
||||
4
app/scss/index.scss
Normal file
4
app/scss/index.scss
Normal file
@@ -0,0 +1,4 @@
|
||||
@import '~font-awesome/css/font-awesome.css';
|
||||
@import '~normalize.css/normalize.css';
|
||||
@import '~open-color/open-color.scss';
|
||||
@import './style.scss';
|
||||
3
app/scss/style.scss
Normal file
3
app/scss/style.scss
Normal file
@@ -0,0 +1,3 @@
|
||||
html {
|
||||
font-family: 'Roboto Condensed', sans-serif;
|
||||
}
|
||||
23
app/services/poe.service.ts
Normal file
23
app/services/poe.service.ts
Normal file
@@ -0,0 +1,23 @@
|
||||
import { http } from '../http';
|
||||
|
||||
export class PoeService {
|
||||
public static async getStash(): Promise<any> {
|
||||
const res = await http.get(
|
||||
'https://pathofexile.com/character-window/get-stash-items?league=Incursion&tabs=1&tabIndex=6&accountName=DoctorCoctor',
|
||||
);
|
||||
return res.data;
|
||||
}
|
||||
|
||||
public static async priceCheck(item: any) {
|
||||
const res = await http.get(`https://poeprices.info/api?l=Incursion&i=${encodeURI(btoa(item))}`, {
|
||||
headers: {
|
||||
// Host: 'poeprices.info',
|
||||
// Connection: 'keep-alive',
|
||||
'Cache-Control': 'max-age=600',
|
||||
// Origin: 'https://poeprices.info',
|
||||
// Accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
|
||||
},
|
||||
});
|
||||
return res.data;
|
||||
}
|
||||
}
|
||||
13
index.html
Normal file
13
index.html
Normal file
@@ -0,0 +1,13 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title></title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div id="app"></div>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
58
index.js
Normal file
58
index.js
Normal file
@@ -0,0 +1,58 @@
|
||||
import { app, BrowserWindow } from 'electron';
|
||||
|
||||
// Handle creating/removing shortcuts on Windows when installing/uninstalling.
|
||||
if (require('electron-squirrel-startup')) {
|
||||
// eslint-disable-line global-require
|
||||
app.quit();
|
||||
}
|
||||
|
||||
// Keep a global reference of the window object, if you don't, the window will
|
||||
// be closed automatically when the JavaScript object is garbage collected.
|
||||
let mainWindow;
|
||||
|
||||
const createWindow = () => {
|
||||
// Create the browser window.
|
||||
mainWindow = new BrowserWindow({
|
||||
width: 800,
|
||||
height: 600,
|
||||
});
|
||||
|
||||
// and load the index.html of the app.
|
||||
mainWindow.loadURL(`file://${__dirname}/build/index.html`);
|
||||
|
||||
// Open the DevTools.
|
||||
mainWindow.webContents.openDevTools();
|
||||
|
||||
// Emitted when the window is closed.
|
||||
mainWindow.on('closed', () => {
|
||||
// Dereference the window object, usually you would store windows
|
||||
// in an array if your app supports multi windows, this is the time
|
||||
// when you should delete the corresponding element.
|
||||
mainWindow = null;
|
||||
});
|
||||
};
|
||||
|
||||
// This method will be called when Electron has finished
|
||||
// initialization and is ready to create browser windows.
|
||||
// Some APIs can only be used after this event occurs.
|
||||
app.on('ready', createWindow);
|
||||
|
||||
// Quit when all windows are closed.
|
||||
app.on('window-all-closed', () => {
|
||||
// On OS X it is common for applications and their menu bar
|
||||
// to stay active until the user quits explicitly with Cmd + Q
|
||||
if (process.platform !== 'darwin') {
|
||||
app.quit();
|
||||
}
|
||||
});
|
||||
|
||||
app.on('activate', () => {
|
||||
// On OS X it's common to re-create a window in the app when the
|
||||
// dock icon is clicked and there are no other windows open.
|
||||
if (mainWindow === null) {
|
||||
createWindow();
|
||||
}
|
||||
});
|
||||
|
||||
// In this file you can include the rest of your app's specific main process
|
||||
// code. You can also put them in separate files and import them here.
|
||||
5
ipc-renderer.js
Normal file
5
ipc-renderer.js
Normal file
@@ -0,0 +1,5 @@
|
||||
// this is used to communicate from inside the webview
|
||||
var ipcRenderer = require('electron').ipcRenderer;
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
ipcRenderer.sendToHost('html-content', document.querySelector('pre').innerHTML);
|
||||
});
|
||||
13645
package-lock.json
generated
Normal file
13645
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
88
package.json
Normal file
88
package.json
Normal file
@@ -0,0 +1,88 @@
|
||||
{
|
||||
"name": "poe-auto-pricer",
|
||||
"productName": "poe-auto-pricer",
|
||||
"version": "1.0.0",
|
||||
"description": "My Electron application description",
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
"start": "electron-forge start",
|
||||
"package": "electron-forge package",
|
||||
"make": "electron-forge make",
|
||||
"publish": "electron-forge publish",
|
||||
"watch": "webpack --progress --colors --watch --mode development"
|
||||
},
|
||||
"keywords": [],
|
||||
"author": "Mitchell",
|
||||
"license": "MIT",
|
||||
"config": {
|
||||
"forge": {
|
||||
"make_targets": {
|
||||
"win32": [
|
||||
"squirrel"
|
||||
],
|
||||
"darwin": [
|
||||
"zip"
|
||||
],
|
||||
"linux": [
|
||||
"deb",
|
||||
"rpm"
|
||||
]
|
||||
},
|
||||
"electronPackagerConfig": {
|
||||
"packageManager": "npm"
|
||||
},
|
||||
"electronWinstallerConfig": {
|
||||
"name": "poe_auto_pricer"
|
||||
},
|
||||
"electronInstallerDebian": {},
|
||||
"electronInstallerRedhat": {},
|
||||
"github_repository": {
|
||||
"owner": "",
|
||||
"name": ""
|
||||
},
|
||||
"windowsStoreConfig": {
|
||||
"packageName": "",
|
||||
"name": "poeautopricer"
|
||||
}
|
||||
}
|
||||
},
|
||||
"dependencies": {
|
||||
"@types/react": "^16.4.9",
|
||||
"@types/react-dom": "^16.0.7",
|
||||
"autoprefixer": "^9.1.1",
|
||||
"axios": "^0.18.0",
|
||||
"babel-core": "^6.26.3",
|
||||
"babel-loader": "^7.1.5",
|
||||
"babel-polyfill": "^6.26.0",
|
||||
"clean-webpack-plugin": "^0.1.19",
|
||||
"copy-webpack-plugin": "^4.5.2",
|
||||
"css-loader": "^1.0.0",
|
||||
"electron": "^2.0.7",
|
||||
"electron-compile": "^6.4.3",
|
||||
"electron-squirrel-startup": "^1.0.0",
|
||||
"file-loader": "^1.1.11",
|
||||
"font-awesome": "^4.7.0",
|
||||
"html-webpack-plugin": "^3.2.0",
|
||||
"node-sass": "^4.9.3",
|
||||
"normalize.css": "^8.0.0",
|
||||
"open-color": "^1.6.3",
|
||||
"postcss-loader": "^3.0.0",
|
||||
"react": "^16.4.2",
|
||||
"react-dom": "^16.4.2",
|
||||
"sass-loader": "^7.1.0",
|
||||
"style-loader": "^0.22.1",
|
||||
"ts-loader": "^4.4.2",
|
||||
"tslint": "^5.11.0",
|
||||
"tslint-config-airbnb": "^5.9.2",
|
||||
"typescript": "^3.0.1",
|
||||
"webpack": "^4.16.5",
|
||||
"webpack-cli": "^3.1.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"babel-plugin-transform-async-to-generator": "^6.24.1",
|
||||
"babel-preset-env": "^1.7.0",
|
||||
"babel-preset-react": "^6.24.1",
|
||||
"electron-forge": "^5.2.2",
|
||||
"electron-prebuilt-compile": "2.0.7"
|
||||
}
|
||||
}
|
||||
10
postcss.config.js
Normal file
10
postcss.config.js
Normal file
@@ -0,0 +1,10 @@
|
||||
const browserList = [
|
||||
'last 3 versions',
|
||||
'> 1%'
|
||||
];
|
||||
|
||||
module.exports = {
|
||||
plugins: [
|
||||
require('autoprefixer')(browserList)
|
||||
]
|
||||
};
|
||||
25
tsconfig.json
Normal file
25
tsconfig.json
Normal file
@@ -0,0 +1,25 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"experimentalDecorators": true,
|
||||
"target": "es2015",
|
||||
"module": "es2015",
|
||||
"moduleResolution": "node",
|
||||
"jsx": "react",
|
||||
"allowSyntheticDefaultImports": true,
|
||||
"noImplicitAny": true,
|
||||
"noImplicitThis": true,
|
||||
"strictNullChecks": true,
|
||||
"preserveConstEnums": true,
|
||||
"allowJs": false,
|
||||
"sourceMap": true,
|
||||
"noImplicitReturns": true,
|
||||
"noUnusedParameters": true,
|
||||
"noUnusedLocals": true,
|
||||
"alwaysStrict": true,
|
||||
"typeRoots": ["./node_modules/@types", "./@types"]
|
||||
},
|
||||
"filesGlob": ["typings/index.d.ts", "src/**/*.ts", "src/**/*.tsx"],
|
||||
"include": ["app"],
|
||||
"exclude": ["android", "ios", "build", "node_modules"],
|
||||
"compileOnSave": false
|
||||
}
|
||||
11
tslint.json
Normal file
11
tslint.json
Normal file
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"extends": "tslint-config-airbnb",
|
||||
"rules": {
|
||||
"semicolon": [true, "always", "ignore-bound-class-methods"],
|
||||
"max-line-length": [true, 120],
|
||||
"variable-name": [true, "ban-keywords", "check-format", "allow-pascal-case"],
|
||||
"import-name": false,
|
||||
"ter-arrow-parens": [true, "as-needed"],
|
||||
"align": [true, "parameters", "statements"]
|
||||
}
|
||||
}
|
||||
68
webpack.config.js
Normal file
68
webpack.config.js
Normal file
@@ -0,0 +1,68 @@
|
||||
const CleanWebpackPlugin = require('clean-webpack-plugin');
|
||||
const HtmlWebpackPlugin = require('html-webpack-plugin');
|
||||
const path = require('path');
|
||||
const webpack = require('webpack');
|
||||
const CopyWebpackPlugin = require('copy-webpack-plugin');
|
||||
|
||||
module.exports = {
|
||||
entry: {
|
||||
app: ['babel-polyfill', './app/app.tsx'],
|
||||
},
|
||||
target: 'electron-renderer',
|
||||
output: {
|
||||
path: path.resolve(__dirname, './build'),
|
||||
filename: '[name].[hash].js',
|
||||
},
|
||||
resolve: {
|
||||
extensions: ['.ts', '.tsx', '.js'],
|
||||
},
|
||||
module: {
|
||||
rules: [
|
||||
{
|
||||
test: /\.(js|jsx)$/,
|
||||
use: ['babel-loader'],
|
||||
},
|
||||
{
|
||||
test: /\.ts(x)?$/,
|
||||
use: ['babel-loader', 'ts-loader'],
|
||||
},
|
||||
{
|
||||
test: /\.scss$/,
|
||||
use: ['style-loader', 'css-loader', 'postcss-loader', 'sass-loader'],
|
||||
},
|
||||
{
|
||||
test: /\.css$/,
|
||||
use: ['style-loader', 'css-loader'],
|
||||
},
|
||||
{
|
||||
test: /\.woff2?$|\.ttf$|\.eot$|\.svg$/,
|
||||
use: [
|
||||
{
|
||||
loader: 'file-loader',
|
||||
options: {
|
||||
name: 'static/[name].[hash].[ext]',
|
||||
publicPath: './.',
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
optimization: {
|
||||
occurrenceOrder: true,
|
||||
splitChunks: {
|
||||
chunks: 'all',
|
||||
},
|
||||
},
|
||||
plugins: [
|
||||
new CleanWebpackPlugin(['./build'], {
|
||||
verbose: true,
|
||||
}),
|
||||
new HtmlWebpackPlugin({
|
||||
filename: 'index.html',
|
||||
template: './index.html',
|
||||
}),
|
||||
new webpack.HotModuleReplacementPlugin(),
|
||||
new CopyWebpackPlugin(['./ipc-renderer.js']),
|
||||
],
|
||||
};
|
||||
Reference in New Issue
Block a user