Commit 8fd6747f authored by 神楽坂玲奈's avatar 神楽坂玲奈

update bootstrap & ygopro deck group init

parent 231a79bf
Pipeline #5346 failed with stages
in 6 minutes
...@@ -2,22 +2,22 @@ ...@@ -2,22 +2,22 @@
<img *ngIf="currentApp.cover" class="cover rounded" [src]="currentApp.cover"> <img *ngIf="currentApp.cover" class="cover rounded" [src]="currentApp.cover">
<div id="right"> <div id="right">
<h1>{{currentApp.name}}</h1> <h1>{{currentApp.name}}</h1>
<div id="time">您已玩了 2564 小时</div> <!-- <div id="time">您已玩了 2564 小时</div>-->
<!--应用未购买--> <!--应用未购买-->
<div *ngIf="!currentApp.isBought()"> <div *ngIf="!currentApp.isBought()">
<button i18n type="button" class="btn btn-primary btn-sm" data-toggle="modal" data-target="#purchase-modal">{{currentApp.price.cny | currency:'CNY':true}} 购买</button> <button i18n type="button" class="btn btn-primary btn-sm" data-bs-toggle="modal" data-bs-target="#purchase-modal">{{currentApp.price.cny | currency:'CNY':true}} 购买</button>
<button i18n type="button" (click)="updateInstallOption(currentApp)" class="btn btn-secondary btn-sm" data-toggle="modal" data-target="#install-modal">安装试玩版</button> <button i18n type="button" (click)="updateInstallOption(currentApp)" class="btn btn-secondary btn-sm" data-bs-toggle="modal" data-bs-target="#install-modal">安装试玩版</button>
<!--<button i18n (click)="updateInstallOption(currentApp)" type="button" class="btn btn-primary btn-sm" data-toggle="modal" data-target="#install-modal">我已经购买过</button>--> <!--<button i18n (click)="updateInstallOption(currentApp)" type="button" class="btn btn-primary btn-sm" data-bs-toggle="modal" data-bs-target="#install-modal">我已经购买过</button>-->
</div> </div>
<!--应用已购买,未安装--> <!--应用已购买,未安装-->
<div *ngIf="currentApp.isBought() && !currentApp.isInstalled()" class="i-b"> <div *ngIf="currentApp.isBought() && !currentApp.isInstalled()" class="i-b">
<button i18n (click)="updateInstallOption(currentApp)" type="button" class="btn btn-primary btn-sm" data-toggle="modal" data-target="#install-modal">安装</button> <button i18n (click)="updateInstallOption(currentApp)" type="button" class="btn btn-primary btn-sm" data-bs-toggle="modal" data-bs-target="#install-modal">安装</button>
<button i18n *ngIf="currentApp.runnable()" (click)="updateInstallOption(currentApp)" type="button" class="btn btn-secondary btn-sm" data-toggle="modal" data-target="#import-modal">导入</button> <button i18n *ngIf="currentApp.runnable()" (click)="updateInstallOption(currentApp)" type="button" class="btn btn-secondary btn-sm" data-bs-toggle="modal" data-bs-target="#import-modal">导入</button>
</div> </div>
<!--应用变更中--> <!--应用变更中-->
...@@ -52,7 +52,7 @@ ...@@ -52,7 +52,7 @@
<!--<div class="input-group-btn" style="flex-direction: row">--> <!--<div class="input-group-btn" style="flex-direction: row">-->
<!--<button i18n *ngIf="!appsService.connections.get(currentApp)" [disabled]="!appsService.allReady(currentApp)" (click)="appsService.network(currentApp, currentApp.network.servers[0])" type="button" class="btn btn-secondary btn-sm">联机</button>--> <!--<button i18n *ngIf="!appsService.connections.get(currentApp)" [disabled]="!appsService.allReady(currentApp)" (click)="appsService.network(currentApp, currentApp.network.servers[0])" type="button" class="btn btn-secondary btn-sm">联机</button>-->
<!--<button i18n *ngIf="appsService.connections.get(currentApp)" (click)="copy(appsService.connections.get(currentApp).address)" [disabled]="!appsService.connections.get(currentApp).address" type="button" class="btn btn-secondary btn-sm">复制</button>--> <!--<button i18n *ngIf="appsService.connections.get(currentApp)" (click)="copy(appsService.connections.get(currentApp).address)" [disabled]="!appsService.connections.get(currentApp).address" type="button" class="btn btn-secondary btn-sm">复制</button>-->
<!--<button type="button" class="btn btn-sm btn-secondary dropdown-toggle dropdown-toggle-split" data-toggle="dropdown"></button>--> <!--<button type="button" class="btn btn-sm btn-secondary dropdown-toggle dropdown-toggle-split" data-bs-toggle="dropdown"></button>-->
<!--<div class="dropdown-menu" [class.dropdown-menu-right]="appsService.connections.get(currentApp)">--> <!--<div class="dropdown-menu" [class.dropdown-menu-right]="appsService.connections.get(currentApp)">-->
<!--<h6 i18n class="dropdown-header">选择服务器</h6>--> <!--<h6 i18n class="dropdown-header">选择服务器</h6>-->
<!--<a *ngFor="let server of currentApp.network.servers" (click)="appsService.network(currentApp, server)" class="dropdown-item" href="#">{{server.id}}</a>--> <!--<a *ngFor="let server of currentApp.network.servers" (click)="appsService.network(currentApp, server)" class="dropdown-item" href="#">{{server.id}}</a>-->
...@@ -200,7 +200,7 @@ ...@@ -200,7 +200,7 @@
<form id="install-form" class="modal-content" (ngSubmit)="install(currentApp,installOption,referencesInstall)" #theForm="ngForm"> <form id="install-form" class="modal-content" (ngSubmit)="install(currentApp,installOption,referencesInstall)" #theForm="ngForm">
<div class="modal-header"> <div class="modal-header">
<h5 i18n class="modal-title" id="myModalLabel">安装 {{currentApp.name}}</h5> <h5 i18n class="modal-title" id="myModalLabel">安装 {{currentApp.name}}</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close"> <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close">
<span>&times;</span> <span>&times;</span>
</button> </button>
</div> </div>
...@@ -233,7 +233,7 @@ ...@@ -233,7 +233,7 @@
</div> </div>
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<button i18n type="button" class="btn btn-secondary" data-dismiss="modal">取消</button> <button i18n type="button" class="btn btn-secondary" data-bs-dismiss="modal">取消</button>
<button i18n type="submit" [disabled]="!theForm.form.valid" class="btn btn-primary">安装</button> <button i18n type="submit" [disabled]="!theForm.form.valid" class="btn btn-primary">安装</button>
</div> </div>
</form> </form>
...@@ -242,20 +242,14 @@ ...@@ -242,20 +242,14 @@
<div class="modal fade" id="import-modal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true" *ngIf="installOption"> <div class="modal fade" id="import-modal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true" *ngIf="installOption">
<div class="modal-dialog" role="document"> <div class="modal-dialog" role="document">
<form id="import-form" class="modal-content" (ngSubmit)="importGame(currentApp,installOption,referencesInstall)" #theForm="ngForm"> <form id="import-form" class="modal-content" (ngSubmit)="importGame(file.files[0].path,currentApp,installOption,referencesInstall)" #theForm="ngForm" ngNativeValidate>
<div class="modal-header"> <div class="modal-header">
<h5 i18n class="modal-title">导入 {{currentApp.name}}</h5> <h5 i18n class="modal-title">导入 {{currentApp.name}}</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close"> <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
<span>&times;</span>
</button>
</div> </div>
<div class="modal-body"> <div class="modal-body">
<p i18n>选择主程序 {{currentApp.actions.get('main').execute}}</p> <p i18n>选择主程序 {{currentApp.actions.get('main').execute}}</p>
<label class="custom-file" lang="en"> <input #file name="file" type="file" id="file" class="form-control" required>
<input (click)="$event.preventDefault();selectImport(currentApp)" type="file" id="file" class="custom-file-input">
<span class="custom-file-control">{{import_path || currentApp.actions.get('main').execute}}</span>
</label>
<h4 i18n>导入到</h4> <h4 i18n>导入到</h4>
<div class="form-group"> <div class="form-group">
<select class="form-control" name="installPath" (change)="selectLibrary()" [(ngModel)]="installOption.installLibrary" title="path"> <select class="form-control" name="installPath" (change)="selectLibrary()" [(ngModel)]="installOption.installLibrary" title="path">
...@@ -283,7 +277,7 @@ ...@@ -283,7 +277,7 @@
</div> </div>
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<button i18n type="button" class="btn btn-secondary" data-dismiss="modal">取消</button> <button i18n type="button" class="btn btn-secondary" data-bs-dismiss="modal">取消</button>
<button i18n type="submit" [disabled]="import_path && !theForm.form.valid" class="btn btn-primary">导入</button> <button i18n type="submit" [disabled]="import_path && !theForm.form.valid" class="btn btn-primary">导入</button>
</div> </div>
</form> </form>
...@@ -296,7 +290,7 @@ ...@@ -296,7 +290,7 @@
<div class="modal-content"> <div class="modal-content">
<div class="modal-header"> <div class="modal-header">
<h5 i18n class="modal-title">购买 {{currentApp.name}}</h5> <h5 i18n class="modal-title">购买 {{currentApp.name}}</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close"> <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close">
<span>&times;</span> <span>&times;</span>
</button> </button>
</div> </div>
...@@ -336,7 +330,7 @@ ...@@ -336,7 +330,7 @@
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<button i18n class="btn btn-secondary" data-dismiss="modal">取消</button> <button i18n class="btn btn-secondary" data-bs-dismiss="modal">取消</button>
<button i18n [disabled]="creating_order" class="btn btn-primary" (click)="purchase()">购买</button> <button i18n [disabled]="creating_order" class="btn btn-primary" (click)="purchase()">购买</button>
</div> </div>
</div> </div>
...@@ -349,7 +343,7 @@ ...@@ -349,7 +343,7 @@
<div class="modal-content"> <div class="modal-content">
<div class="modal-header"> <div class="modal-header">
<h5 i18n class="modal-title">购买 {{currentApp.name}}</h5> <h5 i18n class="modal-title">购买 {{currentApp.name}}</h5>
<!--<button type="button" class="close" data-dismiss="modal" aria-label="Close">--> <!--<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close">-->
<!--<span>&times;</span>--> <!--<span>&times;</span>-->
<!--</button>--> <!--</button>-->
</div> </div>
...@@ -360,7 +354,7 @@ ...@@ -360,7 +354,7 @@
若支付失败,请返回并选择其他支付方式 若支付失败,请返回并选择其他支付方式
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<button i18n type="button" class="btn btn-secondary" data-dismiss="modal">返回</button> <button i18n type="button" class="btn btn-secondary" data-bs-dismiss="modal">返回</button>
</div> </div>
</div> </div>
</div> </div>
......
...@@ -36,7 +36,7 @@ export class AppDetailComponent implements OnInit, OnChanges { ...@@ -36,7 +36,7 @@ export class AppDetailComponent implements OnInit, OnChanges {
references: App[]; references: App[];
referencesInstall: { [id: string]: boolean }; referencesInstall: { [id: string]: boolean };
import_path: string; // import_path: string;
background: string; background: string;
points: Points; points: Points;
...@@ -68,9 +68,9 @@ export class AppDetailComponent implements OnInit, OnChanges { ...@@ -68,9 +68,9 @@ export class AppDetailComponent implements OnInit, OnChanges {
} }
async ngOnChanges(changes: SimpleChanges) { async ngOnChanges(changes: SimpleChanges) {
if (this.currentApp.isBought()) { // if (this.currentApp.isBought()) {
$('#purchase-modal-alipay').modal('hide'); // $('#purchase-modal-alipay').modal('hide');
} // }
if (changes['currentApp']) { if (changes['currentApp']) {
if (this.currentApp.background) { if (this.currentApp.background) {
this.el.nativeElement.style.background = `url("${this.currentApp.background}") rgba(255,255,255,.8)`; this.el.nativeElement.style.background = `url("${this.currentApp.background}") rgba(255,255,255,.8)`;
...@@ -150,7 +150,7 @@ export class AppDetailComponent implements OnInit, OnChanges { ...@@ -150,7 +150,7 @@ export class AppDetailComponent implements OnInit, OnChanges {
} }
async install(targetApp: App, options: InstallOption, referencesInstall: { [id: string]: boolean }) { async install(targetApp: App, options: InstallOption, referencesInstall: { [id: string]: boolean }) {
$('#install-modal').modal('hide'); // $('#install-modal').modal('hide');
try { try {
await this.appsService.install(targetApp, options); await this.appsService.install(targetApp, options);
...@@ -210,9 +210,8 @@ export class AppDetailComponent implements OnInit, OnChanges { ...@@ -210,9 +210,8 @@ export class AppDetailComponent implements OnInit, OnChanges {
await this.appsService.runApp(app, 'roll'); await this.appsService.runApp(app, 'roll');
} }
async importGame(targetApp: App, option: InstallOption, referencesInstall: { [id: string]: boolean }) { async importGame(origin: string, targetApp: App, option: InstallOption, referencesInstall: { [id: string]: boolean }) {
$('#import-modal').modal('hide'); let dir = path.dirname(origin);
let dir = path.dirname(this.import_path);
// TODO: 执行依赖和references安装 // TODO: 执行依赖和references安装
try { try {
await this.appsService.importApp(targetApp, dir, option); await this.appsService.importApp(targetApp, dir, option);
...@@ -248,57 +247,57 @@ export class AppDetailComponent implements OnInit, OnChanges { ...@@ -248,57 +247,57 @@ export class AppDetailComponent implements OnInit, OnChanges {
clipboard.writeText(text); clipboard.writeText(text);
} }
async selectImport(app: App) { // async selectImport(app: App) {
let main = app.actions.get('main'); // let main = app.actions.get('main');
if (!main) { // if (!main) {
return; // return;
} // }
if (!main.execute) { // if (!main.execute) {
return; // return;
} // }
let filename = main.execute.split('/')[0]; // let filename = main.execute.split('/')[0];
let extname = path.extname(filename).slice(1); // let extname = path.extname(filename).slice(1);
//
// let remote = require('electron').remote // // let remote = require('electron').remote
let filePaths = await new Promise<string[]>((resolve, reject) => { // let filePaths = await new Promise<string[]>((resolve, reject) => {
remote.dialog.showOpenDialog({ // remote.dialog.showOpenDialog({
filters: [{name: filename, extensions: [extname]}], // filters: [{name: filename, extensions: [extname]}],
properties: ['openFile'] // properties: ['openFile']
}, resolve); // }, resolve);
}); // });
//
if (filePaths && filePaths[0]) { // if (filePaths && filePaths[0]) {
this.import_path = filePaths[0]; // this.import_path = filePaths[0];
} // }
//
} // }
onPoints(points: Points) { onPoints(points: Points) {
this.points = points; this.points = points;
} }
async purchase() { // async purchase() {
this.creating_order = true; // this.creating_order = true;
let data = new URLSearchParams(); // let data = new URLSearchParams();
data.set('app_id', this.currentApp.id); // data.set('app_id', this.currentApp.id);
data.set('user_id', this.loginService.user.email); // data.set('user_id', this.loginService.user.email);
data.set('currency', 'cny'); // data.set('currency', 'cny');
data.set('payment', this.payment); // data.set('payment', this.payment);
try { // try {
let {url} = await this.http.post('https://sapi.moecube.com:444/orders', data).map(response => response.json()).toPromise(); // let {url} = await this.http.post('https://sapi.moecube.com:444/orders', data).map(response => response.json()).toPromise();
open(url); // open(url);
$('#purchase-modal').modal('hide'); // $('#purchase-modal').modal('hide');
$('#purchase-modal-alipay').modal('show'); // $('#purchase-modal-alipay').modal('show');
} catch (error) { // } catch (error) {
console.log(error); // console.log(error);
if (error.status === 409) { // if (error.status === 409) {
alert('卖完了 /\\'); // alert('卖完了 /\\');
} else if (error.status === 403) { // } else if (error.status === 403) {
alert('已经购买过 /\\'); // alert('已经购买过 /\\');
} else { // } else {
alert('出错了 /\\'); // alert('出错了 /\\');
} // }
} // }
this.creating_order = false; // this.creating_order = false;
} // }
} }
<!-- Begin page content --> <!-- Begin page content -->
<div #nav id="nav-wrapper" class="resize-wrapper resize-right"> <div #nav id="nav-wrapper" class="resize-wrapper resize-right">
<nav id="apps" *ngIf="apps" class="bg-faded sidebar scroll"> <nav id="apps" *ngIf="apps" class="bg-faded sidebar scroll">
<div id="search" class="input-group"> <!-- <div id="search" class="input-group">-->
<i class="fa fa-search input-group-addon search" id="basic-addon1"></i> <!-- <i class="fa fa-search input-group-addon search" id="basic-addon1"></i>-->
<input i18n-placeholder #search id="search-input" type="text" class="form-control search" placeholder="搜索游戏" aria-describedby="basic-addon1"> <!-- <input i18n-placeholder #search id="search-input" type="text" class="form-control search" placeholder="搜索游戏" aria-describedby="basic-addon1">-->
</div> <!-- </div>-->
<span i18n *ngIf="grouped_apps.installed">已安装</span> <span i18n *ngIf="grouped_apps.installed">已安装</span>
<ul *ngIf="grouped_apps.installed" class="nav nav-pills flex-column"> <ul *ngIf="grouped_apps.installed" class="nav nav-pills flex-column">
......
<nav id="navbar" class="navbar navbar-toggleable-md navbar-light"> <header id="navbar" class="navbar navbar-toggleable-md navbar-light">
<a id="navbar-brand" class="navbar-brand" href="#"> <a id="navbar-brand" class="navbar-brand" href="#">
<img src="images/icon.ico" /> MyCard <img src="images/icon.ico" /> MyCard
</a> </a>
<ul class="navbar-nav mr-auto"> <ul class="nav me-auto">
<li *ngIf="!loginService.logged_in" class="nav-item active"> <li *ngIf="!loginService.logged_in" class="nav-item active">
<a i18n class="nav-link" href="#">登录</a> <a i18n class="nav-link" href="#">登录</a>
</li> </li>
...@@ -26,16 +26,16 @@ ...@@ -26,16 +26,16 @@
</ul> </ul>
<div id="navbar-right"> <div id="navbar-right">
<div id="update-status"> <div id="update-status">
<i #error [hidden]="update_status != 'error'" (click)="update_retry()" class="fa fa-exclamation-circle" data-toggle="tooltip" i18n-title title="更新出错,点击重试"></i> <i #error [hidden]="update_status != 'error'" (click)="update_retry()" class="fa fa-exclamation-circle" data-bs-toggle="tooltip" i18n-title title="更新出错,点击重试"></i>
<i #checking_for_update [hidden]="update_status != 'checking-for-update'" class="fa fa-spinner fa-pulse fa-spin" data-toggle="tooltip" i18n-title title="正在检查更新"></i> <i #checking_for_update [hidden]="update_status != 'checking-for-update'" class="fa fa-spinner fa-pulse fa-spin" data-bs-toggle="tooltip" i18n-title title="正在检查更新"></i>
<i #update_available [hidden]="update_status != 'update-available'" class="fa fa-refresh fa-spin" data-toggle="tooltip" i18n-title title="正在下载更新"></i> <i #update_available [hidden]="update_status != 'update-available'" class="fa fa-refresh fa-spin" data-bs-toggle="tooltip" i18n-title title="正在下载更新"></i>
<i #update_downloaded [hidden]="update_status != 'update-downloaded'" (click)="update_install()" class="fa fa-angle-double-up" data-toggle="tooltip" i18n-title title="下载更新完成,点击安装"></i> <i #update_downloaded [hidden]="update_status != 'update-downloaded'" (click)="update_install()" class="fa fa-angle-double-up" data-bs-toggle="tooltip" i18n-title title="下载更新完成,点击安装"></i>
</div> </div>
<div id="user" *ngIf="loginService.logged_in"> <div id="user" *ngIf="loginService.logged_in">
<a href="#" class="profile"><img id="avatar" [src]="loginService.user.avatar_url" alt="image"></a> <a href="#" class="profile"><img id="avatar" [src]="loginService.user.avatar_url" alt="image"></a>
<a href="#" class="profile item" id="username">{{loginService.user.username}}</a> <a href="#" class="profile item" id="username">{{loginService.user.username}}</a>
<i i18n (click)="loginService.logout()" class="fa fa-sign-out item-icon" aria-hidden="true" i18n-title title="切换用户"></i> <i i18n (click)="loginService.logout()" class="fa fa-sign-out item-icon" aria-hidden="true" i18n-title title="切换用户"></i>
<i i18n data-toggle="modal" data-target="#settings-modal" class="fa fa-cog item-icon" aria-hidden="true" i18n-title title="设置"></i> <i i18n data-bs-toggle="modal" data-bs-target="#settings-modal" class="fa fa-cog item-icon" aria-hidden="true" i18n-title title="设置"></i>
</div> </div>
<div id="border">|</div> <div id="border">|</div>
<div id="window-buttons"> <div id="window-buttons">
...@@ -45,7 +45,7 @@ ...@@ -45,7 +45,7 @@
<i i18n (click)="currentWindow.hide()" class="fa fa-times" i18n-title title="关闭"></i> <i i18n (click)="currentWindow.hide()" class="fa fa-times" i18n-title title="关闭"></i>
</div> </div>
</div> </div>
</nav> </header>
<login class="page" *ngIf="!loginService.logged_in"></login> <login class="page" *ngIf="!loginService.logged_in"></login>
<store class="page" *ngIf="loginService.logged_in" [hidden]="currentPage != 'store'"></store> <store class="page" *ngIf="loginService.logged_in" [hidden]="currentPage != 'store'"></store>
<lobby class="page" *ngIf="loginService.logged_in" [hidden]="currentPage != 'lobby'"></lobby> <lobby class="page" *ngIf="loginService.logged_in" [hidden]="currentPage != 'lobby'"></lobby>
...@@ -59,9 +59,7 @@ ...@@ -59,9 +59,7 @@
<div class="modal-content"> <div class="modal-content">
<div class="modal-header"> <div class="modal-header">
<h5 i18n class="modal-title" id="myModalLabel">MyCard 设置</h5> <h5 i18n class="modal-title" id="myModalLabel">MyCard 设置</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close"> <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
<span aria-hidden="true">&times;</span>
</button>
</div> </div>
<form (submit)="submit()"> <form (submit)="submit()">
<div class="modal-body"> <div class="modal-body">
...@@ -78,8 +76,8 @@ ...@@ -78,8 +76,8 @@
</div> </div>
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<button i18n type="button" class="btn btn-secondary" data-dismiss="modal">取消</button> <button i18n type="button" class="btn btn-secondary" data-bs-dismiss="modal">取消</button>
<button i18n type="submit" class="btn btn-primary">确定</button> <button i18n type="submit" class="btn btn-primary" data-bs-dismiss="modal">确定</button>
</div> </div>
</form> </form>
</div> </div>
......
import {ChangeDetectorRef, Component, ElementRef, OnInit, Renderer, ViewChild} from '@angular/core'; import {ChangeDetectorRef, Component, ElementRef, OnInit, Renderer, ViewChild} from '@angular/core';
import 'bootstrap';
import {remote, shell} from 'electron'; import {remote, shell} from 'electron';
import * as $ from 'jquery'; import * as $ from 'jquery';
import * as Tether from 'tether';
import {LoginService} from './login.service'; import {LoginService} from './login.service';
import {SettingsService} from './settings.sevices'; import {SettingsService} from './settings.sevices';
window['Tether'] = Tether; import 'bootstrap';
const autoUpdater: Electron.AutoUpdater = remote.getGlobal('autoUpdater'); const autoUpdater: Electron.AutoUpdater = remote.getGlobal('autoUpdater');
const konami_code_logger: string[] = []; const konami_code_logger: string[] = [];
...@@ -139,7 +137,6 @@ export class MyCardComponent implements OnInit { ...@@ -139,7 +137,6 @@ export class MyCardComponent implements OnInit {
remote.app.relaunch(); remote.app.relaunch();
remote.app.quit(); remote.app.quit();
} }
$('#settings-modal').modal('hide');
} }
// //
......
<div id="network" *ngIf="currentApp.network && currentApp.network.protocol == 'maotama'"> <div id="network" *ngIf="currentApp.network && currentApp.network.protocol == 'maotama'">
<!--<button (click)="log(appsService)">test</button>-->
<div class="input-group input-group-sm"> <div class="input-group input-group-sm">
<input *ngIf="appsService.connections.get(currentApp)" [value]="appsService.connections.get(currentApp).address || 'Loading...'" readonly type="text" class="form-control" title="address"> <input *ngIf="appsService.connections.get(currentApp)" [value]="appsService.connections.get(currentApp).address || 'Loading...'" readonly type="text" class="form-control" title="address">
<div class="input-group-btn" style="flex-direction: row"> <button i18n *ngIf="!appsService.connections.get(currentApp)" [disabled]="!appsService.allReady(currentApp)" (click)="appsService.network(currentApp, currentApp.network.servers[0])" type="button" class="btn btn-outline-secondary btn-sm">联机</button>
<button i18n *ngIf="!appsService.connections.get(currentApp)" [disabled]="!appsService.allReady(currentApp)" (click)="appsService.network(currentApp, currentApp.network.servers[0])" type="button" class="btn btn-secondary btn-sm">联机</button> <button i18n *ngIf="appsService.connections.get(currentApp)" (click)="copy(appsService.connections.get(currentApp).address)" [disabled]="!appsService.connections.get(currentApp).address" type="button" class="btn btn-outline-secondary btn-sm">复制</button>
<button i18n *ngIf="appsService.connections.get(currentApp)" (click)="copy(appsService.connections.get(currentApp).address)" [disabled]="!appsService.connections.get(currentApp).address" type="button" class="btn btn-secondary btn-sm">复制</button> <button type="button" class="btn btn-sm btn-outline-secondary dropdown-toggle dropdown-toggle-split" data-bs-toggle="dropdown"></button>
<button type="button" class="btn btn-sm btn-secondary dropdown-toggle dropdown-toggle-split" data-toggle="dropdown"></button> <div class="dropdown-menu" [class.dropdown-menu-right]="appsService.connections.get(currentApp)">
<div class="dropdown-menu" [class.dropdown-menu-right]="appsService.connections.get(currentApp)"> <h6 i18n class="dropdown-header">选择服务器</h6>
<h6 i18n class="dropdown-header">选择服务器</h6> <a *ngFor="let server of currentApp.network.servers" (click)="appsService.network(currentApp, server)" class="dropdown-item" href="#">{{server.id}}</a>
<a *ngFor="let server of currentApp.network.servers" (click)="appsService.network(currentApp, server)" class="dropdown-item" href="#">{{server.id}}</a> <div *ngIf="appsService.connections.get(currentApp)" class="dropdown-divider"></div>
<div *ngIf="appsService.connections.get(currentApp)" class="dropdown-divider"></div> <a i18n *ngIf="appsService.connections.get(currentApp)" (click)="appsService.connections.get(currentApp).connection.close()" class="dropdown-item" href="#">取消</a>
<a i18n *ngIf="appsService.connections.get(currentApp)" (click)="appsService.connections.get(currentApp).connection.close()" class="dropdown-item" href="#">取消</a>
</div>
</div> </div>
</div> </div>
</div> </div>
import {clipboard} from 'electron';
import {Component, Injectable, Input} from '@angular/core'; import {Component, Injectable, Input} from '@angular/core';
import {AppsService} from './apps.service'; import {AppsService} from './apps.service';
import {App} from './app'; import {App} from './app';
...@@ -14,6 +15,10 @@ export class NetworkComponent { ...@@ -14,6 +15,10 @@ export class NetworkComponent {
currentApp: App; currentApp: App;
constructor(private appsService: AppsService) { constructor(private appsService: AppsService) {
console.log( 'constructor' ); console.log('constructor');
}
copy(text: string) {
clipboard.writeText(text);
} }
} }
...@@ -2,9 +2,9 @@ ...@@ -2,9 +2,9 @@
<button [disabled]="!appsService.allReady(app) || currentServer.id !== 'tiramisu'" (click)="request_match('athletic')" type="button" class="btn btn-primary btn-sm"> <button [disabled]="!appsService.allReady(app) || currentServer.id !== 'tiramisu'" (click)="request_match('athletic')" type="button" class="btn btn-primary btn-sm">
<i class="fa fa-play" aria-hidden="true"></i> <span i18n>竞技匹配</span></button> <i class="fa fa-play" aria-hidden="true"></i> <span i18n>竞技匹配</span></button>
<button i18n [disabled]="!appsService.allReady(app) || currentServer.id !== 'tiramisu'" (click)="request_match('entertain')" type="button" class="btn btn-secondary btn-sm">娱乐匹配</button> <button i18n [disabled]="!appsService.allReady(app) || currentServer.id !== 'tiramisu'" (click)="request_match('entertain')" type="button" class="btn btn-secondary btn-sm">娱乐匹配</button>
<button i18n [disabled]="!appsService.allReady(app) || !currentServer.custom" type="button" class="btn btn-secondary btn-sm" data-toggle="modal" data-target="#game-list-modal">自定义游戏</button> <button i18n [disabled]="!appsService.allReady(app) || !currentServer.custom" type="button" class="btn btn-secondary btn-sm" data-bs-toggle="modal" data-bs-target="#game-list-modal">自定义游戏</button>
<button i18n [disabled]="!appsService.allReady(app) || !currentServer.windbot" type="button" class="btn btn-secondary btn-sm" data-toggle="modal" data-target="#game-create-windbot">单人模式</button> <button i18n [disabled]="!appsService.allReady(app) || !currentServer.windbot" type="button" class="btn btn-secondary btn-sm" data-bs-toggle="modal" data-bs-target="#game-create-windbot">单人模式</button>
<button i18n [disabled]="!appsService.allReady(app)" type="button" class="btn btn-secondary btn-sm" data-toggle="modal" data-target="#game-replay-modal">观战录像</button> <button i18n [disabled]="!appsService.allReady(app)" type="button" class="btn btn-secondary btn-sm" data-bs-toggle="modal" data-bs-target="#game-replay-modal">观战录像</button>
</div> </div>
<!-- 匹配中 --> <!-- 匹配中 -->
<div *ngIf="matching" id="match-time" class="input-group input-group-sm"> <div *ngIf="matching" id="match-time" class="input-group input-group-sm">
...@@ -19,16 +19,19 @@ ...@@ -19,16 +19,19 @@
<div class="row small-gutters"> <div class="row small-gutters">
<div class="col-sm-4 input-group input-group-sm"> <div class="col-sm-4 input-group input-group-sm">
<label i18n class="input-group-addon" id="server-label">环境</label> <label class="input-group-text" id="server-label">环境</label>
<select class="form-control form-control-sm" id="selectServer" name="server" [disabled]="!appsService.allReady(app)" [(ngModel)]="currentServer"> <select class="form-select form-select-sm" id="selectServer" name="server" [disabled]="!appsService.allReady(app)" [(ngModel)]="currentServer">
<option *ngFor="let server of selectableServers" [ngValue]="server">{{server.name}}</option> <option *ngFor="let server of selectableServers" [value]="server">{{server.name}}</option>
</select> </select>
</div> </div>
<div class="col-sm-8 input-group input-group-sm"> <div class="col-sm-8 input-group input-group-sm">
<label i18n class="input-group-addon" id="basic-addon1">卡组</label> <label i18n class="input-group-text" id="basic-addon1">卡组</label>
<select class="form-control form-control-sm" id="exampleSelect1" name="deck" [(ngModel)]="current_deck"> <select class="form-select form-select-sm" id="exampleSelect1" name="deck" [(ngModel)]="current_deck">
<option *ngFor="let deck of decks" [ngValue]="deck">{{deck}}</option> <optgroup *ngFor="let group of deckGroup()" [label]="group[0]">
</select> <span class="input-group-btn"> <option *ngFor="let deck of group[1]" [value]="group[0] + '/' + deck">{{deck}}</option>
</optgroup>
</select>
<span class="input-group-btn">
<button id="edit_deck_button" i18n [disabled]="!appsService.allReady(app)" class="btn btn-secondary btn-sm" (click)="edit_deck(current_deck)">编辑</button> <button id="edit_deck_button" i18n [disabled]="!appsService.allReady(app)" class="btn btn-secondary btn-sm" (click)="edit_deck(current_deck)">编辑</button>
</span> </span>
</div> </div>
...@@ -39,9 +42,7 @@ ...@@ -39,9 +42,7 @@
<div class="modal-content"> <div class="modal-content">
<div class="modal-header"> <div class="modal-header">
<h5 i18n class="modal-title">单人模式</h5> <h5 i18n class="modal-title">单人模式</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close"> <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
<span aria-hidden="true">&times;</span>
</button>
</div> </div>
<div class="modal-body"> <div class="modal-body">
<label i18n>选择对手</label> <label i18n>选择对手</label>
...@@ -51,7 +52,7 @@ ...@@ -51,7 +52,7 @@
</div> </div>
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<button i18n type="button" class="btn btn-secondary" data-dismiss="modal">取消</button> <button i18n type="button" class="btn btn-secondary" data-bs-dismiss="modal">取消</button>
</div> </div>
</div> </div>
</div> </div>
...@@ -78,7 +79,7 @@ ...@@ -78,7 +79,7 @@
<tr *ngFor="let room of rooms_show" class="room" (click)="join_room(room)"> <tr *ngFor="let room of rooms_show" class="room" (click)="join_room(room)">
<td class="title">{{room.title}}</td> <td class="title">{{room.title}}</td>
<td class="users"> <td class="users">
<img *ngFor="let user of room.users" class="avatar rounded" [src]="'https://ygobbs.com/user_avatar/ygobbs.com/' + user.username + '/25/1.png'" data-toggle="tooltip" data-placement="bottom" [title]="user.username" (error)="avatar_fallback($event)"> <img *ngFor="let user of room.users" class="avatar rounded" [src]="'https://ygobbs.com/user_avatar/ygobbs.com/' + user.username + '/25/1.png'" data-bs-toggle="tooltip" data-placement="bottom" [title]="user.username" (error)="avatar_fallback($event)">
</td> </td>
<td class="mode"> <td class="mode">
<span i18n *ngIf="room.options.mode === 0">单局模式</span> <span i18n *ngIf="room.options.mode === 0">单局模式</span>
...@@ -104,9 +105,9 @@ ...@@ -104,9 +105,9 @@
</tbody> </tbody>
</table> </table>
<div id="join-private" class="input-group input-group-sm"> <div id="join-private" class="input-group input-group-sm">
<i class="fa fa-key input-group-addon" aria-hidden="true"></i> <span class="input-group-text"><i class="fa fa-key"></i></span>
<input [(ngModel)]="join_password" type="text" class="form-control" i18n-placeholder placeholder="在这输入你朋友的私密房间密码就可以进去了哦!"> <input [(ngModel)]="join_password" type="text" class="form-control" i18n-placeholder placeholder="在这输入你朋友的私密房间密码就可以进去了哦!">
<span class="input-group-btn"><button i18n class="btn btn-secondary" type="button" (click)="join_private(join_password)">加入私密房间</button></span> <button i18n class="btn btn-secondary" type="button" (click)="join_private(join_password)">加入私密房间</button>
</div> </div>
</div> </div>
...@@ -124,7 +125,7 @@ ...@@ -124,7 +125,7 @@
<span i18n>房间密码</span></label> <span i18n>房间密码</span></label>
<div class="input-group input-group-sm"> <div class="input-group input-group-sm">
<input type="text" maxlength="12" class="form-control" id="game-create-title" name="title" [(ngModel)]="host_password" readonly> <input type="text" maxlength="12" class="form-control" id="game-create-title" name="title" [(ngModel)]="host_password" readonly>
<span i18n-title id="copy-wrapper" class="input-group-btn" data-toggle="tooltip" title="房间密码已复制到剪贴板"> <span i18n-title id="copy-wrapper" class="input-group-btn" data-bs-toggle="tooltip" title="房间密码已复制到剪贴板">
<button i18n-title class="btn btn-secondary fa fa-clipboard" type="button" title="复制" (click)="copy(host_password, $event)"></button> <button i18n-title class="btn btn-secondary fa fa-clipboard" type="button" title="复制" (click)="copy(host_password, $event)"></button>
</span> </span>
</div> </div>
...@@ -208,9 +209,7 @@ ...@@ -208,9 +209,7 @@
<button i18n type="submit" class="btn btn-sm btn-primary">创建房间</button> <button i18n type="submit" class="btn btn-sm btn-primary">创建房间</button>
</div> </div>
</form> </form>
<button id="game-list-close" type="button" class="close" data-dismiss="modal" aria-label="Close"> <button id="game-list-close" type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
<span aria-hidden="true">&times;</span>
</button>
</div> </div>
</div> </div>
</div> </div>
...@@ -221,32 +220,30 @@ ...@@ -221,32 +220,30 @@
<div class="modal-content"> <div class="modal-content">
<!--<div class="modal-header">--> <!--<div class="modal-header">-->
<!--<h5 class="modal-title" id="exampleModalLabel">Modal title</h5>--> <!--<h5 class="modal-title" id="exampleModalLabel">Modal title</h5>-->
<!--<button type="button" class="close" data-dismiss="modal" aria-label="Close">--> <!--<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close">-->
<!--<span aria-hidden="true">&times;</span>--> <!--<span aria-hidden="true">&times;</span>-->
<!--</button>--> <!--</button>-->
<!--</div>--> <!--</div>-->
<div class="modal-body"> <div class="modal-body">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"> <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
<span aria-hidden="true">&times;</span>
</button>
<ul class="nav nav-tabs" role="tablist"> <ul class="nav nav-tabs" role="tablist">
<!--<li class="nav-item">--> <!--<li class="nav-item">-->
<!--<a class="nav-link" data-toggle="tab" href="#home" role="tab">推荐</a>--> <!--<a class="nav-link" data-bs-toggle="tab" href="#home" role="tab">推荐</a>-->
<!--</li>--> <!--</li>-->
<li class="nav-item"> <li class="nav-item">
<a i18n class="nav-link active" data-toggle="tab" href="#game-replay-watch" role="tab">观战</a> <a i18n class="nav-link active" data-bs-toggle="tab" href="#game-replay-watch" role="tab">观战</a>
</li> </li>
<!--<li class="nav-item">--> <!--<li class="nav-item">-->
<!--<a class="nav-link" data-toggle="tab" href="#home" role="tab">收藏的录像</a>--> <!--<a class="nav-link" data-bs-toggle="tab" href="#home" role="tab">收藏的录像</a>-->
<!--</li>--> <!--</li>-->
<li class="nav-item"> <li class="nav-item">
<a i18n class="nav-link" data-toggle="tab" href="#game-replay-local" role="tab">本地录像</a> <a i18n class="nav-link" data-bs-toggle="tab" href="#game-replay-local" role="tab">本地录像</a>
</li> </li>
<!--<li *ngIf="settingsService.getLocale().startsWith('zh')" class="nav-item"> <!--<li *ngIf="settingsService.getLocale().startsWith('zh')" class="nav-item">
<a class="nav-link" data-toggle="tab" href="#game-replay-bilibili" role="tab">哔哩哔哩</a> <a class="nav-link" data-bs-toggle="tab" href="#game-replay-bilibili" role="tab">哔哩哔哩</a>
</li>--> </li>-->
<!--<li class="nav-item">--> <!--<li class="nav-item">-->
<!--<a class="nav-link" data-toggle="tab" href="#game-replay-youtube" role="tab">YouTube</a>--> <!--<a class="nav-link" data-bs-toggle="tab" href="#game-replay-youtube" role="tab">YouTube</a>-->
<!--</li>--> <!--</li>-->
</ul> </ul>
<div class="tab-content"> <div class="tab-content">
...@@ -310,7 +307,7 @@ ...@@ -310,7 +307,7 @@
<span *ngIf="!(room.arena || room.id.startsWith('AI#') || room.private)">{{room.title}}</span> <span *ngIf="!(room.arena || room.id.startsWith('AI#') || room.private)">{{room.title}}</span>
</td> </td>
<td class="users"> <td class="users">
<img *ngFor="let user of room.users" class="avatar rounded" [src]="'https://ygobbs.com/user_avatar/ygobbs.com/' + user.username + '/25/1.png'" data-toggle="tooltip" data-placement="bottom" [title]="user.username" (error)="avatar_fallback($event)"> <img *ngFor="let user of room.users" class="avatar rounded" [src]="'https://ygobbs.com/user_avatar/ygobbs.com/' + user.username + '/25/1.png'" data-bs-toggle="tooltip" data-placement="bottom" [title]="user.username" (error)="avatar_fallback($event)">
</td> </td>
<td class="extra"> <td class="extra">
<div *ngIf="!(room.arena || room.id.startsWith('AI#'))"> <div *ngIf="!(room.arena || room.id.startsWith('AI#'))">
...@@ -348,7 +345,7 @@ ...@@ -348,7 +345,7 @@
</div> </div>
</div> </div>
<!--<div class="modal-footer">--> <!--<div class="modal-footer">-->
<!--<button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>--> <!--<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button>-->
<!--&lt;!&ndash;<button type="button" class="btn btn-primary">Save changes</button>&ndash;&gt;--> <!--&lt;!&ndash;<button type="button" class="btn btn-primary">Save changes</button>&ndash;&gt;-->
<!--</div>--> <!--</div>-->
</div> </div>
......
...@@ -13,9 +13,10 @@ import {App} from './app'; ...@@ -13,9 +13,10 @@ import {App} from './app';
import {AppsService} from './apps.service'; import {AppsService} from './apps.service';
import {LoginService} from './login.service'; import {LoginService} from './login.service';
import {SettingsService} from './settings.sevices'; import {SettingsService} from './settings.sevices';
import Timer = NodeJS.Timer; import * as _ from 'lodash';
import * as fg from 'fast-glob';
import WillNavigateEvent = Electron.WillNavigateEvent; import WillNavigateEvent = Electron.WillNavigateEvent;
import _ = require('lodash'); import Timer = NodeJS.Timer;
interface SystemConf { interface SystemConf {
use_d3d: string; use_d3d: string;
...@@ -125,6 +126,7 @@ export class YGOProComponent implements OnInit, OnDestroy { ...@@ -125,6 +126,7 @@ export class YGOProComponent implements OnInit, OnDestroy {
@Output() @Output()
points: EventEmitter<Points> = new EventEmitter(); points: EventEmitter<Points> = new EventEmitter();
decks: string[] = []; decks: string[] = [];
decks_grouped: [string, string[]][];
replays: string[] = []; replays: string[] = [];
current_deck: string; current_deck: string;
system_conf: string; system_conf: string;
...@@ -136,28 +138,19 @@ export class YGOProComponent implements OnInit, OnDestroy { ...@@ -136,28 +138,19 @@ export class YGOProComponent implements OnInit, OnDestroy {
@ViewChild('youtube') @ViewChild('youtube')
youtube: ElementRef; youtube: ElementRef;
// points: Points;
get windbot() {
return this.currentServer.windbot;
}
// points: Points;
servers: Server[]; servers: Server[];
selectableServers: Server[]; selectableServers: Server[];
// selectingServerId: string; // selectingServerId: string;
currentServer: Server; currentServer: Server;
// tslint:disable-next-line:member-ordering
rooms_loading = true;
/*reloadCurrentServer() { /*reloadCurrentServer() {
this.currentServer = this.servers.find(s => s.id === this.selectingServerId); this.currentServer = this.servers.find(s => s.id === this.selectingServerId);
}*/ }*/
// tslint:disable-next-line:member-ordering
rooms_loading = true;
lastDeckFormat: RegExp; lastDeckFormat: RegExp;
default_options: Options = { default_options: Options = {
mode: 1, mode: 1,
rule: this.settingsService.getLocale().startsWith('zh') ? 0 : 1, rule: this.settingsService.getLocale().startsWith('zh') ? 0 : 1,
...@@ -172,12 +165,9 @@ export class YGOProComponent implements OnInit, OnDestroy { ...@@ -172,12 +165,9 @@ export class YGOProComponent implements OnInit, OnDestroy {
time_limit: 180, time_limit: 180,
auto_death: false auto_death: false
}; };
room: Room = {title: this.loginService.user.username + '的房间', options: Object.assign({}, this.default_options)}; room: Room = {title: this.loginService.user.username + '的房间', options: Object.assign({}, this.default_options)};
rooms: Room[] = []; rooms: Room[] = [];
rooms_show: Room[]; rooms_show: Room[];
connections: WebSocket[] = []; connections: WebSocket[] = [];
replay_connections: WebSocket[] = []; replay_connections: WebSocket[] = [];
replay_rooms: Room[] = []; replay_rooms: Room[] = [];
...@@ -190,13 +180,11 @@ export class YGOProComponent implements OnInit, OnDestroy { ...@@ -190,13 +180,11 @@ export class YGOProComponent implements OnInit, OnDestroy {
tag: true, tag: true,
windbot: false windbot: false
}; };
matching: ISubscription | undefined; matching: ISubscription | undefined;
matching_arena: string | undefined; matching_arena: string | undefined;
match_time: string; match_time: string;
match_cancelable: boolean; match_cancelable: boolean;
match_interval: Timer | undefined; match_interval: Timer | undefined;
join_password: string; join_password: string;
host_password = (this.loginService.user.external_id ^ 0x54321).toString(); host_password = (this.loginService.user.external_id ^ 0x54321).toString();
...@@ -242,6 +230,10 @@ export class YGOProComponent implements OnInit, OnDestroy { ...@@ -242,6 +230,10 @@ export class YGOProComponent implements OnInit, OnDestroy {
} }
} }
get windbot() {
return this.currentServer.windbot;
}
refresh_rooms() { refresh_rooms() {
this.rooms_show = this.rooms.filter((room) => room.server === this.currentServer); this.rooms_show = this.rooms.filter((room) => room.server === this.currentServer);
} }
...@@ -416,7 +408,7 @@ export class YGOProComponent implements OnInit, OnDestroy { ...@@ -416,7 +408,7 @@ export class YGOProComponent implements OnInit, OnDestroy {
let watchDropdownMenu = $('#watch-filter'); let watchDropdownMenu = $('#watch-filter');
watchDropdownMenu.on("change", "input[type='checkbox']", (event) => { watchDropdownMenu.on('change', 'input[type=\'checkbox\']', (event) => {
// $(event.target).closest("label").toggleClass("active", (<HTMLInputElement> event.target).checked); // $(event.target).closest("label").toggleClass("active", (<HTMLInputElement> event.target).checked);
this.refresh_replay_rooms(); this.refresh_replay_rooms();
}); });
...@@ -440,6 +432,7 @@ export class YGOProComponent implements OnInit, OnDestroy { ...@@ -440,6 +432,7 @@ export class YGOProComponent implements OnInit, OnDestroy {
async refresh(init?: boolean) { async refresh(init?: boolean) {
this.decks = await this.get_decks(); this.decks = await this.get_decks();
this.decks_grouped = this.deckGroup();
if (this.lastDeckFormat) { if (this.lastDeckFormat) {
const systemConfString = await this.load_system_conf(); const systemConfString = await this.load_system_conf();
...@@ -484,37 +477,17 @@ export class YGOProComponent implements OnInit, OnDestroy { ...@@ -484,37 +477,17 @@ export class YGOProComponent implements OnInit, OnDestroy {
async get_decks(): Promise<string[]> { async get_decks(): Promise<string[]> {
try { try {
/* return fg.sync('**/*.ydk', {cwd: this.app.ygoproDeckPath});
const deckPath = this.app.ygoproDeckPath;
let result: string[] = [];
const files: string[] = await fs.readdir(deckPath);
for (const file of files) {
if (file.startsWith('.git')) { // fuck
continue;
}
if (path.extname(file) === '.ydk') {
result.push(path.basename(file, '.ydk'));
} else {
const fullPath = path.join(deckPath, file);
const stat = await fs.stat(fullPath);
if (stat.isDirectory()) {
const innerDecks = (await fs.readdir(fullPath))
.filter((iFile) => path.extname(iFile) === '.ydk')
.map((iFile) => path.join(file, path.basename(iFile, '.ydk')));
result = result.concat(innerDecks);
}
}
}
return result;
*/
let files: string[] = await fs.readdir(this.app.ygoproDeckPath);
return files.filter(file => path.extname(file) === '.ydk').map(file => path.basename(file, '.ydk'));
} catch (error) { } catch (error) {
console.error(`Load deck fail: ${error.toString()}`); console.error(`Load deck fail: ${error.toString()}`);
return []; return [];
} }
} }
deckGroup() {
return Object.entries(_.mapValues(_.groupBy(this.decks, p => path.dirname(p)), g => g.map(p => path.basename(p, '.ydk'))));
}
async get_replays(): Promise<string[]> { async get_replays(): Promise<string[]> {
try { try {
let files: string[] = await fs.readdir(this.app.ygoproReplayPath); let files: string[] = await fs.readdir(this.app.ygoproReplayPath);
...@@ -568,7 +541,7 @@ export class YGOProComponent implements OnInit, OnDestroy { ...@@ -568,7 +541,7 @@ export class YGOProComponent implements OnInit, OnDestroy {
// console.log(`Loading system conf from ${this.system_conf}`) // console.log(`Loading system conf from ${this.system_conf}`)
let data = await fs.readFile(this.system_conf, {encoding: 'utf-8'}); let data = await fs.readFile(this.system_conf, {encoding: 'utf-8'});
return data; return data;
} catch(e) { } catch (e) {
return null; return null;
} }
}; };
...@@ -598,7 +571,7 @@ export class YGOProComponent implements OnInit, OnDestroy { ...@@ -598,7 +571,7 @@ export class YGOProComponent implements OnInit, OnDestroy {
system_conf.lastdeck = deck; system_conf.lastdeck = deck;
await this.save_system_conf(system_conf);*/ await this.save_system_conf(system_conf);*/
// return this.start_game(['-d', deck]); // return this.start_game(['-d', deck]);
return this.start_game('deck', { deck }) return this.start_game('deck', {deck})
} }
async watch_replay(replay: string) { async watch_replay(replay: string) {
...@@ -606,7 +579,7 @@ export class YGOProComponent implements OnInit, OnDestroy { ...@@ -606,7 +579,7 @@ export class YGOProComponent implements OnInit, OnDestroy {
await this.fix_fonts(system_conf); await this.fix_fonts(system_conf);
await this.save_system_conf(system_conf);*/ await this.save_system_conf(system_conf);*/
// return this.start_game(['-r', path.join('replay', replay + '.yrp')]); // return this.start_game(['-r', path.join('replay', replay + '.yrp')]);
return this.start_game('replay', { replay: path.join(this.app.ygoproReplayPath, `${replay}.yrp`) }); return this.start_game('replay', {replay: path.join(this.app.ygoproReplayPath, `${replay}.yrp`)});
} }
join_windbot(name?: string) { join_windbot(name?: string) {
...@@ -899,7 +872,7 @@ export class YGOProComponent implements OnInit, OnDestroy { ...@@ -899,7 +872,7 @@ export class YGOProComponent implements OnInit, OnDestroy {
avatar_fallback(event) { avatar_fallback(event) {
if (!event.target.getAttribute('fallback')) { if (!event.target.getAttribute('fallback')) {
event.target.src = "images/noavatar.png"; event.target.src = 'images/noavatar.png';
event.target.setAttribute('fallback', true); event.target.setAttribute('fallback', true);
} }
} }
......
{ {
"name": "mycard", "name": "mycard",
"version": "3.0.54", "version": "3.0.55",
"lockfileVersion": 2, "lockfileVersion": 2,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"version": "3.0.54", "version": "3.0.55",
"hasInstallScript": true, "hasInstallScript": true,
"license": "UNLICENSED", "license": "UNLICENSED",
"dependencies": { "dependencies": {
...@@ -22,19 +22,20 @@ ...@@ -22,19 +22,20 @@
"@types/uuid": "^3.0.0", "@types/uuid": "^3.0.0",
"angular-in-memory-web-api": "0.3.2", "angular-in-memory-web-api": "0.3.2",
"aria2": "3.0.0", "aria2": "3.0.0",
"bootstrap": "4.0.0-alpha.6", "bootstrap": "^5.1.0",
"candy": "https://github.com/moecube/candy/releases/download/v2.2.0/candy.tar.gz", "candy": "https://github.com/moecube/candy/releases/download/v2.2.0/candy.tar.gz",
"candy-shop": "candy-chat/candy-plugins", "candy-shop": "candy-chat/candy-plugins",
"core-js": "2.4.1", "core-js": "2.4.1",
"electron-is-dev": "latest", "electron-is-dev": "latest",
"electron-sudo": "moecube/electron-sudo#998b7f19b123a6f2f469f79a2027ebb7b0223f9d", "electron-sudo": "moecube/electron-sudo#998b7f19b123a6f2f469f79a2027ebb7b0223f9d",
"electron-updater": "4.3.8", "electron-updater": "4.3.8",
"fast-glob": "^3.2.7",
"font-awesome": "4.7.0", "font-awesome": "4.7.0",
"fs-extra": "3.0.1", "fs-extra": "3.0.1",
"glob": "7.1.2", "glob": "7.1.2",
"ini": "1.3.4", "ini": "1.3.4",
"jquery": "2.2.4", "jquery": "2.2.4",
"jquery-i18n": "github:recurser/jquery-i18n", "jquery-i18n": "recurser/jquery-i18n",
"lodash": "^4.17.21", "lodash": "^4.17.21",
"marked": "0.3.6", "marked": "0.3.6",
"mustache": "^4.2.0", "mustache": "^4.2.0",
...@@ -50,7 +51,6 @@ ...@@ -50,7 +51,6 @@
"strophejs-plugin-roster": "^1.1.0", "strophejs-plugin-roster": "^1.1.0",
"systemjs": "0.20.15", "systemjs": "0.20.15",
"systemjs-plugin-text": "0.0.11", "systemjs-plugin-text": "0.0.11",
"tether": "latest",
"typeahead.js": "0.11.1", "typeahead.js": "0.11.1",
"uuid": "3.1.0", "uuid": "3.1.0",
"vue": "2.3.4", "vue": "2.3.4",
...@@ -67,7 +67,6 @@ ...@@ -67,7 +67,6 @@
"@types/marked": "latest", "@types/marked": "latest",
"@types/mustache": "^4.1.2", "@types/mustache": "^4.1.2",
"@types/node": "^14.0.1", "@types/node": "^14.0.1",
"@types/tether": "latest",
"@types/typeahead": "latest", "@types/typeahead": "latest",
"electron": "^4.2.12", "electron": "^4.2.12",
"electron-builder": "latest", "electron-builder": "latest",
...@@ -481,6 +480,48 @@ ...@@ -481,6 +480,48 @@
"node": ">= 10.0.0" "node": ">= 10.0.0"
} }
}, },
"node_modules/@nodelib/fs.scandir": {
"version": "2.1.5",
"resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
"integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
"dependencies": {
"@nodelib/fs.stat": "2.0.5",
"run-parallel": "^1.1.9"
},
"engines": {
"node": ">= 8"
}
},
"node_modules/@nodelib/fs.stat": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
"integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
"engines": {
"node": ">= 8"
}
},
"node_modules/@nodelib/fs.walk": {
"version": "1.2.8",
"resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
"integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
"dependencies": {
"@nodelib/fs.scandir": "2.1.5",
"fastq": "^1.6.0"
},
"engines": {
"node": ">= 8"
}
},
"node_modules/@popperjs/core": {
"version": "2.10.1",
"resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.10.1.tgz",
"integrity": "sha512-HnUhk1Sy9IuKrxEMdIRCxpIqPw6BFsbYSEUO9p/hNw5sMld/+3OLMWQP80F8/db9qsv3qUjs7ZR5bS/R+iinXw==",
"peer": true,
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/popperjs"
}
},
"node_modules/@sindresorhus/is": { "node_modules/@sindresorhus/is": {
"version": "0.14.0", "version": "0.14.0",
"resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz",
...@@ -614,12 +655,6 @@ ...@@ -614,12 +655,6 @@
"resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.7.tgz", "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.7.tgz",
"integrity": "sha512-4g1jrL98mdOIwSOUh6LTlB0Cs9I0dQPwINUhBg7C6pN4HLr8GS8xsksJxilW6S6dQHVi2K/o+lQuQcg7LroCnw==" "integrity": "sha512-4g1jrL98mdOIwSOUh6LTlB0Cs9I0dQPwINUhBg7C6pN4HLr8GS8xsksJxilW6S6dQHVi2K/o+lQuQcg7LroCnw=="
}, },
"node_modules/@types/tether": {
"version": "1.4.6",
"resolved": "https://registry.npmjs.org/@types/tether/-/tether-1.4.6.tgz",
"integrity": "sha512-9nHygDpiN1VPAkTXZyKOmdVK12EPp4KLgc7kj9ji0X6qsHzzQV8e7KYEh1afrF6TTVs5d9oRJXwkmjeSWc+5Cw==",
"dev": true
},
"node_modules/@types/typeahead": { "node_modules/@types/typeahead": {
"version": "0.11.32", "version": "0.11.32",
"resolved": "https://registry.npmjs.org/@types/typeahead/-/typeahead-0.11.32.tgz", "resolved": "https://registry.npmjs.org/@types/typeahead/-/typeahead-0.11.32.tgz",
...@@ -1055,22 +1090,17 @@ ...@@ -1055,22 +1090,17 @@
} }
}, },
"node_modules/bootstrap": { "node_modules/bootstrap": {
"version": "4.0.0-alpha.6", "version": "5.1.0",
"resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.0.0-alpha.6.tgz", "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.1.0.tgz",
"integrity": "sha1-T1TdM6wN6sOyhAe8LffsYIhpycg=", "integrity": "sha512-bs74WNI9BgBo3cEovmdMHikSKoXnDgA6VQjJ7TyTotU6L7d41ZyCEEelPwkYEzsG/Zjv3ie9IE3EMAje0W9Xew==",
"dependencies": { "funding": {
"jquery": ">=1.9.1", "type": "opencollective",
"tether": "^1.4.0" "url": "https://opencollective.com/bootstrap"
}, },
"engines": { "peerDependencies": {
"node": ">=4" "@popperjs/core": "^2.9.3"
} }
}, },
"node_modules/bootstrap/node_modules/tether": {
"version": "1.4.7",
"resolved": "https://registry.npmjs.org/tether/-/tether-1.4.7.tgz",
"integrity": "sha512-Z0J1aExjoFU8pybVkQAo/vD2wfSO63r+XOPfWQMC5qtf1bI7IWqNk4MiyBcgvvnY8kqnY06dVdvwTK2S3PU/Fw=="
},
"node_modules/boxen": { "node_modules/boxen": {
"version": "5.0.1", "version": "5.0.1",
"resolved": "https://registry.npmjs.org/boxen/-/boxen-5.0.1.tgz", "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.0.1.tgz",
...@@ -1164,6 +1194,17 @@ ...@@ -1164,6 +1194,17 @@
"concat-map": "0.0.1" "concat-map": "0.0.1"
} }
}, },
"node_modules/braces": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
"integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
"dependencies": {
"fill-range": "^7.0.1"
},
"engines": {
"node": ">=8"
}
},
"node_modules/buffer": { "node_modules/buffer": {
"version": "5.7.1", "version": "5.7.1",
"resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
...@@ -2529,12 +2570,35 @@ ...@@ -2529,12 +2570,35 @@
"integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
"dev": true "dev": true
}, },
"node_modules/fast-glob": {
"version": "3.2.7",
"resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz",
"integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==",
"dependencies": {
"@nodelib/fs.stat": "^2.0.2",
"@nodelib/fs.walk": "^1.2.3",
"glob-parent": "^5.1.2",
"merge2": "^1.3.0",
"micromatch": "^4.0.4"
},
"engines": {
"node": ">=8"
}
},
"node_modules/fast-json-stable-stringify": { "node_modules/fast-json-stable-stringify": {
"version": "2.1.0", "version": "2.1.0",
"resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
"integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
"dev": true "dev": true
}, },
"node_modules/fastq": {
"version": "1.12.0",
"resolved": "https://registry.npmjs.org/fastq/-/fastq-1.12.0.tgz",
"integrity": "sha512-VNX0QkHK3RsXVKr9KrlUv/FoTa0NdbYoHHl7uXHv2rzyHSlxjdNAKug2twd9luJxpcyNeAgf5iPPMutJO67Dfg==",
"dependencies": {
"reusify": "^1.0.4"
}
},
"node_modules/fd-slicer": { "node_modules/fd-slicer": {
"version": "1.1.0", "version": "1.1.0",
"resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
...@@ -2553,6 +2617,17 @@ ...@@ -2553,6 +2617,17 @@
"minimatch": "^3.0.4" "minimatch": "^3.0.4"
} }
}, },
"node_modules/fill-range": {
"version": "7.0.1",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
"integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
"dependencies": {
"to-regex-range": "^5.0.1"
},
"engines": {
"node": ">=8"
}
},
"node_modules/find-up": { "node_modules/find-up": {
"version": "1.1.2", "version": "1.1.2",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
...@@ -2722,6 +2797,17 @@ ...@@ -2722,6 +2797,17 @@
"node": "*" "node": "*"
} }
}, },
"node_modules/glob-parent": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
"integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
"dependencies": {
"is-glob": "^4.0.1"
},
"engines": {
"node": ">= 6"
}
},
"node_modules/global-dirs": { "node_modules/global-dirs": {
"version": "3.0.0", "version": "3.0.0",
"resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz",
...@@ -3399,6 +3485,14 @@ ...@@ -3399,6 +3485,14 @@
"url": "https://github.com/sponsors/ljharb" "url": "https://github.com/sponsors/ljharb"
} }
}, },
"node_modules/is-extglob": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
"integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/is-finite": { "node_modules/is-finite": {
"version": "1.1.0", "version": "1.1.0",
"resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz",
...@@ -3420,6 +3514,17 @@ ...@@ -3420,6 +3514,17 @@
"node": ">=4" "node": ">=4"
} }
}, },
"node_modules/is-glob": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
"integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
"dependencies": {
"is-extglob": "^2.1.1"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/is-installed-globally": { "node_modules/is-installed-globally": {
"version": "0.4.0", "version": "0.4.0",
"resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz",
...@@ -3454,6 +3559,14 @@ ...@@ -3454,6 +3559,14 @@
"url": "https://github.com/sponsors/sindresorhus" "url": "https://github.com/sponsors/sindresorhus"
} }
}, },
"node_modules/is-number": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
"integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
"engines": {
"node": ">=0.12.0"
}
},
"node_modules/is-obj": { "node_modules/is-obj": {
"version": "2.0.0", "version": "2.0.0",
"resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
...@@ -3934,6 +4047,26 @@ ...@@ -3934,6 +4047,26 @@
"integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
"dev": true "dev": true
}, },
"node_modules/merge2": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
"integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
"engines": {
"node": ">= 8"
}
},
"node_modules/micromatch": {
"version": "4.0.4",
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz",
"integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==",
"dependencies": {
"braces": "^3.0.1",
"picomatch": "^2.2.3"
},
"engines": {
"node": ">=8.6"
}
},
"node_modules/mime": { "node_modules/mime": {
"version": "2.5.2", "version": "2.5.2",
"resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz",
...@@ -4336,6 +4469,17 @@ ...@@ -4336,6 +4469,17 @@
"integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
"dev": true "dev": true
}, },
"node_modules/picomatch": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz",
"integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==",
"engines": {
"node": ">=8.6"
},
"funding": {
"url": "https://github.com/sponsors/jonschlinkert"
}
},
"node_modules/pify": { "node_modules/pify": {
"version": "2.3.0", "version": "2.3.0",
"resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
...@@ -4494,6 +4638,25 @@ ...@@ -4494,6 +4638,25 @@
"node": ">=0.6" "node": ">=0.6"
} }
}, },
"node_modules/queue-microtask": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
"integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/feross"
},
{
"type": "patreon",
"url": "https://www.patreon.com/feross"
},
{
"type": "consulting",
"url": "https://feross.org/support"
}
]
},
"node_modules/raven-js": { "node_modules/raven-js": {
"version": "3.16.1", "version": "3.16.1",
"resolved": "https://registry.npmjs.org/raven-js/-/raven-js-3.16.1.tgz", "resolved": "https://registry.npmjs.org/raven-js/-/raven-js-3.16.1.tgz",
...@@ -4713,6 +4876,15 @@ ...@@ -4713,6 +4876,15 @@
"lowercase-keys": "^1.0.0" "lowercase-keys": "^1.0.0"
} }
}, },
"node_modules/reusify": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
"integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
"engines": {
"iojs": ">=1.0.0",
"node": ">=0.10.0"
}
},
"node_modules/rimraf": { "node_modules/rimraf": {
"version": "3.0.2", "version": "3.0.2",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
...@@ -4820,6 +4992,28 @@ ...@@ -4820,6 +4992,28 @@
"estree-walker": "^0.6.1" "estree-walker": "^0.6.1"
} }
}, },
"node_modules/run-parallel": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
"integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/feross"
},
{
"type": "patreon",
"url": "https://www.patreon.com/feross"
},
{
"type": "consulting",
"url": "https://feross.org/support"
}
],
"dependencies": {
"queue-microtask": "^1.2.2"
}
},
"node_modules/rxjs": { "node_modules/rxjs": {
"version": "5.4.2", "version": "5.4.2",
"resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.4.2.tgz", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.4.2.tgz",
...@@ -5353,11 +5547,6 @@ ...@@ -5353,11 +5547,6 @@
"node": ">= 10.0.0" "node": ">= 10.0.0"
} }
}, },
"node_modules/tether": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/tether/-/tether-2.0.0.tgz",
"integrity": "sha512-iAkyBhwILpLIvkwzO5w5WUBtpYwxvzLRTO+sbzF3Uy7X4zznsy73v2b4sOQHXE3CQHeSNtB/YMU2Nn9tocbeBQ=="
},
"node_modules/throttleit": { "node_modules/throttleit": {
"version": "0.0.2", "version": "0.0.2",
"resolved": "https://registry.npmjs.org/throttleit/-/throttleit-0.0.2.tgz", "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-0.0.2.tgz",
...@@ -5428,6 +5617,17 @@ ...@@ -5428,6 +5617,17 @@
"node": ">=6" "node": ">=6"
} }
}, },
"node_modules/to-regex-range": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
"integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
"dependencies": {
"is-number": "^7.0.0"
},
"engines": {
"node": ">=8.0"
}
},
"node_modules/tough-cookie": { "node_modules/tough-cookie": {
"version": "2.5.0", "version": "2.5.0",
"resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
...@@ -6390,6 +6590,35 @@ ...@@ -6390,6 +6590,35 @@
} }
} }
}, },
"@nodelib/fs.scandir": {
"version": "2.1.5",
"resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
"integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
"requires": {
"@nodelib/fs.stat": "2.0.5",
"run-parallel": "^1.1.9"
}
},
"@nodelib/fs.stat": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
"integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="
},
"@nodelib/fs.walk": {
"version": "1.2.8",
"resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
"integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
"requires": {
"@nodelib/fs.scandir": "2.1.5",
"fastq": "^1.6.0"
}
},
"@popperjs/core": {
"version": "2.10.1",
"resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.10.1.tgz",
"integrity": "sha512-HnUhk1Sy9IuKrxEMdIRCxpIqPw6BFsbYSEUO9p/hNw5sMld/+3OLMWQP80F8/db9qsv3qUjs7ZR5bS/R+iinXw==",
"peer": true
},
"@sindresorhus/is": { "@sindresorhus/is": {
"version": "0.14.0", "version": "0.14.0",
"resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz",
...@@ -6517,12 +6746,6 @@ ...@@ -6517,12 +6746,6 @@
"resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.7.tgz", "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.7.tgz",
"integrity": "sha512-4g1jrL98mdOIwSOUh6LTlB0Cs9I0dQPwINUhBg7C6pN4HLr8GS8xsksJxilW6S6dQHVi2K/o+lQuQcg7LroCnw==" "integrity": "sha512-4g1jrL98mdOIwSOUh6LTlB0Cs9I0dQPwINUhBg7C6pN4HLr8GS8xsksJxilW6S6dQHVi2K/o+lQuQcg7LroCnw=="
}, },
"@types/tether": {
"version": "1.4.6",
"resolved": "https://registry.npmjs.org/@types/tether/-/tether-1.4.6.tgz",
"integrity": "sha512-9nHygDpiN1VPAkTXZyKOmdVK12EPp4KLgc7kj9ji0X6qsHzzQV8e7KYEh1afrF6TTVs5d9oRJXwkmjeSWc+5Cw==",
"dev": true
},
"@types/typeahead": { "@types/typeahead": {
"version": "0.11.32", "version": "0.11.32",
"resolved": "https://registry.npmjs.org/@types/typeahead/-/typeahead-0.11.32.tgz", "resolved": "https://registry.npmjs.org/@types/typeahead/-/typeahead-0.11.32.tgz",
...@@ -6870,20 +7093,10 @@ ...@@ -6870,20 +7093,10 @@
} }
}, },
"bootstrap": { "bootstrap": {
"version": "4.0.0-alpha.6", "version": "5.1.0",
"resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.0.0-alpha.6.tgz", "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.1.0.tgz",
"integrity": "sha1-T1TdM6wN6sOyhAe8LffsYIhpycg=", "integrity": "sha512-bs74WNI9BgBo3cEovmdMHikSKoXnDgA6VQjJ7TyTotU6L7d41ZyCEEelPwkYEzsG/Zjv3ie9IE3EMAje0W9Xew==",
"requires": { "requires": {}
"jquery": ">=1.9.1",
"tether": "^1.4.0"
},
"dependencies": {
"tether": {
"version": "1.4.7",
"resolved": "https://registry.npmjs.org/tether/-/tether-1.4.7.tgz",
"integrity": "sha512-Z0J1aExjoFU8pybVkQAo/vD2wfSO63r+XOPfWQMC5qtf1bI7IWqNk4MiyBcgvvnY8kqnY06dVdvwTK2S3PU/Fw=="
}
}
}, },
"boxen": { "boxen": {
"version": "5.0.1", "version": "5.0.1",
...@@ -6956,6 +7169,14 @@ ...@@ -6956,6 +7169,14 @@
"concat-map": "0.0.1" "concat-map": "0.0.1"
} }
}, },
"braces": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
"integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
"requires": {
"fill-range": "^7.0.1"
}
},
"buffer": { "buffer": {
"version": "5.7.1", "version": "5.7.1",
"resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
...@@ -8041,12 +8262,32 @@ ...@@ -8041,12 +8262,32 @@
"integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
"dev": true "dev": true
}, },
"fast-glob": {
"version": "3.2.7",
"resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz",
"integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==",
"requires": {
"@nodelib/fs.stat": "^2.0.2",
"@nodelib/fs.walk": "^1.2.3",
"glob-parent": "^5.1.2",
"merge2": "^1.3.0",
"micromatch": "^4.0.4"
}
},
"fast-json-stable-stringify": { "fast-json-stable-stringify": {
"version": "2.1.0", "version": "2.1.0",
"resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
"integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
"dev": true "dev": true
}, },
"fastq": {
"version": "1.12.0",
"resolved": "https://registry.npmjs.org/fastq/-/fastq-1.12.0.tgz",
"integrity": "sha512-VNX0QkHK3RsXVKr9KrlUv/FoTa0NdbYoHHl7uXHv2rzyHSlxjdNAKug2twd9luJxpcyNeAgf5iPPMutJO67Dfg==",
"requires": {
"reusify": "^1.0.4"
}
},
"fd-slicer": { "fd-slicer": {
"version": "1.1.0", "version": "1.1.0",
"resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
...@@ -8065,6 +8306,14 @@ ...@@ -8065,6 +8306,14 @@
"minimatch": "^3.0.4" "minimatch": "^3.0.4"
} }
}, },
"fill-range": {
"version": "7.0.1",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
"integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
"requires": {
"to-regex-range": "^5.0.1"
}
},
"find-up": { "find-up": {
"version": "1.1.2", "version": "1.1.2",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
...@@ -8202,6 +8451,14 @@ ...@@ -8202,6 +8451,14 @@
"path-is-absolute": "^1.0.0" "path-is-absolute": "^1.0.0"
} }
}, },
"glob-parent": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
"integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
"requires": {
"is-glob": "^4.0.1"
}
},
"global-dirs": { "global-dirs": {
"version": "3.0.0", "version": "3.0.0",
"resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz",
...@@ -8704,6 +8961,11 @@ ...@@ -8704,6 +8961,11 @@
"has": "^1.0.3" "has": "^1.0.3"
} }
}, },
"is-extglob": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
"integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI="
},
"is-finite": { "is-finite": {
"version": "1.1.0", "version": "1.1.0",
"resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz",
...@@ -8716,6 +8978,14 @@ ...@@ -8716,6 +8978,14 @@
"integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
"dev": true "dev": true
}, },
"is-glob": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
"integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
"requires": {
"is-extglob": "^2.1.1"
}
},
"is-installed-globally": { "is-installed-globally": {
"version": "0.4.0", "version": "0.4.0",
"resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz",
...@@ -8738,6 +9008,11 @@ ...@@ -8738,6 +9008,11 @@
"integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==", "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==",
"dev": true "dev": true
}, },
"is-number": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
"integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="
},
"is-obj": { "is-obj": {
"version": "2.0.0", "version": "2.0.0",
"resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
...@@ -8904,7 +9179,7 @@ ...@@ -8904,7 +9179,7 @@
}, },
"jquery-i18n": { "jquery-i18n": {
"version": "git+ssh://git@github.com/recurser/jquery-i18n.git#513d1493729a1bb3c5c1937fb8604cf2aedb7884", "version": "git+ssh://git@github.com/recurser/jquery-i18n.git#513d1493729a1bb3c5c1937fb8604cf2aedb7884",
"from": "jquery-i18n@github:recurser/jquery-i18n", "from": "jquery-i18n@recurser/jquery-i18n",
"requires": {} "requires": {}
}, },
"js-tokens": { "js-tokens": {
...@@ -9132,6 +9407,20 @@ ...@@ -9132,6 +9407,20 @@
"integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
"dev": true "dev": true
}, },
"merge2": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
"integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="
},
"micromatch": {
"version": "4.0.4",
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz",
"integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==",
"requires": {
"braces": "^3.0.1",
"picomatch": "^2.2.3"
}
},
"mime": { "mime": {
"version": "2.5.2", "version": "2.5.2",
"resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz",
...@@ -9455,6 +9744,11 @@ ...@@ -9455,6 +9744,11 @@
"integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
"dev": true "dev": true
}, },
"picomatch": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz",
"integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw=="
},
"pify": { "pify": {
"version": "2.3.0", "version": "2.3.0",
"resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
...@@ -9577,6 +9871,11 @@ ...@@ -9577,6 +9871,11 @@
"integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
"dev": true "dev": true
}, },
"queue-microtask": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
"integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="
},
"raven-js": { "raven-js": {
"version": "3.16.1", "version": "3.16.1",
"resolved": "https://registry.npmjs.org/raven-js/-/raven-js-3.16.1.tgz", "resolved": "https://registry.npmjs.org/raven-js/-/raven-js-3.16.1.tgz",
...@@ -9759,6 +10058,11 @@ ...@@ -9759,6 +10058,11 @@
"lowercase-keys": "^1.0.0" "lowercase-keys": "^1.0.0"
} }
}, },
"reusify": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
"integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw=="
},
"rimraf": { "rimraf": {
"version": "3.0.2", "version": "3.0.2",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
...@@ -9842,6 +10146,14 @@ ...@@ -9842,6 +10146,14 @@
"estree-walker": "^0.6.1" "estree-walker": "^0.6.1"
} }
}, },
"run-parallel": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
"integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
"requires": {
"queue-microtask": "^1.2.2"
}
},
"rxjs": { "rxjs": {
"version": "5.4.2", "version": "5.4.2",
"resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.4.2.tgz", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.4.2.tgz",
...@@ -10271,11 +10583,6 @@ ...@@ -10271,11 +10583,6 @@
} }
} }
}, },
"tether": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/tether/-/tether-2.0.0.tgz",
"integrity": "sha512-iAkyBhwILpLIvkwzO5w5WUBtpYwxvzLRTO+sbzF3Uy7X4zznsy73v2b4sOQHXE3CQHeSNtB/YMU2Nn9tocbeBQ=="
},
"throttleit": { "throttleit": {
"version": "0.0.2", "version": "0.0.2",
"resolved": "https://registry.npmjs.org/throttleit/-/throttleit-0.0.2.tgz", "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-0.0.2.tgz",
...@@ -10342,6 +10649,14 @@ ...@@ -10342,6 +10649,14 @@
"integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==",
"dev": true "dev": true
}, },
"to-regex-range": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
"integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
"requires": {
"is-number": "^7.0.0"
}
},
"tough-cookie": { "tough-cookie": {
"version": "2.5.0", "version": "2.5.0",
"resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
......
...@@ -36,13 +36,14 @@ ...@@ -36,13 +36,14 @@
"@types/uuid": "^3.0.0", "@types/uuid": "^3.0.0",
"angular-in-memory-web-api": "0.3.2", "angular-in-memory-web-api": "0.3.2",
"aria2": "3.0.0", "aria2": "3.0.0",
"bootstrap": "4.0.0-alpha.6", "bootstrap": "^5.1.0",
"candy": "https://github.com/moecube/candy/releases/download/v2.2.0/candy.tar.gz", "candy": "https://github.com/moecube/candy/releases/download/v2.2.0/candy.tar.gz",
"candy-shop": "candy-chat/candy-plugins", "candy-shop": "candy-chat/candy-plugins",
"core-js": "2.4.1", "core-js": "2.4.1",
"electron-is-dev": "latest", "electron-is-dev": "latest",
"electron-sudo": "moecube/electron-sudo#998b7f19b123a6f2f469f79a2027ebb7b0223f9d", "electron-sudo": "moecube/electron-sudo#998b7f19b123a6f2f469f79a2027ebb7b0223f9d",
"electron-updater": "4.3.8", "electron-updater": "4.3.8",
"fast-glob": "^3.2.7",
"font-awesome": "4.7.0", "font-awesome": "4.7.0",
"fs-extra": "3.0.1", "fs-extra": "3.0.1",
"glob": "7.1.2", "glob": "7.1.2",
...@@ -64,7 +65,6 @@ ...@@ -64,7 +65,6 @@
"strophejs-plugin-roster": "^1.1.0", "strophejs-plugin-roster": "^1.1.0",
"systemjs": "0.20.15", "systemjs": "0.20.15",
"systemjs-plugin-text": "0.0.11", "systemjs-plugin-text": "0.0.11",
"tether": "latest",
"typeahead.js": "0.11.1", "typeahead.js": "0.11.1",
"uuid": "3.1.0", "uuid": "3.1.0",
"vue": "2.3.4", "vue": "2.3.4",
...@@ -81,7 +81,6 @@ ...@@ -81,7 +81,6 @@
"@types/marked": "latest", "@types/marked": "latest",
"@types/mustache": "^4.1.2", "@types/mustache": "^4.1.2",
"@types/node": "^14.0.1", "@types/node": "^14.0.1",
"@types/tether": "latest",
"@types/typeahead": "latest", "@types/typeahead": "latest",
"electron": "^4.2.12", "electron": "^4.2.12",
"electron-builder": "latest", "electron-builder": "latest",
......
...@@ -75,13 +75,11 @@ System.config({ ...@@ -75,13 +75,11 @@ System.config({
"aria2": "@node/aria2", "aria2": "@node/aria2",
"electron-sudo": "@node/electron-sudo", "electron-sudo": "@node/electron-sudo",
'fs-extra': '@node/fs-extra', 'fs-extra': '@node/fs-extra',
'fast-glob': '@node/fast-glob',
'jquery': 'npm:jquery/dist/jquery.min.js', 'jquery': 'npm:jquery/dist/jquery.min.js',
'tether': 'npm:tether/dist/js/tether.min.js', 'bootstrap': 'npm:bootstrap/dist/js/bootstrap.bundle.min.js',
'bootstrap': 'npm:bootstrap/dist/js/bootstrap.min.js',
'reconnecting-websocket': 'npm:reconnecting-websocket/dist/index.js', 'reconnecting-websocket': 'npm:reconnecting-websocket/dist/index.js',
'popper.js': 'npm:popper.js/dist/umd/popper.min.js',
// 'typeahead.js': '@node/typeahead.js'
'raven-js': 'npm:raven-js', 'raven-js': 'npm:raven-js',
'strophe.js': 'npm:strophe.js/dist/strophe.umd.js', 'strophe.js': 'npm:strophe.js/dist/strophe.umd.js',
...@@ -105,12 +103,12 @@ System.config({ ...@@ -105,12 +103,12 @@ System.config({
main: 'dist/raven.js' main: 'dist/raven.js'
} }
}, },
meta: { // meta: {
bootstrap: { // bootstrap: {
globals: { // globals: {
jQuery: 'jquery', // jQuery: 'jquery',
Tether: 'tether' // Tether: 'tether'
} // }
} // }
} // }
}); });
...@@ -13,10 +13,11 @@ ...@@ -13,10 +13,11 @@
], ],
"suppressImplicitAnyIndexErrors": true, "suppressImplicitAnyIndexErrors": true,
"strict": false, "strict": false,
"skipLibCheck": true "skipLibCheck": true,
"skipDefaultLibCheck": true
}, },
"exclude": [ "exclude": [
"node_modules/*", "node_modules",
"**/*-aot.ts" "**/*-aot.ts"
] ]
} }
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment