mirror of
https://github.com/mgerb/go-discord-bot
synced 2026-01-09 08:32:48 +00:00
build: eslint
This commit is contained in:
18
.vscode/launch.json
vendored
18
.vscode/launch.json
vendored
@@ -1,18 +0,0 @@
|
|||||||
{
|
|
||||||
"version": "0.2.0",
|
|
||||||
"configurations": [
|
|
||||||
{
|
|
||||||
"name": "Launch",
|
|
||||||
"type": "go",
|
|
||||||
"request": "launch",
|
|
||||||
"mode": "debug",
|
|
||||||
"remotePath": "",
|
|
||||||
"port": 2345,
|
|
||||||
"host": "127.0.0.1",
|
|
||||||
"program": "${workspaceRoot}",
|
|
||||||
"env": {},
|
|
||||||
"args": [],
|
|
||||||
"showLog": true
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
6
.vscode/settings.json
vendored
6
.vscode/settings.json
vendored
@@ -1,6 +0,0 @@
|
|||||||
{
|
|
||||||
"editor.formatOnSave": true,
|
|
||||||
"editor.codeActionsOnSave": {
|
|
||||||
"source.organizeImports": true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
25
client/.eslintrc.js
Normal file
25
client/.eslintrc.js
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
module.exports = {
|
||||||
|
"env": {
|
||||||
|
"browser": true,
|
||||||
|
"es2021": true
|
||||||
|
},
|
||||||
|
"extends": [
|
||||||
|
"eslint:recommended",
|
||||||
|
"plugin:react/recommended",
|
||||||
|
"plugin:@typescript-eslint/recommended"
|
||||||
|
],
|
||||||
|
"parser": "@typescript-eslint/parser",
|
||||||
|
"parserOptions": {
|
||||||
|
"ecmaFeatures": {
|
||||||
|
"jsx": true
|
||||||
|
},
|
||||||
|
"ecmaVersion": "latest",
|
||||||
|
"sourceType": "module"
|
||||||
|
},
|
||||||
|
"plugins": [
|
||||||
|
"react",
|
||||||
|
"@typescript-eslint"
|
||||||
|
],
|
||||||
|
"rules": {
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -18,7 +18,7 @@ import './scss/index.scss';
|
|||||||
import { rootStoreInstance } from './stores';
|
import { rootStoreInstance } from './stores';
|
||||||
import { Wrapper } from './wrapper';
|
import { Wrapper } from './wrapper';
|
||||||
|
|
||||||
const App: any = (): any => {
|
const App = () => {
|
||||||
return (
|
return (
|
||||||
<BrowserRouter>
|
<BrowserRouter>
|
||||||
<Provider {...rootStoreInstance}>
|
<Provider {...rootStoreInstance}>
|
||||||
@@ -41,4 +41,4 @@ const App: any = (): any => {
|
|||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
ReactDOM.render((<App />) as any, document.getElementById('app'));
|
ReactDOM.render(<App />, document.getElementById('app'));
|
||||||
|
|||||||
@@ -11,9 +11,7 @@ interface IProps {
|
|||||||
onPlayDiscord: (sound: SoundType) => void;
|
onPlayDiscord: (sound: SoundType) => void;
|
||||||
}
|
}
|
||||||
|
|
||||||
interface IState {}
|
export class ClipPlayerControl extends React.Component<IProps, unknown> {
|
||||||
|
|
||||||
export class ClipPlayerControl extends React.Component<IProps, IState> {
|
|
||||||
checkExtension(extension: string) {
|
checkExtension(extension: string) {
|
||||||
switch (extension) {
|
switch (extension) {
|
||||||
case 'wav':
|
case 'wav':
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ interface IProps {
|
|||||||
onButtonClick: () => void;
|
onButtonClick: () => void;
|
||||||
}
|
}
|
||||||
|
|
||||||
export class Header extends React.Component<IProps, any> {
|
export class Header extends React.Component<IProps, unknown> {
|
||||||
constructor(props: IProps) {
|
constructor(props: IProps) {
|
||||||
super(props);
|
super(props);
|
||||||
}
|
}
|
||||||
@@ -19,7 +19,12 @@ export class Header extends React.Component<IProps, any> {
|
|||||||
</button>
|
</button>
|
||||||
<h2 style={{ margin: 0 }}>Sound Bot</h2>
|
<h2 style={{ margin: 0 }}>Sound Bot</h2>
|
||||||
</div>
|
</div>
|
||||||
<a href="https://github.com/mgerb/go-discord-bot" className="fa fa-lg fa-github" target="_blank" />
|
<a
|
||||||
|
rel="noreferrer"
|
||||||
|
href="https://github.com/mgerb/go-discord-bot"
|
||||||
|
className="fa fa-lg fa-github"
|
||||||
|
target="_blank"
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ export class Navbar extends React.Component<Props, State> {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
renderNavLink = (title: string, to: string, params?: any) => {
|
renderNavLink = (title: string, to: string, params?: unknown) => {
|
||||||
return (
|
return (
|
||||||
<NavLink
|
<NavLink
|
||||||
{...params}
|
{...params}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
import Dropzone from 'react-dropzone';
|
import Dropzone, { ImageFile } from 'react-dropzone';
|
||||||
import { axios } from '../../services';
|
import { axios } from '../../services';
|
||||||
import './uploader.scss';
|
import './uploader.scss';
|
||||||
|
|
||||||
@@ -27,21 +27,21 @@ export class Uploader extends React.Component<IProps, IState> {
|
|||||||
headers: {
|
headers: {
|
||||||
'Content-Type': 'multipart/form-data',
|
'Content-Type': 'multipart/form-data',
|
||||||
},
|
},
|
||||||
onUploadProgress: (progressEvent: any) => {
|
onUploadProgress: (progressEvent: { loaded: number; total: number }) => {
|
||||||
this.setState({
|
this.setState({
|
||||||
percentCompleted: Math.round((progressEvent.loaded * 100) / progressEvent.total),
|
percentCompleted: Math.round((progressEvent.loaded * 100) / progressEvent.total),
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
onDrop = (acceptedFiles: any) => {
|
private onDrop = (acceptedFiles: ImageFile[]) => {
|
||||||
if (acceptedFiles.length > 0) {
|
if (acceptedFiles.length > 0) {
|
||||||
this.uploadFile(acceptedFiles[0]);
|
this.uploadFile(acceptedFiles[0]);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
uploadFile(file: any) {
|
private uploadFile(file: ImageFile) {
|
||||||
let formData = new FormData();
|
const formData = new FormData();
|
||||||
formData.append('name', file.name);
|
formData.append('name', file.name);
|
||||||
formData.append('file', file);
|
formData.append('file', file);
|
||||||
|
|
||||||
@@ -56,7 +56,7 @@ export class Uploader extends React.Component<IProps, IState> {
|
|||||||
|
|
||||||
this.props.onComplete();
|
this.props.onComplete();
|
||||||
})
|
})
|
||||||
.catch(err => {
|
.catch((err) => {
|
||||||
this.setState({
|
this.setState({
|
||||||
percentCompleted: 0,
|
percentCompleted: 0,
|
||||||
uploaded: false,
|
uploaded: false,
|
||||||
@@ -65,7 +65,7 @@ export class Uploader extends React.Component<IProps, IState> {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
render() {
|
public render() {
|
||||||
return (
|
return (
|
||||||
<Dropzone
|
<Dropzone
|
||||||
className="dropzone"
|
className="dropzone"
|
||||||
|
|||||||
@@ -3,14 +3,12 @@ import { SoundList } from '../../components';
|
|||||||
import { SoundType } from '../../model';
|
import { SoundType } from '../../model';
|
||||||
import { axios } from '../../services';
|
import { axios } from '../../services';
|
||||||
|
|
||||||
interface Props {}
|
|
||||||
|
|
||||||
interface State {
|
interface State {
|
||||||
clipList: SoundType[];
|
clipList: SoundType[];
|
||||||
}
|
}
|
||||||
|
|
||||||
export class Clips extends React.Component<Props, State> {
|
export class Clips extends React.Component<unknown, State> {
|
||||||
constructor(props: Props) {
|
constructor(props: unknown) {
|
||||||
super(props);
|
super(props);
|
||||||
this.state = {
|
this.state = {
|
||||||
clipList: [],
|
clipList: [],
|
||||||
@@ -29,6 +27,7 @@ export class Clips extends React.Component<Props, State> {
|
|||||||
clipList: response.data,
|
clipList: response.data,
|
||||||
});
|
});
|
||||||
})
|
})
|
||||||
|
/* eslint-disable-next-line */
|
||||||
.catch((error: any) => {
|
.catch((error: any) => {
|
||||||
console.error(error.response.data);
|
console.error(error.response.data);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -2,8 +2,6 @@ import React from 'react';
|
|||||||
import { axios } from '../../services';
|
import { axios } from '../../services';
|
||||||
import './downloader.scss';
|
import './downloader.scss';
|
||||||
|
|
||||||
interface Props {}
|
|
||||||
|
|
||||||
interface State {
|
interface State {
|
||||||
fileType: string;
|
fileType: string;
|
||||||
url: string;
|
url: string;
|
||||||
@@ -14,8 +12,8 @@ interface State {
|
|||||||
dataLoaded: boolean;
|
dataLoaded: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
export class Downloader extends React.Component<Props, State> {
|
export class Downloader extends React.Component<unknown, State> {
|
||||||
constructor(props: Props) {
|
constructor(props: unknown) {
|
||||||
super(props);
|
super(props);
|
||||||
this.state = {
|
this.state = {
|
||||||
fileType: 'mp3',
|
fileType: 'mp3',
|
||||||
@@ -51,7 +49,7 @@ export class Downloader extends React.Component<Props, State> {
|
|||||||
url: this.state.url,
|
url: this.state.url,
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
.then(res => {
|
.then((res) => {
|
||||||
this.setState({
|
this.setState({
|
||||||
dataLoaded: true,
|
dataLoaded: true,
|
||||||
dataLoading: false,
|
dataLoading: false,
|
||||||
@@ -77,7 +75,7 @@ export class Downloader extends React.Component<Props, State> {
|
|||||||
placeholder="Enter Youtube URL"
|
placeholder="Enter Youtube URL"
|
||||||
className="input downloader__input"
|
className="input downloader__input"
|
||||||
value={this.state.url}
|
value={this.state.url}
|
||||||
onChange={event => this.setState({ url: event.target.value })}
|
onChange={(event) => this.setState({ url: event.target.value })}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<div style={{ marginBottom: '10px' }}>
|
<div style={{ marginBottom: '10px' }}>
|
||||||
|
|||||||
@@ -1,23 +1,18 @@
|
|||||||
import queryString from 'query-string';
|
import queryString, { ParsedQuery } from 'query-string';
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { RouteComponentProps } from 'react-router-dom';
|
import { RouteComponentProps } from 'react-router-dom';
|
||||||
import { axios, StorageService } from '../../services';
|
import { axios, StorageService } from '../../services';
|
||||||
|
|
||||||
interface Props extends RouteComponentProps<any> {}
|
export class Oauth extends React.Component<RouteComponentProps<unknown>, unknown> {
|
||||||
|
constructor(props: RouteComponentProps<unknown>) {
|
||||||
interface State {}
|
|
||||||
|
|
||||||
export class Oauth extends React.Component<Props, State> {
|
|
||||||
constructor(props: Props) {
|
|
||||||
super(props);
|
super(props);
|
||||||
}
|
}
|
||||||
|
|
||||||
componentDidMount() {
|
componentDidMount() {
|
||||||
const params: any = queryString.parse(this.props.location.search);
|
const params: ParsedQuery<string> = queryString.parse(this.props.location.search);
|
||||||
|
|
||||||
if (params['code']) {
|
if (params['code']) {
|
||||||
// do stuff here
|
this.fetchOauth(params['code'] as string);
|
||||||
this.fetchOauth(params['code']);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ interface State {
|
|||||||
@inject('appStore')
|
@inject('appStore')
|
||||||
@observer
|
@observer
|
||||||
export class Soundboard extends React.Component<Props, State> {
|
export class Soundboard extends React.Component<Props, State> {
|
||||||
private soundListCache: any;
|
private soundListCache: SoundType[];
|
||||||
|
|
||||||
constructor(props: Props) {
|
constructor(props: Props) {
|
||||||
super(props);
|
super(props);
|
||||||
@@ -46,6 +46,7 @@ export class Soundboard extends React.Component<Props, State> {
|
|||||||
soundList: response.data,
|
soundList: response.data,
|
||||||
});
|
});
|
||||||
})
|
})
|
||||||
|
// eslint-disable-next-line
|
||||||
.catch((error: any) => {
|
.catch((error: any) => {
|
||||||
console.error(error.response.data);
|
console.error(error.response.data);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -4,8 +4,7 @@ import { HorizontalBar } from 'react-chartjs-2';
|
|||||||
import { ISound } from '../../model';
|
import { ISound } from '../../model';
|
||||||
import { axios, SoundService } from '../../services';
|
import { axios, SoundService } from '../../services';
|
||||||
import './stats.scss';
|
import './stats.scss';
|
||||||
|
import { AxiosResponse } from 'axios';
|
||||||
interface IProps {}
|
|
||||||
|
|
||||||
interface IState {
|
interface IState {
|
||||||
data: {
|
data: {
|
||||||
@@ -19,8 +18,8 @@ interface IState {
|
|||||||
* a page to show discord chat statistics
|
* a page to show discord chat statistics
|
||||||
* currently keeps track of number messages that contain external links
|
* currently keeps track of number messages that contain external links
|
||||||
*/
|
*/
|
||||||
export class Stats extends Component<IProps, IState> {
|
export class Stats extends Component<unknown, IState> {
|
||||||
constructor(props: any) {
|
constructor(props: unknown) {
|
||||||
super(props);
|
super(props);
|
||||||
this.state = {
|
this.state = {
|
||||||
data: [],
|
data: [],
|
||||||
@@ -30,18 +29,18 @@ export class Stats extends Component<IProps, IState> {
|
|||||||
|
|
||||||
componentDidMount() {
|
componentDidMount() {
|
||||||
this.getdata();
|
this.getdata();
|
||||||
SoundService.getSounds().then(sounds => {
|
SoundService.getSounds().then((sounds) => {
|
||||||
this.setState({ sounds });
|
this.setState({ sounds });
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
async getdata() {
|
async getdata() {
|
||||||
const messages = await axios.get('/api/logger/linkedmessages');
|
const messages: AxiosResponse<{ [key: string]: number }> = await axios.get('/api/logger/linkedmessages');
|
||||||
const data: any = chain(messages.data)
|
const data = chain(messages.data)
|
||||||
.map((v, k) => {
|
.map((v, k) => {
|
||||||
return { username: k, count: v };
|
return { username: k, count: v };
|
||||||
})
|
})
|
||||||
.orderBy(v => v.count, 'desc')
|
.orderBy((v) => v.count, 'desc')
|
||||||
.slice(0, 10)
|
.slice(0, 10)
|
||||||
.value();
|
.value();
|
||||||
|
|
||||||
@@ -49,8 +48,8 @@ export class Stats extends Component<IProps, IState> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
const data: any = {
|
const data = {
|
||||||
labels: map(this.state.data, v => v.username),
|
labels: map(this.state.data, (v) => v.username),
|
||||||
datasets: [
|
datasets: [
|
||||||
{
|
{
|
||||||
label: 'Count',
|
label: 'Count',
|
||||||
@@ -59,7 +58,7 @@ export class Stats extends Component<IProps, IState> {
|
|||||||
borderWidth: 1,
|
borderWidth: 1,
|
||||||
hoverBackgroundColor: 'rgba(114,137,218, 0.7)',
|
hoverBackgroundColor: 'rgba(114,137,218, 0.7)',
|
||||||
hoverBorderColor: 'rgba(114,137,218, 1)',
|
hoverBorderColor: 'rgba(114,137,218, 1)',
|
||||||
data: map(this.state.data, v => v.count),
|
data: map(this.state.data, (v) => v.count),
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
options: {
|
options: {
|
||||||
|
|||||||
@@ -2,14 +2,12 @@ import React from 'react';
|
|||||||
import { IUserEventLog } from '../../model';
|
import { IUserEventLog } from '../../model';
|
||||||
import { UserEventLogService } from '../../services';
|
import { UserEventLogService } from '../../services';
|
||||||
|
|
||||||
interface IProps {}
|
|
||||||
|
|
||||||
interface IState {
|
interface IState {
|
||||||
userEventLogs: IUserEventLog[];
|
userEventLogs: IUserEventLog[];
|
||||||
}
|
}
|
||||||
|
|
||||||
export class UserEventLog extends React.Component<IProps, IState> {
|
export class UserEventLog extends React.Component<unknown, IState> {
|
||||||
constructor(props: IProps) {
|
constructor(props: unknown) {
|
||||||
super(props);
|
super(props);
|
||||||
this.state = {
|
this.state = {
|
||||||
userEventLogs: [],
|
userEventLogs: [],
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import React from 'react';
|
import React, { ChangeEvent, FormEvent } from 'react';
|
||||||
import { IUser } from '../../model';
|
import { IUser } from '../../model';
|
||||||
import { UserService } from '../../services/user.service';
|
import { UserService } from '../../services/user.service';
|
||||||
|
|
||||||
@@ -7,8 +7,8 @@ interface IState {
|
|||||||
showSavedMessage: boolean;
|
showSavedMessage: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
export class Users extends React.Component<any, IState> {
|
export class Users extends React.Component<unknown, IState> {
|
||||||
constructor(props: any) {
|
constructor(props: unknown) {
|
||||||
super(props);
|
super(props);
|
||||||
this.state = {
|
this.state = {
|
||||||
users: [],
|
users: [],
|
||||||
@@ -22,10 +22,10 @@ export class Users extends React.Component<any, IState> {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
onUserChange = (type: 'permissions' | 'voice_join_sound', event: any, index: number) => {
|
onUserChange = (type: 'permissions' | 'voice_join_sound', event: ChangeEvent<HTMLInputElement>, index: number) => {
|
||||||
this.setState({ showSavedMessage: false });
|
this.setState({ showSavedMessage: false });
|
||||||
|
|
||||||
let users = [...this.state.users];
|
const users = [...this.state.users];
|
||||||
const val = type === 'permissions' ? parseInt(event.target.value) : event.target.value;
|
const val = type === 'permissions' ? parseInt(event.target.value) : event.target.value;
|
||||||
users[index] = {
|
users[index] = {
|
||||||
...users[index],
|
...users[index],
|
||||||
@@ -64,7 +64,7 @@ export class Users extends React.Component<any, IState> {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
save = (event: any) => {
|
save = (event: FormEvent<HTMLFormElement>) => {
|
||||||
this.setState({ showSavedMessage: false });
|
this.setState({ showSavedMessage: false });
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
UserService.putUsers(this.state.users).then((users: IUser[]) => {
|
UserService.putUsers(this.state.users).then((users: IUser[]) => {
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ export class VideoArchive extends React.Component<IProps, IState> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
onSubmit = async (e: any) => {
|
onSubmit = async (e: React.FormEvent<HTMLFormElement>) => {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
const { url } = this.state;
|
const { url } = this.state;
|
||||||
this.setState({ error: undefined });
|
this.setState({ error: undefined });
|
||||||
@@ -65,7 +65,7 @@ export class VideoArchive extends React.Component<IProps, IState> {
|
|||||||
className="input video-archive__text-input"
|
className="input video-archive__text-input"
|
||||||
placeholder="Enter Youtube URL or ID..."
|
placeholder="Enter Youtube URL or ID..."
|
||||||
value={url}
|
value={url}
|
||||||
onChange={e => this.setState({ url: e.target.value })}
|
onChange={(e) => this.setState({ url: e.target.value })}
|
||||||
/>
|
/>
|
||||||
<input type="submit" className="button button--primary" style={{ marginLeft: '10px' }} />
|
<input type="submit" className="button button--primary" style={{ marginLeft: '10px' }} />
|
||||||
{error && (
|
{error && (
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ export class ArchiveService {
|
|||||||
return _.orderBy(data, 'created_at', ['desc']);
|
return _.orderBy(data, 'created_at', ['desc']);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static postVideoArchive(data: any): Promise<any> {
|
public static postVideoArchive(data: { url: string }): Promise<unknown> {
|
||||||
return axios.post('/api/video-archive', data);
|
return axios.post('/api/video-archive', data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import { ISound, SoundListType, SoundType } from '../model';
|
import { ISound, SoundListType, SoundType } from '../model';
|
||||||
import { axios } from './axios.service';
|
import { axios } from './axios.service';
|
||||||
|
|
||||||
const playSound = (sound: SoundType): Promise<any> => {
|
const playSound = (sound: SoundType): Promise<unknown> => {
|
||||||
return axios.post('/api/sound/play', { name: sound.name });
|
return axios.post('/api/sound/play', { name: sound.name });
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ import { Util } from '../util';
|
|||||||
|
|
||||||
export class AppStore {
|
export class AppStore {
|
||||||
@observable
|
@observable
|
||||||
public navbarOpen: boolean = false;
|
public navbarOpen = false;
|
||||||
@observable
|
@observable
|
||||||
public jwt?: string;
|
public jwt?: string;
|
||||||
@observable
|
@observable
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import './wrapper.scss';
|
|||||||
|
|
||||||
export const Wrapper = inject('appStore')(
|
export const Wrapper = inject('appStore')(
|
||||||
withRouter(
|
withRouter(
|
||||||
|
// eslint-disable-next-line
|
||||||
observer(({ appStore, children }: any) => {
|
observer(({ appStore, children }: any) => {
|
||||||
const openClass = appStore.navbarOpen ? 'wrapper--open' : '';
|
const openClass = appStore.navbarOpen ? 'wrapper--open' : '';
|
||||||
const onNavClick = () => {
|
const onNavClick = () => {
|
||||||
|
|||||||
4547
client/package-lock.json
generated
4547
client/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -62,5 +62,11 @@
|
|||||||
"webpack": "^4.43.0",
|
"webpack": "^4.43.0",
|
||||||
"webpack-cli": "^3.3.11",
|
"webpack-cli": "^3.3.11",
|
||||||
"webpack-dev-server": "^3.11.0"
|
"webpack-dev-server": "^3.11.0"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@typescript-eslint/eslint-plugin": "^5.17.0",
|
||||||
|
"@typescript-eslint/parser": "^5.17.0",
|
||||||
|
"eslint": "^8.12.0",
|
||||||
|
"eslint-plugin-react": "^7.29.4"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user