Merge remote-tracking branch 'misskey-original/develop' into develop
# Conflicts: # package.json
This commit is contained in:
commit
79d2b6fe9e
|
@ -9879,6 +9879,26 @@ export interface Locale extends ILocale {
|
||||||
* 対局がキャンセルされました
|
* 対局がキャンセルされました
|
||||||
*/
|
*/
|
||||||
"gameCanceled": string;
|
"gameCanceled": string;
|
||||||
|
/**
|
||||||
|
* 開始時に対局をタイムラインに投稿
|
||||||
|
*/
|
||||||
|
"shareToTlTheGameWhenStart": string;
|
||||||
|
/**
|
||||||
|
* 対局を開始しました! #MisskeyReversi
|
||||||
|
*/
|
||||||
|
"iStartedAGame": string;
|
||||||
|
/**
|
||||||
|
* 相手が設定を変更しました
|
||||||
|
*/
|
||||||
|
"opponentHasSettingsChanged": string;
|
||||||
|
/**
|
||||||
|
* 変則許可 (完全フリー)
|
||||||
|
*/
|
||||||
|
"allowIrregularRules": string;
|
||||||
|
/**
|
||||||
|
* 変則なし
|
||||||
|
*/
|
||||||
|
"disallowIrregularRules": string;
|
||||||
};
|
};
|
||||||
"_offlineScreen": {
|
"_offlineScreen": {
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -2630,6 +2630,11 @@ _reversi:
|
||||||
freeMatch: "フリーマッチ"
|
freeMatch: "フリーマッチ"
|
||||||
lookingForPlayer: "対戦相手を探しています"
|
lookingForPlayer: "対戦相手を探しています"
|
||||||
gameCanceled: "対局がキャンセルされました"
|
gameCanceled: "対局がキャンセルされました"
|
||||||
|
shareToTlTheGameWhenStart: "開始時に対局をタイムラインに投稿"
|
||||||
|
iStartedAGame: "対局を開始しました! #MisskeyReversi"
|
||||||
|
opponentHasSettingsChanged: "相手が設定を変更しました"
|
||||||
|
allowIrregularRules: "変則許可 (完全フリー)"
|
||||||
|
disallowIrregularRules: "変則なし"
|
||||||
|
|
||||||
_offlineScreen:
|
_offlineScreen:
|
||||||
title: "オフライン - サーバーに接続できません"
|
title: "オフライン - サーバーに接続できません"
|
||||||
|
|
|
@ -380,8 +380,11 @@ hcaptcha: "hCaptcha(キャプチャ)"
|
||||||
enableHcaptcha: "hCaptcha(キャプチャ)をつけとく"
|
enableHcaptcha: "hCaptcha(キャプチャ)をつけとく"
|
||||||
hcaptchaSiteKey: "サイトキー"
|
hcaptchaSiteKey: "サイトキー"
|
||||||
hcaptchaSecretKey: "シークレットキー"
|
hcaptchaSecretKey: "シークレットキー"
|
||||||
|
mcaptcha: "mCaptcha"
|
||||||
|
enableMcaptcha: "hCaptcha(キャプチャ)をつけとく"
|
||||||
mcaptchaSiteKey: "サイトキー"
|
mcaptchaSiteKey: "サイトキー"
|
||||||
mcaptchaSecretKey: "シークレットキー"
|
mcaptchaSecretKey: "シークレットキー"
|
||||||
|
mcaptchaInstanceUrl: "mCaptchaのインスタンスのURL"
|
||||||
recaptcha: "reCAPTCHA"
|
recaptcha: "reCAPTCHA"
|
||||||
enableRecaptcha: "reCAPTCHA(リキャプチャ)を有効にする"
|
enableRecaptcha: "reCAPTCHA(リキャプチャ)を有効にする"
|
||||||
recaptchaSiteKey: "サイトキー"
|
recaptchaSiteKey: "サイトキー"
|
||||||
|
@ -629,6 +632,7 @@ medium: "中"
|
||||||
small: "小"
|
small: "小"
|
||||||
generateAccessToken: "アクセストークンの発行"
|
generateAccessToken: "アクセストークンの発行"
|
||||||
permission: "権限"
|
permission: "権限"
|
||||||
|
adminPermission: "管理者権限"
|
||||||
enableAll: "全部使えるようにする"
|
enableAll: "全部使えるようにする"
|
||||||
disableAll: "全部使えへんようにする"
|
disableAll: "全部使えへんようにする"
|
||||||
tokenRequested: "アカウントへのアクセス許してやったらどうや"
|
tokenRequested: "アカウントへのアクセス許してやったらどうや"
|
||||||
|
@ -1055,6 +1059,8 @@ limitWidthOfReaction: "ツッコミの最大横幅を制限して、ちっさく
|
||||||
noteIdOrUrl: "ノートIDかURL"
|
noteIdOrUrl: "ノートIDかURL"
|
||||||
video: "動画"
|
video: "動画"
|
||||||
videos: "動画"
|
videos: "動画"
|
||||||
|
audio: "音声"
|
||||||
|
audioFiles: "音声"
|
||||||
dataSaver: "データケチケチ"
|
dataSaver: "データケチケチ"
|
||||||
accountMigration: "アカウントのお引っ越し"
|
accountMigration: "アカウントのお引っ越し"
|
||||||
accountMoved: "このユーザーはさらのアカウントに引っ越したで:"
|
accountMoved: "このユーザーはさらのアカウントに引っ越したで:"
|
||||||
|
@ -1187,7 +1193,25 @@ seasonalScreenEffect: "季節にあった画面の動き"
|
||||||
decorate: "デコる"
|
decorate: "デコる"
|
||||||
addMfmFunction: "装飾つける"
|
addMfmFunction: "装飾つける"
|
||||||
enableQuickAddMfmFunction: "ややこしいMFMのピッカーを出す"
|
enableQuickAddMfmFunction: "ややこしいMFMのピッカーを出す"
|
||||||
|
bubbleGame: "バブルゲーム"
|
||||||
|
sfx: "効果音"
|
||||||
|
soundWillBePlayed: "サウンドが再生されるで"
|
||||||
|
showReplay: "リプレイ見る"
|
||||||
|
replay: "リプレイ"
|
||||||
|
replaying: "リプレイ中"
|
||||||
|
ranking: "ランキング"
|
||||||
lastNDays: "直近{n}日"
|
lastNDays: "直近{n}日"
|
||||||
|
backToTitle: "タイトルへ"
|
||||||
|
hemisphere: "住んでる地域"
|
||||||
|
withSensitive: "センシティブなファイルを含むノートを表示"
|
||||||
|
userSaysSomethingSensitive: "{name}のセンシティブなファイルを含む投稿"
|
||||||
|
enableHorizontalSwipe: "スワイプしてタブを切り替える"
|
||||||
|
_bubbleGame:
|
||||||
|
howToPlay: "遊び方"
|
||||||
|
_howToPlay:
|
||||||
|
section1: "位置を調整してハコにモノを落とすで。"
|
||||||
|
section2: "同じもんがくっついたら別のやつになって、スコアがもらえるで。"
|
||||||
|
section3: "モノがハコからあふれたらゲームオーバーや。ハコからあふれんようにしながらモノを融合させてハイスコアを目指しいや!"
|
||||||
_announcement:
|
_announcement:
|
||||||
forExistingUsers: "もうおるユーザーのみ"
|
forExistingUsers: "もうおるユーザーのみ"
|
||||||
forExistingUsersDescription: "オンにしたらこのお知らせができた時点でおる人らにだけお知らせが行くで。切ったらこの知らせが行ったあとにアカウント作った人にもちゃんとお知らせが行くで。"
|
forExistingUsersDescription: "オンにしたらこのお知らせができた時点でおる人らにだけお知らせが行くで。切ったらこの知らせが行ったあとにアカウント作った人にもちゃんとお知らせが行くで。"
|
||||||
|
@ -1558,6 +1582,13 @@ _achievements:
|
||||||
_tutorialCompleted:
|
_tutorialCompleted:
|
||||||
title: "Misskeyひよっこ講座 修了証"
|
title: "Misskeyひよっこ講座 修了証"
|
||||||
description: "チュートリアル全部やった"
|
description: "チュートリアル全部やった"
|
||||||
|
_bubbleGameExplodingHead:
|
||||||
|
title: "🤯"
|
||||||
|
description: "バブルゲームで最も大きいモノを出した"
|
||||||
|
_bubbleGameDoubleExplodingHead:
|
||||||
|
title: "ダブル🤯"
|
||||||
|
description: "バブルゲームで最も大きいモノを2つ同時に出した"
|
||||||
|
flavor: "これくらいの おべんとばこに 🤯 🤯 ちょっとつめて"
|
||||||
_role:
|
_role:
|
||||||
new: "ロールの作成"
|
new: "ロールの作成"
|
||||||
edit: "ロールの編集"
|
edit: "ロールの編集"
|
||||||
|
@ -2410,6 +2441,51 @@ _dataSaver:
|
||||||
_code:
|
_code:
|
||||||
title: "コードハイライト"
|
title: "コードハイライト"
|
||||||
description: "MFMとかでコードハイライト記法が使われてるとき、タップするまで読み込まれへんくなるで。コードハイライトではハイライトする言語ごとにその決めてるファイルを読む必要はあんねんな。けどな、それは自動で読み込まれなくなるから、通信量を少なくできることができるねん。"
|
description: "MFMとかでコードハイライト記法が使われてるとき、タップするまで読み込まれへんくなるで。コードハイライトではハイライトする言語ごとにその決めてるファイルを読む必要はあんねんな。けどな、それは自動で読み込まれなくなるから、通信量を少なくできることができるねん。"
|
||||||
|
_hemisphere:
|
||||||
|
N: "北半球"
|
||||||
|
S: "南半球"
|
||||||
|
caption: "一部のクライアント設定で、季節を判定するのに使用するで。"
|
||||||
_reversi:
|
_reversi:
|
||||||
|
reversi: "リバーシ"
|
||||||
|
gameSettings: "対局の設定"
|
||||||
|
chooseBoard: "ボードを選択"
|
||||||
|
blackOrWhite: "先行/後攻"
|
||||||
|
blackIs: "{name}が黒(先行)"
|
||||||
|
rules: "ルール"
|
||||||
|
thisGameIsStartedSoon: "対局、そろそろ開始されるで。"
|
||||||
|
waitingForOther: "相手の準備が完了するのを待ってんで。"
|
||||||
|
waitingForMe: "あんさんの準備が完了すんのを待ってんで"
|
||||||
|
waitingBoth: "準備してなー"
|
||||||
|
ready: "準備完了"
|
||||||
|
cancelReady: "準備を再開"
|
||||||
|
opponentTurn: "相手のターンやで"
|
||||||
|
myTurn: "あんさんのターンや"
|
||||||
|
turnOf: "{name}のターンやで"
|
||||||
|
pastTurnOf: "{name}のターン"
|
||||||
|
surrender: "投了"
|
||||||
|
surrendered: "投了により"
|
||||||
|
timeout: "時間切れ"
|
||||||
|
drawn: "引き分け"
|
||||||
|
won: "{name}の勝ち"
|
||||||
|
black: "黒"
|
||||||
|
white: "白"
|
||||||
total: "合計"
|
total: "合計"
|
||||||
|
turnCount: "{count}ターン目"
|
||||||
|
myGames: "自分の対局"
|
||||||
|
allGames: "みんなの対局"
|
||||||
|
ended: "終了"
|
||||||
|
playing: "対局中"
|
||||||
|
isLlotheo: "石の少ない方が勝ち(ロセオ)"
|
||||||
|
loopedMap: "ループマップ"
|
||||||
|
canPutEverywhere: "どこでも置けるモード"
|
||||||
|
timeLimitForEachTurn: "1ターンの時間制限"
|
||||||
|
freeMatch: "フリーマッチ"
|
||||||
|
lookingForPlayer: "対戦相手を探してるで"
|
||||||
|
gameCanceled: "対局がキャンセルされたわ"
|
||||||
|
shareToTlTheGameWhenStart: "初めの時に対局をタイムラインに投稿するで"
|
||||||
|
iStartedAGame: "対局し始めたで! #MisskeyReversi"
|
||||||
|
opponentHasSettingsChanged: "相手が設定変えたで"
|
||||||
|
_offlineScreen:
|
||||||
|
title: "オフライン - サーバーに接続できひんで"
|
||||||
|
header: "サーバーに接続できへんわ"
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "misskey",
|
"name": "misskey",
|
||||||
"version": "2024.2.0-beta.4-PrisMisskey.1",
|
"version": "2024.2.0-beta.6-PrisMisskey.1",
|
||||||
"codename": "nasubi",
|
"codename": "nasubi",
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
|
|
|
@ -0,0 +1,16 @@
|
||||||
|
/*
|
||||||
|
* SPDX-FileCopyrightText: syuilo and other misskey contributors
|
||||||
|
* SPDX-License-Identifier: AGPL-3.0-only
|
||||||
|
*/
|
||||||
|
|
||||||
|
export class Reversi61706081514499 {
|
||||||
|
name = 'Reversi61706081514499'
|
||||||
|
|
||||||
|
async up(queryRunner) {
|
||||||
|
await queryRunner.query(`ALTER TABLE "reversi_game" ADD "noIrregularRules" boolean NOT NULL DEFAULT false`);
|
||||||
|
}
|
||||||
|
|
||||||
|
async down(queryRunner) {
|
||||||
|
await queryRunner.query(`ALTER TABLE "reversi_game" DROP COLUMN "noIrregularRules"`);
|
||||||
|
}
|
||||||
|
}
|
|
@ -7,7 +7,7 @@ import { Inject, Injectable } from '@nestjs/common';
|
||||||
import * as Redis from 'ioredis';
|
import * as Redis from 'ioredis';
|
||||||
import { ModuleRef } from '@nestjs/core';
|
import { ModuleRef } from '@nestjs/core';
|
||||||
import * as Reversi from 'misskey-reversi';
|
import * as Reversi from 'misskey-reversi';
|
||||||
import { IsNull } from 'typeorm';
|
import { IsNull, LessThan, MoreThan } from 'typeorm';
|
||||||
import type {
|
import type {
|
||||||
MiReversiGame,
|
MiReversiGame,
|
||||||
ReversiGamesRepository,
|
ReversiGamesRepository,
|
||||||
|
@ -24,7 +24,7 @@ import { Serialized } from '@/types.js';
|
||||||
import { ReversiGameEntityService } from './entities/ReversiGameEntityService.js';
|
import { ReversiGameEntityService } from './entities/ReversiGameEntityService.js';
|
||||||
import type { OnApplicationShutdown, OnModuleInit } from '@nestjs/common';
|
import type { OnApplicationShutdown, OnModuleInit } from '@nestjs/common';
|
||||||
|
|
||||||
const MATCHING_TIMEOUT_MS = 1000 * 15; // 15sec
|
const INVITATION_TIMEOUT_MS = 1000 * 20; // 20sec
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class ReversiService implements OnApplicationShutdown, OnModuleInit {
|
export class ReversiService implements OnApplicationShutdown, OnModuleInit {
|
||||||
|
@ -85,18 +85,35 @@ export class ReversiService implements OnApplicationShutdown, OnModuleInit {
|
||||||
map: game.map,
|
map: game.map,
|
||||||
bw: game.bw,
|
bw: game.bw,
|
||||||
crc32: game.crc32,
|
crc32: game.crc32,
|
||||||
|
noIrregularRules: game.noIrregularRules,
|
||||||
} satisfies Partial<MiReversiGame>;
|
} satisfies Partial<MiReversiGame>;
|
||||||
}
|
}
|
||||||
|
|
||||||
@bindThis
|
@bindThis
|
||||||
public async matchSpecificUser(me: MiUser, targetUser: MiUser): Promise<MiReversiGame | null> {
|
public async matchSpecificUser(me: MiUser, targetUser: MiUser, multiple = false): Promise<MiReversiGame | null> {
|
||||||
if (targetUser.id === me.id) {
|
if (targetUser.id === me.id) {
|
||||||
throw new Error('You cannot match yourself.');
|
throw new Error('You cannot match yourself.');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!multiple) {
|
||||||
|
// 既にマッチしている対局が無いか探す(3分以内)
|
||||||
|
const games = await this.reversiGamesRepository.find({
|
||||||
|
where: [
|
||||||
|
{ id: MoreThan(this.idService.gen(Date.now() - 1000 * 60 * 3)), user1Id: me.id, user2Id: targetUser.id, isStarted: false },
|
||||||
|
{ id: MoreThan(this.idService.gen(Date.now() - 1000 * 60 * 3)), user1Id: targetUser.id, user2Id: me.id, isStarted: false },
|
||||||
|
],
|
||||||
|
relations: ['user1', 'user2'],
|
||||||
|
order: { id: 'DESC' },
|
||||||
|
});
|
||||||
|
if (games.length > 0) {
|
||||||
|
return games[0];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//#region 相手から既に招待されてないか確認
|
||||||
const invitations = await this.redisClient.zrange(
|
const invitations = await this.redisClient.zrange(
|
||||||
`reversi:matchSpecific:${me.id}`,
|
`reversi:matchSpecific:${me.id}`,
|
||||||
Date.now() - MATCHING_TIMEOUT_MS,
|
Date.now() - INVITATION_TIMEOUT_MS,
|
||||||
'+inf',
|
'+inf',
|
||||||
'BYSCORE');
|
'BYSCORE');
|
||||||
|
|
||||||
|
@ -106,23 +123,42 @@ export class ReversiService implements OnApplicationShutdown, OnModuleInit {
|
||||||
const game = await this.matched(targetUser.id, me.id);
|
const game = await this.matched(targetUser.id, me.id);
|
||||||
|
|
||||||
return game;
|
return game;
|
||||||
} else {
|
|
||||||
this.redisClient.zadd(`reversi:matchSpecific:${targetUser.id}`, Date.now(), me.id);
|
|
||||||
|
|
||||||
this.globalEventService.publishReversiStream(targetUser.id, 'invited', {
|
|
||||||
user: await this.userEntityService.pack(me, targetUser),
|
|
||||||
});
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
|
//#endregion
|
||||||
|
|
||||||
|
const redisPipeline = this.redisClient.pipeline();
|
||||||
|
redisPipeline.zadd(`reversi:matchSpecific:${targetUser.id}`, Date.now(), me.id);
|
||||||
|
redisPipeline.expire(`reversi:matchSpecific:${targetUser.id}`, 120, 'NX');
|
||||||
|
await redisPipeline.exec();
|
||||||
|
|
||||||
|
this.globalEventService.publishReversiStream(targetUser.id, 'invited', {
|
||||||
|
user: await this.userEntityService.pack(me, targetUser),
|
||||||
|
});
|
||||||
|
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@bindThis
|
@bindThis
|
||||||
public async matchAnyUser(me: MiUser): Promise<MiReversiGame | null> {
|
public async matchAnyUser(me: MiUser, options: { noIrregularRules: boolean }, multiple = false): Promise<MiReversiGame | null> {
|
||||||
|
if (!multiple) {
|
||||||
|
// 既にマッチしている対局が無いか探す(3分以内)
|
||||||
|
const games = await this.reversiGamesRepository.find({
|
||||||
|
where: [
|
||||||
|
{ id: MoreThan(this.idService.gen(Date.now() - 1000 * 60 * 3)), user1Id: me.id, isStarted: false },
|
||||||
|
{ id: MoreThan(this.idService.gen(Date.now() - 1000 * 60 * 3)), user2Id: me.id, isStarted: false },
|
||||||
|
],
|
||||||
|
relations: ['user1', 'user2'],
|
||||||
|
order: { id: 'DESC' },
|
||||||
|
});
|
||||||
|
if (games.length > 0) {
|
||||||
|
return games[0];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//#region まず自分宛ての招待を探す
|
//#region まず自分宛ての招待を探す
|
||||||
const invitations = await this.redisClient.zrange(
|
const invitations = await this.redisClient.zrange(
|
||||||
`reversi:matchSpecific:${me.id}`,
|
`reversi:matchSpecific:${me.id}`,
|
||||||
Date.now() - MATCHING_TIMEOUT_MS,
|
Date.now() - INVITATION_TIMEOUT_MS,
|
||||||
'+inf',
|
'+inf',
|
||||||
'BYSCORE');
|
'BYSCORE');
|
||||||
|
|
||||||
|
@ -138,23 +174,35 @@ export class ReversiService implements OnApplicationShutdown, OnModuleInit {
|
||||||
|
|
||||||
const matchings = await this.redisClient.zrange(
|
const matchings = await this.redisClient.zrange(
|
||||||
'reversi:matchAny',
|
'reversi:matchAny',
|
||||||
Date.now() - MATCHING_TIMEOUT_MS,
|
0,
|
||||||
'+inf',
|
2, // 自分自身のIDが入っている場合もあるので2つ取得
|
||||||
'BYSCORE');
|
'REV');
|
||||||
|
|
||||||
const userIds = matchings.filter(id => id !== me.id);
|
const items = matchings.filter(id => !id.startsWith(me.id));
|
||||||
|
|
||||||
if (userIds.length > 0) {
|
if (items.length > 0) {
|
||||||
// pick random
|
const [matchedUserId, option] = items[0].split(':');
|
||||||
const matchedUserId = userIds[Math.floor(Math.random() * userIds.length)];
|
|
||||||
|
|
||||||
await this.redisClient.zrem('reversi:matchAny', me.id, matchedUserId);
|
await this.redisClient.zrem('reversi:matchAny',
|
||||||
|
me.id,
|
||||||
|
matchedUserId,
|
||||||
|
me.id + ':noIrregularRules',
|
||||||
|
matchedUserId + ':noIrregularRules');
|
||||||
|
|
||||||
const game = await this.matched(matchedUserId, me.id);
|
const game = await this.matched(matchedUserId, me.id, {
|
||||||
|
noIrregularRules: options.noIrregularRules || option === 'noIrregularRules',
|
||||||
|
});
|
||||||
|
|
||||||
return game;
|
return game;
|
||||||
} else {
|
} else {
|
||||||
await this.redisClient.zadd('reversi:matchAny', Date.now(), me.id);
|
const redisPipeline = this.redisClient.pipeline();
|
||||||
|
if (options.noIrregularRules) {
|
||||||
|
redisPipeline.zadd('reversi:matchAny', Date.now(), me.id + ':noIrregularRules');
|
||||||
|
} else {
|
||||||
|
redisPipeline.zadd('reversi:matchAny', Date.now(), me.id);
|
||||||
|
}
|
||||||
|
redisPipeline.expire('reversi:matchAny', 15, 'NX');
|
||||||
|
await redisPipeline.exec();
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -166,7 +214,18 @@ export class ReversiService implements OnApplicationShutdown, OnModuleInit {
|
||||||
|
|
||||||
@bindThis
|
@bindThis
|
||||||
public async matchAnyUserCancel(user: MiUser) {
|
public async matchAnyUserCancel(user: MiUser) {
|
||||||
await this.redisClient.zrem('reversi:matchAny', user.id);
|
const redisPipeline = this.redisClient.pipeline();
|
||||||
|
redisPipeline.zrem('reversi:matchAny', user.id);
|
||||||
|
redisPipeline.zrem('reversi:matchAny', user.id + ':noIrregularRules');
|
||||||
|
await redisPipeline.exec();
|
||||||
|
}
|
||||||
|
|
||||||
|
@bindThis
|
||||||
|
public async cleanOutdatedGames() {
|
||||||
|
await this.reversiGamesRepository.delete({
|
||||||
|
id: LessThan(this.idService.gen(Date.now() - 1000 * 60 * 10)),
|
||||||
|
isStarted: false,
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@bindThis
|
@bindThis
|
||||||
|
@ -220,7 +279,7 @@ export class ReversiService implements OnApplicationShutdown, OnModuleInit {
|
||||||
}
|
}
|
||||||
|
|
||||||
@bindThis
|
@bindThis
|
||||||
private async matched(parentId: MiUser['id'], childId: MiUser['id']): Promise<MiReversiGame> {
|
private async matched(parentId: MiUser['id'], childId: MiUser['id'], options: { noIrregularRules: boolean; }): Promise<MiReversiGame> {
|
||||||
const game = await this.reversiGamesRepository.insert({
|
const game = await this.reversiGamesRepository.insert({
|
||||||
id: this.idService.gen(),
|
id: this.idService.gen(),
|
||||||
user1Id: parentId,
|
user1Id: parentId,
|
||||||
|
@ -233,6 +292,7 @@ export class ReversiService implements OnApplicationShutdown, OnModuleInit {
|
||||||
map: Reversi.maps.eighteight.data,
|
map: Reversi.maps.eighteight.data,
|
||||||
bw: 'random',
|
bw: 'random',
|
||||||
isLlotheo: false,
|
isLlotheo: false,
|
||||||
|
noIrregularRules: options.noIrregularRules,
|
||||||
}).then(x => this.reversiGamesRepository.findOneOrFail({
|
}).then(x => this.reversiGamesRepository.findOneOrFail({
|
||||||
where: { id: x.identifiers[0].id },
|
where: { id: x.identifiers[0].id },
|
||||||
relations: ['user1', 'user2'],
|
relations: ['user1', 'user2'],
|
||||||
|
@ -334,7 +394,7 @@ export class ReversiService implements OnApplicationShutdown, OnModuleInit {
|
||||||
public async getInvitations(user: MiUser): Promise<MiUser['id'][]> {
|
public async getInvitations(user: MiUser): Promise<MiUser['id'][]> {
|
||||||
const invitations = await this.redisClient.zrange(
|
const invitations = await this.redisClient.zrange(
|
||||||
`reversi:matchSpecific:${user.id}`,
|
`reversi:matchSpecific:${user.id}`,
|
||||||
Date.now() - MATCHING_TIMEOUT_MS,
|
Date.now() - INVITATION_TIMEOUT_MS,
|
||||||
'+inf',
|
'+inf',
|
||||||
'BYSCORE');
|
'BYSCORE');
|
||||||
return invitations;
|
return invitations;
|
||||||
|
|
|
@ -61,6 +61,7 @@ export class ReversiGameEntityService {
|
||||||
canPutEverywhere: game.canPutEverywhere,
|
canPutEverywhere: game.canPutEverywhere,
|
||||||
loopedBoard: game.loopedBoard,
|
loopedBoard: game.loopedBoard,
|
||||||
timeLimitForEachTurn: game.timeLimitForEachTurn,
|
timeLimitForEachTurn: game.timeLimitForEachTurn,
|
||||||
|
noIrregularRules: game.noIrregularRules,
|
||||||
logs: game.logs,
|
logs: game.logs,
|
||||||
map: game.map,
|
map: game.map,
|
||||||
});
|
});
|
||||||
|
@ -105,6 +106,7 @@ export class ReversiGameEntityService {
|
||||||
canPutEverywhere: game.canPutEverywhere,
|
canPutEverywhere: game.canPutEverywhere,
|
||||||
loopedBoard: game.loopedBoard,
|
loopedBoard: game.loopedBoard,
|
||||||
timeLimitForEachTurn: game.timeLimitForEachTurn,
|
timeLimitForEachTurn: game.timeLimitForEachTurn,
|
||||||
|
noIrregularRules: game.noIrregularRules,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -106,6 +106,11 @@ export class MiReversiGame {
|
||||||
})
|
})
|
||||||
public bw: string;
|
public bw: string;
|
||||||
|
|
||||||
|
@Column('boolean', {
|
||||||
|
default: false,
|
||||||
|
})
|
||||||
|
public noIrregularRules: boolean;
|
||||||
|
|
||||||
@Column('boolean', {
|
@Column('boolean', {
|
||||||
default: false,
|
default: false,
|
||||||
})
|
})
|
||||||
|
|
|
@ -82,6 +82,10 @@ export const packedReversiGameLiteSchema = {
|
||||||
type: 'string',
|
type: 'string',
|
||||||
optional: false, nullable: false,
|
optional: false, nullable: false,
|
||||||
},
|
},
|
||||||
|
noIrregularRules: {
|
||||||
|
type: 'boolean',
|
||||||
|
optional: false, nullable: false,
|
||||||
|
},
|
||||||
isLlotheo: {
|
isLlotheo: {
|
||||||
type: 'boolean',
|
type: 'boolean',
|
||||||
optional: false, nullable: false,
|
optional: false, nullable: false,
|
||||||
|
@ -196,6 +200,10 @@ export const packedReversiGameDetailedSchema = {
|
||||||
type: 'string',
|
type: 'string',
|
||||||
optional: false, nullable: false,
|
optional: false, nullable: false,
|
||||||
},
|
},
|
||||||
|
noIrregularRules: {
|
||||||
|
type: 'boolean',
|
||||||
|
optional: false, nullable: false,
|
||||||
|
},
|
||||||
isLlotheo: {
|
isLlotheo: {
|
||||||
type: 'boolean',
|
type: 'boolean',
|
||||||
optional: false, nullable: false,
|
optional: false, nullable: false,
|
||||||
|
|
|
@ -11,6 +11,7 @@ import type Logger from '@/logger.js';
|
||||||
import { bindThis } from '@/decorators.js';
|
import { bindThis } from '@/decorators.js';
|
||||||
import { IdService } from '@/core/IdService.js';
|
import { IdService } from '@/core/IdService.js';
|
||||||
import type { Config } from '@/config.js';
|
import type { Config } from '@/config.js';
|
||||||
|
import { ReversiService } from '@/core/ReversiService.js';
|
||||||
import { QueueLoggerService } from '../QueueLoggerService.js';
|
import { QueueLoggerService } from '../QueueLoggerService.js';
|
||||||
import type * as Bull from 'bullmq';
|
import type * as Bull from 'bullmq';
|
||||||
|
|
||||||
|
@ -32,6 +33,7 @@ export class CleanProcessorService {
|
||||||
private roleAssignmentsRepository: RoleAssignmentsRepository,
|
private roleAssignmentsRepository: RoleAssignmentsRepository,
|
||||||
|
|
||||||
private queueLoggerService: QueueLoggerService,
|
private queueLoggerService: QueueLoggerService,
|
||||||
|
private reversiService: ReversiService,
|
||||||
private idService: IdService,
|
private idService: IdService,
|
||||||
) {
|
) {
|
||||||
this.logger = this.queueLoggerService.logger.createSubLogger('clean');
|
this.logger = this.queueLoggerService.logger.createSubLogger('clean');
|
||||||
|
@ -65,6 +67,8 @@ export class CleanProcessorService {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this.reversiService.cleanOutdatedGames();
|
||||||
|
|
||||||
this.logger.succ('Cleaned.');
|
this.logger.succ('Cleaned.');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -43,7 +43,6 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
|
||||||
) {
|
) {
|
||||||
super(meta, paramDef, async (ps, me) => {
|
super(meta, paramDef, async (ps, me) => {
|
||||||
const query = this.queryService.makePaginationQuery(this.reversiGamesRepository.createQueryBuilder('game'), ps.sinceId, ps.untilId)
|
const query = this.queryService.makePaginationQuery(this.reversiGamesRepository.createQueryBuilder('game'), ps.sinceId, ps.untilId)
|
||||||
.andWhere('game.isStarted = TRUE')
|
|
||||||
.innerJoinAndSelect('game.user1', 'user1')
|
.innerJoinAndSelect('game.user1', 'user1')
|
||||||
.innerJoinAndSelect('game.user2', 'user2');
|
.innerJoinAndSelect('game.user2', 'user2');
|
||||||
|
|
||||||
|
@ -53,6 +52,8 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
|
||||||
.where('game.user1Id = :userId', { userId: me.id })
|
.where('game.user1Id = :userId', { userId: me.id })
|
||||||
.orWhere('game.user2Id = :userId', { userId: me.id });
|
.orWhere('game.user2Id = :userId', { userId: me.id });
|
||||||
}));
|
}));
|
||||||
|
} else {
|
||||||
|
query.andWhere('game.isStarted = TRUE');
|
||||||
}
|
}
|
||||||
|
|
||||||
const games = await query.take(ps.limit).getMany();
|
const games = await query.take(ps.limit).getMany();
|
||||||
|
|
|
@ -37,6 +37,8 @@ export const paramDef = {
|
||||||
type: 'object',
|
type: 'object',
|
||||||
properties: {
|
properties: {
|
||||||
userId: { type: 'string', format: 'misskey:id', nullable: true },
|
userId: { type: 'string', format: 'misskey:id', nullable: true },
|
||||||
|
noIrregularRules: { type: 'boolean', default: false },
|
||||||
|
multiple: { type: 'boolean', default: false },
|
||||||
},
|
},
|
||||||
required: [],
|
required: [],
|
||||||
} as const;
|
} as const;
|
||||||
|
@ -56,7 +58,9 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
|
||||||
throw err;
|
throw err;
|
||||||
}) : null;
|
}) : null;
|
||||||
|
|
||||||
const game = target ? await this.reversiService.matchSpecificUser(me, target) : await this.reversiService.matchAnyUser(me);
|
const game = target
|
||||||
|
? await this.reversiService.matchSpecificUser(me, target, ps.multiple)
|
||||||
|
: await this.reversiService.matchAnyUser(me, { noIrregularRules: ps.noIrregularRules }, ps.multiple);
|
||||||
|
|
||||||
if (game == null) return;
|
if (game == null) return;
|
||||||
|
|
||||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 185 KiB After Width: | Height: | Size: 181 KiB |
|
@ -43,7 +43,6 @@
|
||||||
"compare-versions": "6.1.0",
|
"compare-versions": "6.1.0",
|
||||||
"cropperjs": "2.0.0-beta.4",
|
"cropperjs": "2.0.0-beta.4",
|
||||||
"date-fns": "2.30.0",
|
"date-fns": "2.30.0",
|
||||||
"defu": "^6.1.4",
|
|
||||||
"escape-regexp": "0.0.1",
|
"escape-regexp": "0.0.1",
|
||||||
"estree-walker": "3.0.3",
|
"estree-walker": "3.0.3",
|
||||||
"eventemitter3": "5.0.1",
|
"eventemitter3": "5.0.1",
|
||||||
|
|
|
@ -6,7 +6,7 @@ SPDX-License-Identifier: AGPL-3.0-only
|
||||||
<template>
|
<template>
|
||||||
<div
|
<div
|
||||||
ref="rootEl"
|
ref="rootEl"
|
||||||
:class="[$style.transitionRoot]"
|
:class="[$style.transitionRoot, { [$style.enableAnimation]: shouldAnimate }]"
|
||||||
@touchstart.passive="touchStart"
|
@touchstart.passive="touchStart"
|
||||||
@touchmove.passive="touchMove"
|
@touchmove.passive="touchMove"
|
||||||
@touchend.passive="touchEnd"
|
@touchend.passive="touchEnd"
|
||||||
|
@ -44,6 +44,8 @@ const emit = defineEmits<{
|
||||||
(ev: 'swiped', newKey: string, direction: 'left' | 'right'): void;
|
(ev: 'swiped', newKey: string, direction: 'left' | 'right'): void;
|
||||||
}>();
|
}>();
|
||||||
|
|
||||||
|
const shouldAnimate = computed(() => defaultStore.reactiveState.enableHorizontalSwipe.value || defaultStore.reactiveState.animation.value);
|
||||||
|
|
||||||
// ▼ しきい値 ▼ //
|
// ▼ しきい値 ▼ //
|
||||||
|
|
||||||
// スワイプと判定される最小の距離
|
// スワイプと判定される最小の距離
|
||||||
|
@ -188,7 +190,9 @@ watch(tabModel, (newTab, oldTab) => {
|
||||||
.transitionChildren {
|
.transitionChildren {
|
||||||
grid-area: 1 / 1 / 2 / 2;
|
grid-area: 1 / 1 / 2 / 2;
|
||||||
transform: translateX(var(--swipe));
|
transform: translateX(var(--swipe));
|
||||||
|
}
|
||||||
|
|
||||||
|
.enableAnimation .transitionChildren {
|
||||||
&.swipeAnimation_enterActive,
|
&.swipeAnimation_enterActive,
|
||||||
&.swipeAnimation_leaveActive {
|
&.swipeAnimation_leaveActive {
|
||||||
transition: transform .3s cubic-bezier(0.65, 0.05, 0.36, 1);
|
transition: transform .3s cubic-bezier(0.65, 0.05, 0.36, 1);
|
||||||
|
|
|
@ -12,85 +12,96 @@ SPDX-License-Identifier: AGPL-3.0-only
|
||||||
<div class="_gaps" :class="{ [$style.disallowInner]: isReady }">
|
<div class="_gaps" :class="{ [$style.disallowInner]: isReady }">
|
||||||
<div style="font-size: 1.5em; text-align: center;">{{ i18n.ts._reversi.gameSettings }}</div>
|
<div style="font-size: 1.5em; text-align: center;">{{ i18n.ts._reversi.gameSettings }}</div>
|
||||||
|
|
||||||
<div class="_panel">
|
<template v-if="game.noIrregularRules">
|
||||||
<div style="display: flex; align-items: center; padding: 16px; border-bottom: solid 1px var(--divider);">
|
<div>{{ i18n.ts._reversi.disallowIrregularRules }}</div>
|
||||||
<div>{{ mapName }}</div>
|
</template>
|
||||||
<MkButton style="margin-left: auto;" @click="chooseMap">{{ i18n.ts._reversi.chooseBoard }}</MkButton>
|
<template v-else>
|
||||||
</div>
|
<div class="_panel">
|
||||||
|
<div style="display: flex; align-items: center; padding: 16px; border-bottom: solid 1px var(--divider);">
|
||||||
|
<div>{{ mapName }}</div>
|
||||||
|
<MkButton style="margin-left: auto;" @click="chooseMap">{{ i18n.ts._reversi.chooseBoard }}</MkButton>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div style="padding: 16px;">
|
<div style="padding: 16px;">
|
||||||
<div v-if="game.map == null"><i class="ti ti-dice"></i></div>
|
<div v-if="game.map == null"><i class="ti ti-dice"></i></div>
|
||||||
<div v-else :class="$style.board" :style="{ 'grid-template-rows': `repeat(${ game.map.length }, 1fr)`, 'grid-template-columns': `repeat(${ game.map[0].length }, 1fr)` }">
|
<div v-else :class="$style.board" :style="{ 'grid-template-rows': `repeat(${ game.map.length }, 1fr)`, 'grid-template-columns': `repeat(${ game.map[0].length }, 1fr)` }">
|
||||||
<div v-for="(x, i) in game.map.join('')" :class="[$style.boardCell, { [$style.boardCellNone]: x == ' ' }]" @click="onMapCellClick(i, x)">
|
<div v-for="(x, i) in game.map.join('')" :class="[$style.boardCell, { [$style.boardCellNone]: x == ' ' }]" @click="onMapCellClick(i, x)">
|
||||||
<i v-if="x === 'b' || x === 'w'" style="pointer-events: none; user-select: none;" :class="x === 'b' ? 'ti ti-circle-filled' : 'ti ti-circle'"></i>
|
<i v-if="x === 'b' || x === 'w'" style="pointer-events: none; user-select: none;" :class="x === 'b' ? 'ti ti-circle-filled' : 'ti ti-circle'"></i>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
|
|
||||||
<MkFolder :defaultOpen="true">
|
<MkFolder :defaultOpen="true">
|
||||||
<template #label>{{ i18n.ts._reversi.blackOrWhite }}</template>
|
<template #label>{{ i18n.ts._reversi.blackOrWhite }}</template>
|
||||||
|
|
||||||
<MkRadios v-model="game.bw">
|
<MkRadios v-model="game.bw">
|
||||||
<option value="random">{{ i18n.ts.random }}</option>
|
<option value="random">{{ i18n.ts.random }}</option>
|
||||||
<option :value="'1'">
|
<option :value="'1'">
|
||||||
<I18n :src="i18n.ts._reversi.blackIs" tag="span">
|
<I18n :src="i18n.ts._reversi.blackIs" tag="span">
|
||||||
<template #name>
|
<template #name>
|
||||||
<b><MkUserName :user="game.user1"/></b>
|
<b><MkUserName :user="game.user1"/></b>
|
||||||
</template>
|
</template>
|
||||||
</I18n>
|
</I18n>
|
||||||
</option>
|
</option>
|
||||||
<option :value="'2'">
|
<option :value="'2'">
|
||||||
<I18n :src="i18n.ts._reversi.blackIs" tag="span">
|
<I18n :src="i18n.ts._reversi.blackIs" tag="span">
|
||||||
<template #name>
|
<template #name>
|
||||||
<b><MkUserName :user="game.user2"/></b>
|
<b><MkUserName :user="game.user2"/></b>
|
||||||
</template>
|
</template>
|
||||||
</I18n>
|
</I18n>
|
||||||
</option>
|
</option>
|
||||||
</MkRadios>
|
</MkRadios>
|
||||||
</MkFolder>
|
</MkFolder>
|
||||||
|
|
||||||
<MkFolder :defaultOpen="true">
|
<MkFolder :defaultOpen="true">
|
||||||
<template #label>{{ i18n.ts._reversi.timeLimitForEachTurn }}</template>
|
<template #label>{{ i18n.ts._reversi.timeLimitForEachTurn }}</template>
|
||||||
<template #suffix>{{ game.timeLimitForEachTurn }}{{ i18n.ts._time.second }}</template>
|
<template #suffix>{{ game.timeLimitForEachTurn }}{{ i18n.ts._time.second }}</template>
|
||||||
|
|
||||||
<MkRadios v-model="game.timeLimitForEachTurn">
|
<MkRadios v-model="game.timeLimitForEachTurn">
|
||||||
<option :value="5">5{{ i18n.ts._time.second }}</option>
|
<option :value="5">5{{ i18n.ts._time.second }}</option>
|
||||||
<option :value="10">10{{ i18n.ts._time.second }}</option>
|
<option :value="10">10{{ i18n.ts._time.second }}</option>
|
||||||
<option :value="30">30{{ i18n.ts._time.second }}</option>
|
<option :value="30">30{{ i18n.ts._time.second }}</option>
|
||||||
<option :value="60">60{{ i18n.ts._time.second }}</option>
|
<option :value="60">60{{ i18n.ts._time.second }}</option>
|
||||||
<option :value="90">90{{ i18n.ts._time.second }}</option>
|
<option :value="90">90{{ i18n.ts._time.second }}</option>
|
||||||
<option :value="120">120{{ i18n.ts._time.second }}</option>
|
<option :value="120">120{{ i18n.ts._time.second }}</option>
|
||||||
<option :value="180">180{{ i18n.ts._time.second }}</option>
|
<option :value="180">180{{ i18n.ts._time.second }}</option>
|
||||||
<option :value="3600">3600{{ i18n.ts._time.second }}</option>
|
<option :value="3600">3600{{ i18n.ts._time.second }}</option>
|
||||||
</MkRadios>
|
</MkRadios>
|
||||||
</MkFolder>
|
</MkFolder>
|
||||||
|
|
||||||
<MkFolder :defaultOpen="true">
|
<MkFolder :defaultOpen="true">
|
||||||
<template #label>{{ i18n.ts._reversi.rules }}</template>
|
<template #label>{{ i18n.ts._reversi.rules }}</template>
|
||||||
|
|
||||||
<div class="_gaps_s">
|
<div class="_gaps_s">
|
||||||
<MkSwitch v-model="game.isLlotheo" @update:modelValue="updateSettings('isLlotheo')">{{ i18n.ts._reversi.isLlotheo }}</MkSwitch>
|
<MkSwitch v-model="game.isLlotheo" @update:modelValue="updateSettings('isLlotheo')">{{ i18n.ts._reversi.isLlotheo }}</MkSwitch>
|
||||||
<MkSwitch v-model="game.loopedBoard" @update:modelValue="updateSettings('loopedBoard')">{{ i18n.ts._reversi.loopedMap }}</MkSwitch>
|
<MkSwitch v-model="game.loopedBoard" @update:modelValue="updateSettings('loopedBoard')">{{ i18n.ts._reversi.loopedMap }}</MkSwitch>
|
||||||
<MkSwitch v-model="game.canPutEverywhere" @update:modelValue="updateSettings('canPutEverywhere')">{{ i18n.ts._reversi.canPutEverywhere }}</MkSwitch>
|
<MkSwitch v-model="game.canPutEverywhere" @update:modelValue="updateSettings('canPutEverywhere')">{{ i18n.ts._reversi.canPutEverywhere }}</MkSwitch>
|
||||||
</div>
|
</div>
|
||||||
</MkFolder>
|
</MkFolder>
|
||||||
|
</template>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</MkSpacer>
|
</MkSpacer>
|
||||||
<template #footer>
|
<template #footer>
|
||||||
<div :class="$style.footer">
|
<div :class="$style.footer">
|
||||||
<MkSpacer :contentMax="700" :marginMin="16" :marginMax="16">
|
<MkSpacer :contentMax="700" :marginMin="16" :marginMax="16">
|
||||||
<div style="text-align: center; margin-bottom: 10px;">
|
<div style="text-align: center;" class="_gaps_s">
|
||||||
<template v-if="isReady && isOpReady">{{ i18n.ts._reversi.thisGameIsStartedSoon }}<MkEllipsis/></template>
|
<div v-if="opponentHasSettingsChanged" style="color: var(--warn);">{{ i18n.ts._reversi.opponentHasSettingsChanged }}</div>
|
||||||
<template v-if="isReady && !isOpReady">{{ i18n.ts._reversi.waitingForOther }}<MkEllipsis/></template>
|
<div>
|
||||||
<template v-if="!isReady && isOpReady">{{ i18n.ts._reversi.waitingForMe }}</template>
|
<template v-if="isReady && isOpReady">{{ i18n.ts._reversi.thisGameIsStartedSoon }}<MkEllipsis/></template>
|
||||||
<template v-if="!isReady && !isOpReady">{{ i18n.ts._reversi.waitingBoth }}<MkEllipsis/></template>
|
<template v-if="isReady && !isOpReady">{{ i18n.ts._reversi.waitingForOther }}<MkEllipsis/></template>
|
||||||
</div>
|
<template v-if="!isReady && isOpReady">{{ i18n.ts._reversi.waitingForMe }}</template>
|
||||||
<div class="_buttonsCenter">
|
<template v-if="!isReady && !isOpReady">{{ i18n.ts._reversi.waitingBoth }}<MkEllipsis/></template>
|
||||||
<MkButton rounded danger @click="cancel">{{ i18n.ts.cancel }}</MkButton>
|
</div>
|
||||||
<MkButton v-if="!isReady" rounded primary @click="ready">{{ i18n.ts._reversi.ready }}</MkButton>
|
<div class="_buttonsCenter">
|
||||||
<MkButton v-if="isReady" rounded @click="unready">{{ i18n.ts._reversi.cancelReady }}</MkButton>
|
<MkButton rounded danger @click="cancel">{{ i18n.ts.cancel }}</MkButton>
|
||||||
|
<MkButton v-if="!isReady" rounded primary @click="ready">{{ i18n.ts._reversi.ready }}</MkButton>
|
||||||
|
<MkButton v-if="isReady" rounded @click="unready">{{ i18n.ts._reversi.cancelReady }}</MkButton>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<MkSwitch v-model="shareWhenStart">{{ i18n.ts._reversi.shareToTlTheGameWhenStart }}</MkSwitch>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</MkSpacer>
|
</MkSpacer>
|
||||||
</div>
|
</div>
|
||||||
|
@ -124,6 +135,8 @@ const props = defineProps<{
|
||||||
connection: Misskey.ChannelConnection;
|
connection: Misskey.ChannelConnection;
|
||||||
}>();
|
}>();
|
||||||
|
|
||||||
|
const shareWhenStart = defineModel<boolean>('shareWhenStart', { default: false });
|
||||||
|
|
||||||
const game = ref<Misskey.entities.ReversiGameDetailed>(deepClone(props.game));
|
const game = ref<Misskey.entities.ReversiGameDetailed>(deepClone(props.game));
|
||||||
|
|
||||||
const mapName = computed(() => {
|
const mapName = computed(() => {
|
||||||
|
@ -142,6 +155,8 @@ const isOpReady = computed(() => {
|
||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const opponentHasSettingsChanged = ref(false);
|
||||||
|
|
||||||
watch(() => game.value.bw, () => {
|
watch(() => game.value.bw, () => {
|
||||||
updateSettings('bw');
|
updateSettings('bw');
|
||||||
});
|
});
|
||||||
|
@ -190,6 +205,7 @@ async function cancel() {
|
||||||
|
|
||||||
function ready() {
|
function ready() {
|
||||||
props.connection.send('ready', true);
|
props.connection.send('ready', true);
|
||||||
|
opponentHasSettingsChanged.value = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
function unready() {
|
function unready() {
|
||||||
|
@ -212,6 +228,10 @@ function onUpdateSettings({ userId, key, value }: { userId: string; key: keyof M
|
||||||
if (userId === $i.id) return;
|
if (userId === $i.id) return;
|
||||||
if (game.value[key] === value) return;
|
if (game.value[key] === value) return;
|
||||||
game.value[key] = value;
|
game.value[key] = value;
|
||||||
|
if (isReady.value) {
|
||||||
|
opponentHasSettingsChanged.value = true;
|
||||||
|
unready();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function onMapCellClick(pos: number, pixel: string) {
|
function onMapCellClick(pos: number, pixel: string) {
|
||||||
|
|
|
@ -5,7 +5,7 @@ SPDX-License-Identifier: AGPL-3.0-only
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<div v-if="game == null || (!game.isEnded && connection == null)"><MkLoading/></div>
|
<div v-if="game == null || (!game.isEnded && connection == null)"><MkLoading/></div>
|
||||||
<GameSetting v-else-if="!game.isStarted" :game="game" :connection="connection!"/>
|
<GameSetting v-else-if="!game.isStarted" v-model:shareWhenStart="shareWhenStart" :game="game" :connection="connection!"/>
|
||||||
<GameBoard v-else :game="game" :connection="connection"/>
|
<GameBoard v-else :game="game" :connection="connection"/>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
@ -21,6 +21,7 @@ import { signinRequired } from '@/account.js';
|
||||||
import { useRouter } from '@/global/router/supplier.js';
|
import { useRouter } from '@/global/router/supplier.js';
|
||||||
import * as os from '@/os.js';
|
import * as os from '@/os.js';
|
||||||
import { i18n } from '@/i18n.js';
|
import { i18n } from '@/i18n.js';
|
||||||
|
import { useInterval } from '@/scripts/use-interval.js';
|
||||||
|
|
||||||
const $i = signinRequired();
|
const $i = signinRequired();
|
||||||
|
|
||||||
|
@ -32,17 +33,32 @@ const props = defineProps<{
|
||||||
|
|
||||||
const game = shallowRef<Misskey.entities.ReversiGameDetailed | null>(null);
|
const game = shallowRef<Misskey.entities.ReversiGameDetailed | null>(null);
|
||||||
const connection = shallowRef<Misskey.ChannelConnection | null>(null);
|
const connection = shallowRef<Misskey.ChannelConnection | null>(null);
|
||||||
|
const shareWhenStart = ref(false);
|
||||||
|
|
||||||
watch(() => props.gameId, () => {
|
watch(() => props.gameId, () => {
|
||||||
fetchGame();
|
fetchGame();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
function start(_game: Misskey.entities.ReversiGameDetailed) {
|
||||||
|
if (game.value?.isStarted) return;
|
||||||
|
|
||||||
|
if (shareWhenStart.value) {
|
||||||
|
misskeyApi('notes/create', {
|
||||||
|
text: i18n.ts._reversi.iStartedAGame + '\n' + location.href,
|
||||||
|
visibility: 'home',
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
game.value = _game;
|
||||||
|
}
|
||||||
|
|
||||||
async function fetchGame() {
|
async function fetchGame() {
|
||||||
const _game = await misskeyApi('reversi/show-game', {
|
const _game = await misskeyApi('reversi/show-game', {
|
||||||
gameId: props.gameId,
|
gameId: props.gameId,
|
||||||
});
|
});
|
||||||
|
|
||||||
game.value = _game;
|
game.value = _game;
|
||||||
|
shareWhenStart.value = false;
|
||||||
|
|
||||||
if (connection.value) {
|
if (connection.value) {
|
||||||
connection.value.dispose();
|
connection.value.dispose();
|
||||||
|
@ -52,7 +68,7 @@ async function fetchGame() {
|
||||||
gameId: game.value.id,
|
gameId: game.value.id,
|
||||||
});
|
});
|
||||||
connection.value.on('started', x => {
|
connection.value.on('started', x => {
|
||||||
game.value = x.game;
|
start(x.game);
|
||||||
});
|
});
|
||||||
connection.value.on('canceled', x => {
|
connection.value.on('canceled', x => {
|
||||||
connection.value?.dispose();
|
connection.value?.dispose();
|
||||||
|
@ -68,6 +84,25 @@ async function fetchGame() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 通信を取りこぼした場合の救済
|
||||||
|
useInterval(async () => {
|
||||||
|
if (game.value == null) return;
|
||||||
|
if (game.value.isStarted) return;
|
||||||
|
|
||||||
|
const _game = await misskeyApi('reversi/show-game', {
|
||||||
|
gameId: props.gameId,
|
||||||
|
});
|
||||||
|
|
||||||
|
if (_game.isStarted) {
|
||||||
|
start(_game);
|
||||||
|
} else {
|
||||||
|
game.value = _game;
|
||||||
|
}
|
||||||
|
}, 1000 * 10, {
|
||||||
|
immediate: false,
|
||||||
|
afterMounted: true,
|
||||||
|
});
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
fetchGame();
|
fetchGame();
|
||||||
});
|
});
|
||||||
|
@ -78,10 +113,6 @@ onUnmounted(() => {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
const headerActions = computed(() => []);
|
|
||||||
|
|
||||||
const headerTabs = computed(() => []);
|
|
||||||
|
|
||||||
definePageMetadata(computed(() => ({
|
definePageMetadata(computed(() => ({
|
||||||
title: 'Reversi',
|
title: 'Reversi',
|
||||||
icon: 'ti ti-device-gamepad',
|
icon: 'ti ti-device-gamepad',
|
||||||
|
|
|
@ -34,7 +34,7 @@ SPDX-License-Identifier: AGPL-3.0-only
|
||||||
<MkPagination :pagination="myGamesPagination" :disableAutoLoad="true">
|
<MkPagination :pagination="myGamesPagination" :disableAutoLoad="true">
|
||||||
<template #default="{ items }">
|
<template #default="{ items }">
|
||||||
<div :class="$style.gamePreviews">
|
<div :class="$style.gamePreviews">
|
||||||
<MkA v-for="g in items" :key="g.id" v-panel :class="[$style.gamePreview, !g.isEnded && $style.gamePreviewActive]" tabindex="-1" :to="`/reversi/g/${g.id}`">
|
<MkA v-for="g in items" :key="g.id" v-panel :class="[$style.gamePreview, !g.isStarted && !g.isEnded && $style.gamePreviewWaiting, g.isStarted && !g.isEnded && $style.gamePreviewActive]" tabindex="-1" :to="`/reversi/g/${g.id}`">
|
||||||
<div :class="$style.gamePreviewPlayers">
|
<div :class="$style.gamePreviewPlayers">
|
||||||
<span v-if="g.winnerId === g.user1Id" style="margin-right: 0.75em; color: var(--accent); font-weight: bold;"><i class="ti ti-trophy"></i></span>
|
<span v-if="g.winnerId === g.user1Id" style="margin-right: 0.75em; color: var(--accent); font-weight: bold;"><i class="ti ti-trophy"></i></span>
|
||||||
<span v-if="g.winnerId === g.user2Id" style="margin-right: 0.75em; visibility: hidden;"><i class="ti ti-x"></i></span>
|
<span v-if="g.winnerId === g.user2Id" style="margin-right: 0.75em; visibility: hidden;"><i class="ti ti-x"></i></span>
|
||||||
|
@ -45,7 +45,8 @@ SPDX-License-Identifier: AGPL-3.0-only
|
||||||
<span v-if="g.winnerId === g.user2Id" style="margin-left: 0.75em; color: var(--accent); font-weight: bold;"><i class="ti ti-trophy"></i></span>
|
<span v-if="g.winnerId === g.user2Id" style="margin-left: 0.75em; color: var(--accent); font-weight: bold;"><i class="ti ti-trophy"></i></span>
|
||||||
</div>
|
</div>
|
||||||
<div :class="$style.gamePreviewFooter">
|
<div :class="$style.gamePreviewFooter">
|
||||||
<span v-if="!g.isEnded" :class="$style.gamePreviewStatusActive">{{ i18n.ts._reversi.playing }}</span>
|
<span v-if="g.isStarted && !g.isEnded" :class="$style.gamePreviewStatusActive">{{ i18n.ts._reversi.playing }}</span>
|
||||||
|
<span v-else-if="!g.isEnded" :class="$style.gamePreviewStatusWaiting"><MkEllipsis/></span>
|
||||||
<span v-else>{{ i18n.ts._reversi.ended }}</span>
|
<span v-else>{{ i18n.ts._reversi.ended }}</span>
|
||||||
<MkTime style="margin-left: auto; opacity: 0.7;" :time="g.createdAt"/>
|
<MkTime style="margin-left: auto; opacity: 0.7;" :time="g.createdAt"/>
|
||||||
</div>
|
</div>
|
||||||
|
@ -60,7 +61,7 @@ SPDX-License-Identifier: AGPL-3.0-only
|
||||||
<MkPagination :pagination="gamesPagination" :disableAutoLoad="true">
|
<MkPagination :pagination="gamesPagination" :disableAutoLoad="true">
|
||||||
<template #default="{ items }">
|
<template #default="{ items }">
|
||||||
<div :class="$style.gamePreviews">
|
<div :class="$style.gamePreviews">
|
||||||
<MkA v-for="g in items" :key="g.id" v-panel :class="[$style.gamePreview, !g.isEnded && $style.gamePreviewActive]" tabindex="-1" :to="`/reversi/g/${g.id}`">
|
<MkA v-for="g in items" :key="g.id" v-panel :class="[$style.gamePreview, !g.isStarted && !g.isEnded && $style.gamePreviewWaiting, g.isStarted && !g.isEnded && $style.gamePreviewActive]" tabindex="-1" :to="`/reversi/g/${g.id}`">
|
||||||
<div :class="$style.gamePreviewPlayers">
|
<div :class="$style.gamePreviewPlayers">
|
||||||
<span v-if="g.winnerId === g.user1Id" style="margin-right: 0.75em; color: var(--accent); font-weight: bold;"><i class="ti ti-trophy"></i></span>
|
<span v-if="g.winnerId === g.user1Id" style="margin-right: 0.75em; color: var(--accent); font-weight: bold;"><i class="ti ti-trophy"></i></span>
|
||||||
<span v-if="g.winnerId === g.user2Id" style="margin-right: 0.75em; visibility: hidden;"><i class="ti ti-x"></i></span>
|
<span v-if="g.winnerId === g.user2Id" style="margin-right: 0.75em; visibility: hidden;"><i class="ti ti-x"></i></span>
|
||||||
|
@ -71,7 +72,8 @@ SPDX-License-Identifier: AGPL-3.0-only
|
||||||
<span v-if="g.winnerId === g.user2Id" style="margin-left: 0.75em; color: var(--accent); font-weight: bold;"><i class="ti ti-trophy"></i></span>
|
<span v-if="g.winnerId === g.user2Id" style="margin-left: 0.75em; color: var(--accent); font-weight: bold;"><i class="ti ti-trophy"></i></span>
|
||||||
</div>
|
</div>
|
||||||
<div :class="$style.gamePreviewFooter">
|
<div :class="$style.gamePreviewFooter">
|
||||||
<span v-if="!g.isEnded" :class="$style.gamePreviewStatusActive">{{ i18n.ts._reversi.playing }}</span>
|
<span v-if="g.isStarted && !g.isEnded" :class="$style.gamePreviewStatusActive">{{ i18n.ts._reversi.playing }}</span>
|
||||||
|
<span v-else-if="!g.isEnded" :class="$style.gamePreviewStatusWaiting"><MkEllipsis/></span>
|
||||||
<span v-else>{{ i18n.ts._reversi.ended }}</span>
|
<span v-else>{{ i18n.ts._reversi.ended }}</span>
|
||||||
<MkTime style="margin-left: auto; opacity: 0.7;" :time="g.createdAt"/>
|
<MkTime style="margin-left: auto; opacity: 0.7;" :time="g.createdAt"/>
|
||||||
</div>
|
</div>
|
||||||
|
@ -137,7 +139,9 @@ if ($i) {
|
||||||
const connection = useStream().useChannel('reversi');
|
const connection = useStream().useChannel('reversi');
|
||||||
|
|
||||||
connection.on('matched', x => {
|
connection.on('matched', x => {
|
||||||
startGame(x.game);
|
if (matchingUser.value != null || matchingAny.value) {
|
||||||
|
startGame(x.game);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
connection.on('invited', invitation => {
|
connection.on('invited', invitation => {
|
||||||
|
@ -153,6 +157,7 @@ if ($i) {
|
||||||
const invitations = ref<Misskey.entities.UserLite[]>([]);
|
const invitations = ref<Misskey.entities.UserLite[]>([]);
|
||||||
const matchingUser = ref<Misskey.entities.UserLite | null>(null);
|
const matchingUser = ref<Misskey.entities.UserLite | null>(null);
|
||||||
const matchingAny = ref<boolean>(false);
|
const matchingAny = ref<boolean>(false);
|
||||||
|
const noIrregularRules = ref<boolean>(false);
|
||||||
|
|
||||||
function startGame(game: Misskey.entities.ReversiGameDetailed) {
|
function startGame(game: Misskey.entities.ReversiGameDetailed) {
|
||||||
matchingUser.value = null;
|
matchingUser.value = null;
|
||||||
|
@ -178,6 +183,7 @@ async function matchHeatbeat() {
|
||||||
} else if (matchingAny.value) {
|
} else if (matchingAny.value) {
|
||||||
const res = await misskeyApi('reversi/match', {
|
const res = await misskeyApi('reversi/match', {
|
||||||
userId: null,
|
userId: null,
|
||||||
|
noIrregularRules: noIrregularRules.value,
|
||||||
});
|
});
|
||||||
|
|
||||||
if (res != null) {
|
if (res != null) {
|
||||||
|
@ -195,10 +201,22 @@ async function matchUser() {
|
||||||
matchHeatbeat();
|
matchHeatbeat();
|
||||||
}
|
}
|
||||||
|
|
||||||
async function matchAny() {
|
function matchAny(ev: MouseEvent) {
|
||||||
matchingAny.value = true;
|
os.popupMenu([{
|
||||||
|
text: i18n.ts._reversi.allowIrregularRules,
|
||||||
matchHeatbeat();
|
action: () => {
|
||||||
|
noIrregularRules.value = false;
|
||||||
|
matchingAny.value = true;
|
||||||
|
matchHeatbeat();
|
||||||
|
},
|
||||||
|
}, {
|
||||||
|
text: i18n.ts._reversi.disallowIrregularRules,
|
||||||
|
action: () => {
|
||||||
|
noIrregularRules.value = true;
|
||||||
|
matchingAny.value = true;
|
||||||
|
matchHeatbeat();
|
||||||
|
},
|
||||||
|
}], ev.currentTarget ?? ev.target);
|
||||||
}
|
}
|
||||||
|
|
||||||
function cancelMatching() {
|
function cancelMatching() {
|
||||||
|
@ -220,12 +238,14 @@ async function accept(user) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
useInterval(matchHeatbeat, 1000 * 10, { immediate: false, afterMounted: true });
|
useInterval(matchHeatbeat, 1000 * 5, { immediate: false, afterMounted: true });
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
misskeyApi('reversi/invitations').then(_invitations => {
|
misskeyApi('reversi/invitations').then(_invitations => {
|
||||||
invitations.value = _invitations;
|
invitations.value = _invitations;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
window.addEventListener('beforeunload', cancelMatching);
|
||||||
});
|
});
|
||||||
|
|
||||||
onDeactivated(() => {
|
onDeactivated(() => {
|
||||||
|
@ -273,6 +293,10 @@ definePageMetadata(computed(() => ({
|
||||||
box-shadow: inset 0 0 8px 0px var(--accent);
|
box-shadow: inset 0 0 8px 0px var(--accent);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.gamePreviewWaiting {
|
||||||
|
box-shadow: inset 0 0 8px 0px var(--warn);
|
||||||
|
}
|
||||||
|
|
||||||
.gamePreviewPlayers {
|
.gamePreviewPlayers {
|
||||||
text-align: center;
|
text-align: center;
|
||||||
padding: 16px;
|
padding: 16px;
|
||||||
|
@ -306,6 +330,12 @@ definePageMetadata(computed(() => ({
|
||||||
animation: blink 2s infinite;
|
animation: blink 2s infinite;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.gamePreviewStatusWaiting {
|
||||||
|
color: var(--warn);
|
||||||
|
font-weight: bold;
|
||||||
|
animation: blink 2s infinite;
|
||||||
|
}
|
||||||
|
|
||||||
.waitingScreen {
|
.waitingScreen {
|
||||||
text-align: center;
|
text-align: center;
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,7 +7,6 @@
|
||||||
|
|
||||||
import { onUnmounted, Ref, ref, watch } from 'vue';
|
import { onUnmounted, Ref, ref, watch } from 'vue';
|
||||||
import { BroadcastChannel } from 'broadcast-channel';
|
import { BroadcastChannel } from 'broadcast-channel';
|
||||||
import { defu } from 'defu';
|
|
||||||
import { $i } from '@/account.js';
|
import { $i } from '@/account.js';
|
||||||
import { misskeyApi } from '@/scripts/misskey-api.js';
|
import { misskeyApi } from '@/scripts/misskey-api.js';
|
||||||
import { get, set } from '@/scripts/idb-proxy.js';
|
import { get, set } from '@/scripts/idb-proxy.js';
|
||||||
|
@ -81,14 +80,37 @@ export class Storage<T extends StateDef> {
|
||||||
this.loaded = this.ready.then(() => this.load());
|
this.loaded = this.ready.then(() => this.load());
|
||||||
}
|
}
|
||||||
|
|
||||||
private isPureObject(value: unknown): value is Record<string, unknown> {
|
private isPureObject(value: unknown): value is Record<string | number | symbol, unknown> {
|
||||||
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
private mergeState<T>(value: T, def: T): T {
|
/**
|
||||||
|
* valueにないキーをdefからもらう(再帰的)\
|
||||||
|
* nullはそのまま、undefinedはdefの値
|
||||||
|
**/
|
||||||
|
private mergeObject<X>(value: X, def: X): X {
|
||||||
if (this.isPureObject(value) && this.isPureObject(def)) {
|
if (this.isPureObject(value) && this.isPureObject(def)) {
|
||||||
if (_DEV_) console.log('Merging state. Incoming: ', value, ' Default: ', def);
|
const result = structuredClone(value) as X;
|
||||||
return defu(value, def) as T;
|
for (const [k, v] of Object.entries(def) as [keyof X, X[keyof X]][]) {
|
||||||
|
if (!Object.prototype.hasOwnProperty.call(value, k) || value[k] === undefined) {
|
||||||
|
result[k] = v;
|
||||||
|
} else if (this.isPureObject(v) && this.isPureObject(result[k])) {
|
||||||
|
const child = structuredClone(result[k]) as X[keyof X] & Record<string | number | symbol, unknown>;
|
||||||
|
result[k] = this.mergeObject<typeof v>(child, v);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
private mergeState<X>(value: X, def: X): X {
|
||||||
|
if (this.isPureObject(value) && this.isPureObject(def)) {
|
||||||
|
const merged = this.mergeObject(value, def);
|
||||||
|
|
||||||
|
if (_DEV_) console.log('Merging state. Incoming: ', value, ' Default: ', def, ' Result: ', merged);
|
||||||
|
|
||||||
|
return merged as X;
|
||||||
}
|
}
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* version: 2024.2.0-beta.3
|
* version: 2024.2.0-beta.6
|
||||||
* generatedAt: 2024-01-23T01:22:13.177Z
|
* generatedAt: 2024-01-24T07:32:10.455Z
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import type { SwitchCaseResponseType } from '../api.js';
|
import type { SwitchCaseResponseType } from '../api.js';
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* version: 2024.2.0-beta.3
|
* version: 2024.2.0-beta.6
|
||||||
* generatedAt: 2024-01-23T01:22:13.175Z
|
* generatedAt: 2024-01-24T07:32:10.453Z
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import type {
|
import type {
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* version: 2024.2.0-beta.3
|
* version: 2024.2.0-beta.6
|
||||||
* generatedAt: 2024-01-23T01:22:13.173Z
|
* generatedAt: 2024-01-24T07:32:10.452Z
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import { operations } from './types.js';
|
import { operations } from './types.js';
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* version: 2024.2.0-beta.3
|
* version: 2024.2.0-beta.6
|
||||||
* generatedAt: 2024-01-23T01:22:13.172Z
|
* generatedAt: 2024-01-24T07:32:10.450Z
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import { components } from './types.js';
|
import { components } from './types.js';
|
||||||
|
|
|
@ -2,8 +2,8 @@
|
||||||
/* eslint @typescript-eslint/no-explicit-any: 0 */
|
/* eslint @typescript-eslint/no-explicit-any: 0 */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* version: 2024.2.0-beta.3
|
* version: 2024.2.0-beta.6
|
||||||
* generatedAt: 2024-01-23T01:22:13.093Z
|
* generatedAt: 2024-01-24T07:32:10.370Z
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -4493,6 +4493,7 @@ export type components = {
|
||||||
timeoutUserId: string | null;
|
timeoutUserId: string | null;
|
||||||
black: number | null;
|
black: number | null;
|
||||||
bw: string;
|
bw: string;
|
||||||
|
noIrregularRules: boolean;
|
||||||
isLlotheo: boolean;
|
isLlotheo: boolean;
|
||||||
canPutEverywhere: boolean;
|
canPutEverywhere: boolean;
|
||||||
loopedBoard: boolean;
|
loopedBoard: boolean;
|
||||||
|
@ -4528,6 +4529,7 @@ export type components = {
|
||||||
timeoutUserId: string | null;
|
timeoutUserId: string | null;
|
||||||
black: number | null;
|
black: number | null;
|
||||||
bw: string;
|
bw: string;
|
||||||
|
noIrregularRules: boolean;
|
||||||
isLlotheo: boolean;
|
isLlotheo: boolean;
|
||||||
canPutEverywhere: boolean;
|
canPutEverywhere: boolean;
|
||||||
loopedBoard: boolean;
|
loopedBoard: boolean;
|
||||||
|
@ -25801,6 +25803,10 @@ export type operations = {
|
||||||
'application/json': {
|
'application/json': {
|
||||||
/** Format: misskey:id */
|
/** Format: misskey:id */
|
||||||
userId?: string | null;
|
userId?: string | null;
|
||||||
|
/** @default false */
|
||||||
|
noIrregularRules?: boolean;
|
||||||
|
/** @default false */
|
||||||
|
multiple?: boolean;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
143
pnpm-lock.yaml
143
pnpm-lock.yaml
|
@ -745,9 +745,6 @@ importers:
|
||||||
date-fns:
|
date-fns:
|
||||||
specifier: 2.30.0
|
specifier: 2.30.0
|
||||||
version: 2.30.0
|
version: 2.30.0
|
||||||
defu:
|
|
||||||
specifier: ^6.1.4
|
|
||||||
version: 6.1.4
|
|
||||||
escape-regexp:
|
escape-regexp:
|
||||||
specifier: 0.0.1
|
specifier: 0.0.1
|
||||||
version: 0.0.1
|
version: 0.0.1
|
||||||
|
@ -834,7 +831,7 @@ importers:
|
||||||
version: 1.7.2(vue@3.4.15)
|
version: 1.7.2(vue@3.4.15)
|
||||||
vite:
|
vite:
|
||||||
specifier: 5.0.12
|
specifier: 5.0.12
|
||||||
version: 5.0.12(@types/node@20.11.5)(sass@1.70.0)(terser@5.27.0)
|
version: 5.0.12(@types/node@20.11.5)(sass@1.70.0)
|
||||||
vue:
|
vue:
|
||||||
specifier: 3.4.15
|
specifier: 3.4.15
|
||||||
version: 3.4.15(typescript@5.3.3)
|
version: 3.4.15(typescript@5.3.3)
|
||||||
|
@ -1012,7 +1009,7 @@ importers:
|
||||||
version: 1.0.3
|
version: 1.0.3
|
||||||
vitest:
|
vitest:
|
||||||
specifier: 0.34.6
|
specifier: 0.34.6
|
||||||
version: 0.34.6(happy-dom@10.0.3)(sass@1.70.0)(terser@5.27.0)
|
version: 0.34.6(happy-dom@10.0.3)(sass@1.70.0)
|
||||||
vitest-fetch-mock:
|
vitest-fetch-mock:
|
||||||
specifier: 0.2.2
|
specifier: 0.2.2
|
||||||
version: 0.2.2(vitest@0.34.6)
|
version: 0.2.2(vitest@0.34.6)
|
||||||
|
@ -1909,7 +1906,7 @@ packages:
|
||||||
'@babel/traverse': 7.22.11
|
'@babel/traverse': 7.22.11
|
||||||
'@babel/types': 7.22.17
|
'@babel/types': 7.22.17
|
||||||
convert-source-map: 1.9.0
|
convert-source-map: 1.9.0
|
||||||
debug: 4.3.4(supports-color@8.1.1)
|
debug: 4.3.4(supports-color@5.5.0)
|
||||||
gensync: 1.0.0-beta.2
|
gensync: 1.0.0-beta.2
|
||||||
json5: 2.2.3
|
json5: 2.2.3
|
||||||
semver: 6.3.1
|
semver: 6.3.1
|
||||||
|
@ -1932,7 +1929,7 @@ packages:
|
||||||
'@babel/traverse': 7.23.5
|
'@babel/traverse': 7.23.5
|
||||||
'@babel/types': 7.23.5
|
'@babel/types': 7.23.5
|
||||||
convert-source-map: 2.0.0
|
convert-source-map: 2.0.0
|
||||||
debug: 4.3.4(supports-color@8.1.1)
|
debug: 4.3.4(supports-color@5.5.0)
|
||||||
gensync: 1.0.0-beta.2
|
gensync: 1.0.0-beta.2
|
||||||
json5: 2.2.3
|
json5: 2.2.3
|
||||||
semver: 6.3.1
|
semver: 6.3.1
|
||||||
|
@ -2034,7 +2031,7 @@ packages:
|
||||||
'@babel/core': 7.23.5
|
'@babel/core': 7.23.5
|
||||||
'@babel/helper-compilation-targets': 7.22.15
|
'@babel/helper-compilation-targets': 7.22.15
|
||||||
'@babel/helper-plugin-utils': 7.22.5
|
'@babel/helper-plugin-utils': 7.22.5
|
||||||
debug: 4.3.4(supports-color@8.1.1)
|
debug: 4.3.4(supports-color@5.5.0)
|
||||||
lodash.debounce: 4.0.8
|
lodash.debounce: 4.0.8
|
||||||
resolve: 1.22.8
|
resolve: 1.22.8
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
|
@ -3433,7 +3430,7 @@ packages:
|
||||||
'@babel/helper-split-export-declaration': 7.22.6
|
'@babel/helper-split-export-declaration': 7.22.6
|
||||||
'@babel/parser': 7.23.5
|
'@babel/parser': 7.23.5
|
||||||
'@babel/types': 7.22.17
|
'@babel/types': 7.22.17
|
||||||
debug: 4.3.4(supports-color@8.1.1)
|
debug: 4.3.4(supports-color@5.5.0)
|
||||||
globals: 11.12.0
|
globals: 11.12.0
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
|
@ -3451,7 +3448,7 @@ packages:
|
||||||
'@babel/helper-split-export-declaration': 7.22.6
|
'@babel/helper-split-export-declaration': 7.22.6
|
||||||
'@babel/parser': 7.23.6
|
'@babel/parser': 7.23.6
|
||||||
'@babel/types': 7.23.5
|
'@babel/types': 7.23.5
|
||||||
debug: 4.3.4(supports-color@8.1.1)
|
debug: 4.3.4(supports-color@5.5.0)
|
||||||
globals: 11.12.0
|
globals: 11.12.0
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
|
@ -4158,7 +4155,7 @@ packages:
|
||||||
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
|
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
|
||||||
dependencies:
|
dependencies:
|
||||||
ajv: 6.12.6
|
ajv: 6.12.6
|
||||||
debug: 4.3.4(supports-color@8.1.1)
|
debug: 4.3.4(supports-color@5.5.0)
|
||||||
espree: 9.6.1
|
espree: 9.6.1
|
||||||
globals: 13.19.0
|
globals: 13.19.0
|
||||||
ignore: 5.2.4
|
ignore: 5.2.4
|
||||||
|
@ -4175,7 +4172,7 @@ packages:
|
||||||
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
|
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
|
||||||
dependencies:
|
dependencies:
|
||||||
ajv: 6.12.6
|
ajv: 6.12.6
|
||||||
debug: 4.3.4(supports-color@8.1.1)
|
debug: 4.3.4(supports-color@5.5.0)
|
||||||
espree: 9.6.1
|
espree: 9.6.1
|
||||||
globals: 13.19.0
|
globals: 13.19.0
|
||||||
ignore: 5.2.4
|
ignore: 5.2.4
|
||||||
|
@ -4410,7 +4407,7 @@ packages:
|
||||||
engines: {node: '>=10.10.0'}
|
engines: {node: '>=10.10.0'}
|
||||||
dependencies:
|
dependencies:
|
||||||
'@humanwhocodes/object-schema': 2.0.1
|
'@humanwhocodes/object-schema': 2.0.1
|
||||||
debug: 4.3.4(supports-color@8.1.1)
|
debug: 4.3.4(supports-color@5.5.0)
|
||||||
minimatch: 3.1.2
|
minimatch: 3.1.2
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
|
@ -4714,7 +4711,7 @@ packages:
|
||||||
magic-string: 0.27.0
|
magic-string: 0.27.0
|
||||||
react-docgen-typescript: 2.2.2(typescript@5.3.3)
|
react-docgen-typescript: 2.2.2(typescript@5.3.3)
|
||||||
typescript: 5.3.3
|
typescript: 5.3.3
|
||||||
vite: 5.0.12(@types/node@20.11.5)(sass@1.70.0)(terser@5.27.0)
|
vite: 5.0.12(@types/node@20.11.5)(sass@1.70.0)
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/@jridgewell/gen-mapping@0.3.2:
|
/@jridgewell/gen-mapping@0.3.2:
|
||||||
|
@ -4738,6 +4735,7 @@ packages:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@jridgewell/gen-mapping': 0.3.2
|
'@jridgewell/gen-mapping': 0.3.2
|
||||||
'@jridgewell/trace-mapping': 0.3.18
|
'@jridgewell/trace-mapping': 0.3.18
|
||||||
|
dev: false
|
||||||
|
|
||||||
/@jridgewell/sourcemap-codec@1.4.14:
|
/@jridgewell/sourcemap-codec@1.4.14:
|
||||||
resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==}
|
resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==}
|
||||||
|
@ -6774,7 +6772,7 @@ packages:
|
||||||
magic-string: 0.30.5
|
magic-string: 0.30.5
|
||||||
rollup: 3.29.4
|
rollup: 3.29.4
|
||||||
typescript: 5.3.3
|
typescript: 5.3.3
|
||||||
vite: 5.0.12(@types/node@20.11.5)(sass@1.70.0)(terser@5.27.0)
|
vite: 5.0.12(@types/node@20.11.5)(sass@1.70.0)
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- encoding
|
- encoding
|
||||||
- supports-color
|
- supports-color
|
||||||
|
@ -6979,7 +6977,7 @@ packages:
|
||||||
util: 0.12.5
|
util: 0.12.5
|
||||||
util-deprecate: 1.0.2
|
util-deprecate: 1.0.2
|
||||||
watchpack: 2.4.0
|
watchpack: 2.4.0
|
||||||
ws: 8.16.0(bufferutil@4.0.7)(utf-8-validate@6.0.3)
|
ws: 8.16.0
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- bufferutil
|
- bufferutil
|
||||||
- encoding
|
- encoding
|
||||||
|
@ -7148,7 +7146,7 @@ packages:
|
||||||
react: 18.2.0
|
react: 18.2.0
|
||||||
react-docgen: 7.0.1
|
react-docgen: 7.0.1
|
||||||
react-dom: 18.2.0(react@18.2.0)
|
react-dom: 18.2.0(react@18.2.0)
|
||||||
vite: 5.0.12(@types/node@20.11.5)(sass@1.70.0)(terser@5.27.0)
|
vite: 5.0.12(@types/node@20.11.5)(sass@1.70.0)
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- '@preact/preset-vite'
|
- '@preact/preset-vite'
|
||||||
- encoding
|
- encoding
|
||||||
|
@ -7274,7 +7272,7 @@ packages:
|
||||||
'@storybook/vue3': 7.6.10(vue@3.4.15)
|
'@storybook/vue3': 7.6.10(vue@3.4.15)
|
||||||
'@vitejs/plugin-vue': 4.5.2(vite@5.0.12)(vue@3.4.15)
|
'@vitejs/plugin-vue': 4.5.2(vite@5.0.12)(vue@3.4.15)
|
||||||
magic-string: 0.30.5
|
magic-string: 0.30.5
|
||||||
vite: 5.0.12(@types/node@20.11.5)(sass@1.70.0)(terser@5.27.0)
|
vite: 5.0.12(@types/node@20.11.5)(sass@1.70.0)
|
||||||
vue-docgen-api: 4.64.1(vue@3.4.15)
|
vue-docgen-api: 4.64.1(vue@3.4.15)
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- '@preact/preset-vite'
|
- '@preact/preset-vite'
|
||||||
|
@ -7774,7 +7772,7 @@ packages:
|
||||||
dom-accessibility-api: 0.5.16
|
dom-accessibility-api: 0.5.16
|
||||||
lodash: 4.17.21
|
lodash: 4.17.21
|
||||||
redent: 3.0.0
|
redent: 3.0.0
|
||||||
vitest: 0.34.6(happy-dom@10.0.3)(sass@1.70.0)(terser@5.27.0)
|
vitest: 0.34.6(happy-dom@10.0.3)(sass@1.70.0)
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/@testing-library/user-event@14.4.3(@testing-library/dom@9.2.0):
|
/@testing-library/user-event@14.4.3(@testing-library/dom@9.2.0):
|
||||||
|
@ -8448,7 +8446,7 @@ packages:
|
||||||
'@typescript-eslint/type-utils': 6.11.0(eslint@8.53.0)(typescript@5.3.3)
|
'@typescript-eslint/type-utils': 6.11.0(eslint@8.53.0)(typescript@5.3.3)
|
||||||
'@typescript-eslint/utils': 6.11.0(eslint@8.53.0)(typescript@5.3.3)
|
'@typescript-eslint/utils': 6.11.0(eslint@8.53.0)(typescript@5.3.3)
|
||||||
'@typescript-eslint/visitor-keys': 6.11.0
|
'@typescript-eslint/visitor-keys': 6.11.0
|
||||||
debug: 4.3.4(supports-color@8.1.1)
|
debug: 4.3.4(supports-color@5.5.0)
|
||||||
eslint: 8.53.0
|
eslint: 8.53.0
|
||||||
graphemer: 1.4.0
|
graphemer: 1.4.0
|
||||||
ignore: 5.2.4
|
ignore: 5.2.4
|
||||||
|
@ -8477,7 +8475,7 @@ packages:
|
||||||
'@typescript-eslint/type-utils': 6.18.1(eslint@8.56.0)(typescript@5.3.3)
|
'@typescript-eslint/type-utils': 6.18.1(eslint@8.56.0)(typescript@5.3.3)
|
||||||
'@typescript-eslint/utils': 6.18.1(eslint@8.56.0)(typescript@5.3.3)
|
'@typescript-eslint/utils': 6.18.1(eslint@8.56.0)(typescript@5.3.3)
|
||||||
'@typescript-eslint/visitor-keys': 6.18.1
|
'@typescript-eslint/visitor-keys': 6.18.1
|
||||||
debug: 4.3.4(supports-color@8.1.1)
|
debug: 4.3.4(supports-color@5.5.0)
|
||||||
eslint: 8.56.0
|
eslint: 8.56.0
|
||||||
graphemer: 1.4.0
|
graphemer: 1.4.0
|
||||||
ignore: 5.2.4
|
ignore: 5.2.4
|
||||||
|
@ -8503,7 +8501,7 @@ packages:
|
||||||
'@typescript-eslint/types': 6.11.0
|
'@typescript-eslint/types': 6.11.0
|
||||||
'@typescript-eslint/typescript-estree': 6.11.0(typescript@5.3.3)
|
'@typescript-eslint/typescript-estree': 6.11.0(typescript@5.3.3)
|
||||||
'@typescript-eslint/visitor-keys': 6.11.0
|
'@typescript-eslint/visitor-keys': 6.11.0
|
||||||
debug: 4.3.4(supports-color@8.1.1)
|
debug: 4.3.4(supports-color@5.5.0)
|
||||||
eslint: 8.53.0
|
eslint: 8.53.0
|
||||||
typescript: 5.3.3
|
typescript: 5.3.3
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
|
@ -8524,7 +8522,7 @@ packages:
|
||||||
'@typescript-eslint/types': 6.18.1
|
'@typescript-eslint/types': 6.18.1
|
||||||
'@typescript-eslint/typescript-estree': 6.18.1(typescript@5.3.3)
|
'@typescript-eslint/typescript-estree': 6.18.1(typescript@5.3.3)
|
||||||
'@typescript-eslint/visitor-keys': 6.18.1
|
'@typescript-eslint/visitor-keys': 6.18.1
|
||||||
debug: 4.3.4(supports-color@8.1.1)
|
debug: 4.3.4(supports-color@5.5.0)
|
||||||
eslint: 8.56.0
|
eslint: 8.56.0
|
||||||
typescript: 5.3.3
|
typescript: 5.3.3
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
|
@ -8559,7 +8557,7 @@ packages:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@typescript-eslint/typescript-estree': 6.11.0(typescript@5.3.3)
|
'@typescript-eslint/typescript-estree': 6.11.0(typescript@5.3.3)
|
||||||
'@typescript-eslint/utils': 6.11.0(eslint@8.53.0)(typescript@5.3.3)
|
'@typescript-eslint/utils': 6.11.0(eslint@8.53.0)(typescript@5.3.3)
|
||||||
debug: 4.3.4(supports-color@8.1.1)
|
debug: 4.3.4(supports-color@5.5.0)
|
||||||
eslint: 8.53.0
|
eslint: 8.53.0
|
||||||
ts-api-utils: 1.0.1(typescript@5.3.3)
|
ts-api-utils: 1.0.1(typescript@5.3.3)
|
||||||
typescript: 5.3.3
|
typescript: 5.3.3
|
||||||
|
@ -8579,7 +8577,7 @@ packages:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@typescript-eslint/typescript-estree': 6.18.1(typescript@5.3.3)
|
'@typescript-eslint/typescript-estree': 6.18.1(typescript@5.3.3)
|
||||||
'@typescript-eslint/utils': 6.18.1(eslint@8.56.0)(typescript@5.3.3)
|
'@typescript-eslint/utils': 6.18.1(eslint@8.56.0)(typescript@5.3.3)
|
||||||
debug: 4.3.4(supports-color@8.1.1)
|
debug: 4.3.4(supports-color@5.5.0)
|
||||||
eslint: 8.56.0
|
eslint: 8.56.0
|
||||||
ts-api-utils: 1.0.1(typescript@5.3.3)
|
ts-api-utils: 1.0.1(typescript@5.3.3)
|
||||||
typescript: 5.3.3
|
typescript: 5.3.3
|
||||||
|
@ -8608,7 +8606,7 @@ packages:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@typescript-eslint/types': 6.11.0
|
'@typescript-eslint/types': 6.11.0
|
||||||
'@typescript-eslint/visitor-keys': 6.11.0
|
'@typescript-eslint/visitor-keys': 6.11.0
|
||||||
debug: 4.3.4(supports-color@8.1.1)
|
debug: 4.3.4(supports-color@5.5.0)
|
||||||
globby: 11.1.0
|
globby: 11.1.0
|
||||||
is-glob: 4.0.3
|
is-glob: 4.0.3
|
||||||
semver: 7.5.4
|
semver: 7.5.4
|
||||||
|
@ -8629,7 +8627,7 @@ packages:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@typescript-eslint/types': 6.18.1
|
'@typescript-eslint/types': 6.18.1
|
||||||
'@typescript-eslint/visitor-keys': 6.18.1
|
'@typescript-eslint/visitor-keys': 6.18.1
|
||||||
debug: 4.3.4(supports-color@8.1.1)
|
debug: 4.3.4(supports-color@5.5.0)
|
||||||
globby: 11.1.0
|
globby: 11.1.0
|
||||||
is-glob: 4.0.3
|
is-glob: 4.0.3
|
||||||
minimatch: 9.0.3
|
minimatch: 9.0.3
|
||||||
|
@ -8709,7 +8707,7 @@ packages:
|
||||||
'@babel/plugin-transform-react-jsx-source': 7.19.6(@babel/core@7.23.5)
|
'@babel/plugin-transform-react-jsx-source': 7.19.6(@babel/core@7.23.5)
|
||||||
magic-string: 0.27.0
|
magic-string: 0.27.0
|
||||||
react-refresh: 0.14.0
|
react-refresh: 0.14.0
|
||||||
vite: 5.0.12(@types/node@20.11.5)(sass@1.70.0)(terser@5.27.0)
|
vite: 5.0.12(@types/node@20.11.5)(sass@1.70.0)
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
dev: true
|
dev: true
|
||||||
|
@ -8721,7 +8719,7 @@ packages:
|
||||||
vite: ^4.0.0 || ^5.0.0
|
vite: ^4.0.0 || ^5.0.0
|
||||||
vue: ^3.2.25
|
vue: ^3.2.25
|
||||||
dependencies:
|
dependencies:
|
||||||
vite: 5.0.12(@types/node@20.11.5)(sass@1.70.0)(terser@5.27.0)
|
vite: 5.0.12(@types/node@20.11.5)(sass@1.70.0)
|
||||||
vue: 3.4.15(typescript@5.3.3)
|
vue: 3.4.15(typescript@5.3.3)
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
|
@ -8732,7 +8730,7 @@ packages:
|
||||||
vite: ^5.0.0
|
vite: ^5.0.0
|
||||||
vue: ^3.2.25
|
vue: ^3.2.25
|
||||||
dependencies:
|
dependencies:
|
||||||
vite: 5.0.12(@types/node@20.11.5)(sass@1.70.0)(terser@5.27.0)
|
vite: 5.0.12(@types/node@20.11.5)(sass@1.70.0)
|
||||||
vue: 3.4.15(typescript@5.3.3)
|
vue: 3.4.15(typescript@5.3.3)
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
@ -8752,7 +8750,7 @@ packages:
|
||||||
std-env: 3.7.0
|
std-env: 3.7.0
|
||||||
test-exclude: 6.0.0
|
test-exclude: 6.0.0
|
||||||
v8-to-istanbul: 9.2.0
|
v8-to-istanbul: 9.2.0
|
||||||
vitest: 0.34.6(happy-dom@10.0.3)(sass@1.70.0)(terser@5.27.0)
|
vitest: 0.34.6(happy-dom@10.0.3)(sass@1.70.0)
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
dev: true
|
dev: true
|
||||||
|
@ -9093,7 +9091,7 @@ packages:
|
||||||
engines: {node: '>= 6.0.0'}
|
engines: {node: '>= 6.0.0'}
|
||||||
requiresBuild: true
|
requiresBuild: true
|
||||||
dependencies:
|
dependencies:
|
||||||
debug: 4.3.4(supports-color@8.1.1)
|
debug: 4.3.4(supports-color@5.5.0)
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
|
|
||||||
|
@ -9101,7 +9099,7 @@ packages:
|
||||||
resolution: {integrity: sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==}
|
resolution: {integrity: sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==}
|
||||||
engines: {node: '>= 14'}
|
engines: {node: '>= 14'}
|
||||||
dependencies:
|
dependencies:
|
||||||
debug: 4.3.4(supports-color@8.1.1)
|
debug: 4.3.4(supports-color@5.5.0)
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
dev: false
|
dev: false
|
||||||
|
@ -9487,7 +9485,7 @@ packages:
|
||||||
resolution: {integrity: sha512-TAlMYvOuwGyLK3PfBb5WKBXZmXz2fVCgv23d6zZFdle/q3gPjmxBaeuC0pY0Dzs5PWMSgfqqEZkrye19GlDTgw==}
|
resolution: {integrity: sha512-TAlMYvOuwGyLK3PfBb5WKBXZmXz2fVCgv23d6zZFdle/q3gPjmxBaeuC0pY0Dzs5PWMSgfqqEZkrye19GlDTgw==}
|
||||||
dependencies:
|
dependencies:
|
||||||
archy: 1.0.0
|
archy: 1.0.0
|
||||||
debug: 4.3.4(supports-color@8.1.1)
|
debug: 4.3.4(supports-color@5.5.0)
|
||||||
fastq: 1.15.0
|
fastq: 1.15.0
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
|
@ -9891,6 +9889,7 @@ packages:
|
||||||
requiresBuild: true
|
requiresBuild: true
|
||||||
dependencies:
|
dependencies:
|
||||||
node-gyp-build: 4.6.0
|
node-gyp-build: 4.6.0
|
||||||
|
dev: false
|
||||||
|
|
||||||
/bullmq@5.1.4:
|
/bullmq@5.1.4:
|
||||||
resolution: {integrity: sha512-j/AjaPc8BhyrH7b2MyZpi4cUtGH8TJTxonZUmXEefmKU8z5DcldzmlXPief0P4+qvN0A7qwWZH3n0F+GsWgQkg==}
|
resolution: {integrity: sha512-j/AjaPc8BhyrH7b2MyZpi4cUtGH8TJTxonZUmXEefmKU8z5DcldzmlXPief0P4+qvN0A7qwWZH3n0F+GsWgQkg==}
|
||||||
|
@ -10435,6 +10434,7 @@ packages:
|
||||||
|
|
||||||
/commander@2.20.3:
|
/commander@2.20.3:
|
||||||
resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==}
|
resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==}
|
||||||
|
dev: false
|
||||||
|
|
||||||
/commander@6.2.1:
|
/commander@6.2.1:
|
||||||
resolution: {integrity: sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==}
|
resolution: {integrity: sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==}
|
||||||
|
@ -10931,7 +10931,6 @@ packages:
|
||||||
dependencies:
|
dependencies:
|
||||||
ms: 2.1.2
|
ms: 2.1.2
|
||||||
supports-color: 5.5.0
|
supports-color: 5.5.0
|
||||||
dev: true
|
|
||||||
|
|
||||||
/debug@4.3.4(supports-color@8.1.1):
|
/debug@4.3.4(supports-color@8.1.1):
|
||||||
resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==}
|
resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==}
|
||||||
|
@ -10944,6 +10943,7 @@ packages:
|
||||||
dependencies:
|
dependencies:
|
||||||
ms: 2.1.2
|
ms: 2.1.2
|
||||||
supports-color: 8.1.1
|
supports-color: 8.1.1
|
||||||
|
dev: true
|
||||||
|
|
||||||
/decamelize-keys@1.1.1:
|
/decamelize-keys@1.1.1:
|
||||||
resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==}
|
resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==}
|
||||||
|
@ -11086,6 +11086,7 @@ packages:
|
||||||
|
|
||||||
/defu@6.1.4:
|
/defu@6.1.4:
|
||||||
resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==}
|
resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==}
|
||||||
|
dev: true
|
||||||
|
|
||||||
/del@6.1.1:
|
/del@6.1.1:
|
||||||
resolution: {integrity: sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==}
|
resolution: {integrity: sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==}
|
||||||
|
@ -11159,7 +11160,7 @@ packages:
|
||||||
hasBin: true
|
hasBin: true
|
||||||
dependencies:
|
dependencies:
|
||||||
address: 1.2.2
|
address: 1.2.2
|
||||||
debug: 4.3.4(supports-color@8.1.1)
|
debug: 4.3.4(supports-color@5.5.0)
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
dev: true
|
dev: true
|
||||||
|
@ -11483,7 +11484,7 @@ packages:
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
esbuild: '>=0.12 <1'
|
esbuild: '>=0.12 <1'
|
||||||
dependencies:
|
dependencies:
|
||||||
debug: 4.3.4(supports-color@8.1.1)
|
debug: 4.3.4(supports-color@5.5.0)
|
||||||
esbuild: 0.18.20
|
esbuild: 0.18.20
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
|
@ -11792,7 +11793,7 @@ packages:
|
||||||
ajv: 6.12.6
|
ajv: 6.12.6
|
||||||
chalk: 4.1.2
|
chalk: 4.1.2
|
||||||
cross-spawn: 7.0.3
|
cross-spawn: 7.0.3
|
||||||
debug: 4.3.4(supports-color@8.1.1)
|
debug: 4.3.4(supports-color@5.5.0)
|
||||||
doctrine: 3.0.0
|
doctrine: 3.0.0
|
||||||
escape-string-regexp: 4.0.0
|
escape-string-regexp: 4.0.0
|
||||||
eslint-scope: 7.2.2
|
eslint-scope: 7.2.2
|
||||||
|
@ -11839,7 +11840,7 @@ packages:
|
||||||
ajv: 6.12.6
|
ajv: 6.12.6
|
||||||
chalk: 4.1.2
|
chalk: 4.1.2
|
||||||
cross-spawn: 7.0.3
|
cross-spawn: 7.0.3
|
||||||
debug: 4.3.4(supports-color@8.1.1)
|
debug: 4.3.4(supports-color@5.5.0)
|
||||||
doctrine: 3.0.0
|
doctrine: 3.0.0
|
||||||
escape-string-regexp: 4.0.0
|
escape-string-regexp: 4.0.0
|
||||||
eslint-scope: 7.2.2
|
eslint-scope: 7.2.2
|
||||||
|
@ -12470,7 +12471,7 @@ packages:
|
||||||
debug:
|
debug:
|
||||||
optional: true
|
optional: true
|
||||||
dependencies:
|
dependencies:
|
||||||
debug: 4.3.4(supports-color@8.1.1)
|
debug: 4.3.4(supports-color@5.5.0)
|
||||||
|
|
||||||
/for-each@0.3.3:
|
/for-each@0.3.3:
|
||||||
resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==}
|
resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==}
|
||||||
|
@ -13026,7 +13027,6 @@ packages:
|
||||||
/has-flag@3.0.0:
|
/has-flag@3.0.0:
|
||||||
resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==}
|
resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==}
|
||||||
engines: {node: '>=4'}
|
engines: {node: '>=4'}
|
||||||
dev: true
|
|
||||||
|
|
||||||
/has-flag@4.0.0:
|
/has-flag@4.0.0:
|
||||||
resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
|
resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
|
||||||
|
@ -13164,7 +13164,7 @@ packages:
|
||||||
engines: {node: '>= 14'}
|
engines: {node: '>= 14'}
|
||||||
dependencies:
|
dependencies:
|
||||||
agent-base: 7.1.0
|
agent-base: 7.1.0
|
||||||
debug: 4.3.4(supports-color@8.1.1)
|
debug: 4.3.4(supports-color@5.5.0)
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
dev: false
|
dev: false
|
||||||
|
@ -13224,7 +13224,7 @@ packages:
|
||||||
engines: {node: '>= 6.0.0'}
|
engines: {node: '>= 6.0.0'}
|
||||||
dependencies:
|
dependencies:
|
||||||
agent-base: 5.1.1
|
agent-base: 5.1.1
|
||||||
debug: 4.3.4(supports-color@8.1.1)
|
debug: 4.3.4(supports-color@5.5.0)
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
dev: true
|
dev: true
|
||||||
|
@ -13234,7 +13234,7 @@ packages:
|
||||||
engines: {node: '>= 6'}
|
engines: {node: '>= 6'}
|
||||||
dependencies:
|
dependencies:
|
||||||
agent-base: 6.0.2
|
agent-base: 6.0.2
|
||||||
debug: 4.3.4(supports-color@8.1.1)
|
debug: 4.3.4(supports-color@5.5.0)
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
|
|
||||||
|
@ -13243,7 +13243,7 @@ packages:
|
||||||
engines: {node: '>= 14'}
|
engines: {node: '>= 14'}
|
||||||
dependencies:
|
dependencies:
|
||||||
agent-base: 7.1.0
|
agent-base: 7.1.0
|
||||||
debug: 4.3.4(supports-color@8.1.1)
|
debug: 4.3.4(supports-color@5.5.0)
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
dev: false
|
dev: false
|
||||||
|
@ -13403,7 +13403,7 @@ packages:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@ioredis/commands': 1.2.0
|
'@ioredis/commands': 1.2.0
|
||||||
cluster-key-slot: 1.1.2
|
cluster-key-slot: 1.1.2
|
||||||
debug: 4.3.4(supports-color@8.1.1)
|
debug: 4.3.4(supports-color@5.5.0)
|
||||||
denque: 2.1.0
|
denque: 2.1.0
|
||||||
lodash.defaults: 4.2.0
|
lodash.defaults: 4.2.0
|
||||||
lodash.isarguments: 3.1.0
|
lodash.isarguments: 3.1.0
|
||||||
|
@ -13849,7 +13849,7 @@ packages:
|
||||||
resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==}
|
resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==}
|
||||||
engines: {node: '>=10'}
|
engines: {node: '>=10'}
|
||||||
dependencies:
|
dependencies:
|
||||||
debug: 4.3.4(supports-color@8.1.1)
|
debug: 4.3.4(supports-color@5.5.0)
|
||||||
istanbul-lib-coverage: 3.2.2
|
istanbul-lib-coverage: 3.2.2
|
||||||
source-map: 0.6.1
|
source-map: 0.6.1
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
|
@ -15624,6 +15624,7 @@ packages:
|
||||||
resolution: {integrity: sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==}
|
resolution: {integrity: sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
requiresBuild: true
|
requiresBuild: true
|
||||||
|
dev: false
|
||||||
|
|
||||||
/node-gyp@10.0.1:
|
/node-gyp@10.0.1:
|
||||||
resolution: {integrity: sha512-gg3/bHehQfZivQVfqIyy8wTdSymF9yTyP4CJifK73imyNMU8AIGQE2pUa7dNWfmMeG9cDVF2eehiRMv0LC1iAg==}
|
resolution: {integrity: sha512-gg3/bHehQfZivQVfqIyy8wTdSymF9yTyP4CJifK73imyNMU8AIGQE2pUa7dNWfmMeG9cDVF2eehiRMv0LC1iAg==}
|
||||||
|
@ -17158,7 +17159,7 @@ packages:
|
||||||
engines: {node: '>=8.16.0'}
|
engines: {node: '>=8.16.0'}
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/mime-types': 2.1.4
|
'@types/mime-types': 2.1.4
|
||||||
debug: 4.3.4(supports-color@8.1.1)
|
debug: 4.3.4(supports-color@5.5.0)
|
||||||
extract-zip: 1.7.0
|
extract-zip: 1.7.0
|
||||||
https-proxy-agent: 4.0.0
|
https-proxy-agent: 4.0.0
|
||||||
mime: 2.6.0
|
mime: 2.6.0
|
||||||
|
@ -18158,7 +18159,7 @@ packages:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@hapi/hoek': 10.0.1
|
'@hapi/hoek': 10.0.1
|
||||||
'@hapi/wreck': 18.0.1
|
'@hapi/wreck': 18.0.1
|
||||||
debug: 4.3.4(supports-color@8.1.1)
|
debug: 4.3.4(supports-color@5.5.0)
|
||||||
joi: 17.7.0
|
joi: 17.7.0
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
|
@ -18358,7 +18359,7 @@ packages:
|
||||||
engines: {node: '>= 14'}
|
engines: {node: '>= 14'}
|
||||||
dependencies:
|
dependencies:
|
||||||
agent-base: 7.1.0
|
agent-base: 7.1.0
|
||||||
debug: 4.3.4(supports-color@8.1.1)
|
debug: 4.3.4(supports-color@5.5.0)
|
||||||
socks: 2.7.1
|
socks: 2.7.1
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
|
@ -18511,7 +18512,7 @@ packages:
|
||||||
arg: 5.0.2
|
arg: 5.0.2
|
||||||
bluebird: 3.7.2
|
bluebird: 3.7.2
|
||||||
check-more-types: 2.24.0
|
check-more-types: 2.24.0
|
||||||
debug: 4.3.4(supports-color@8.1.1)
|
debug: 4.3.4(supports-color@5.5.0)
|
||||||
execa: 5.1.1
|
execa: 5.1.1
|
||||||
lazy-ass: 1.6.0
|
lazy-ass: 1.6.0
|
||||||
ps-tree: 1.2.0
|
ps-tree: 1.2.0
|
||||||
|
@ -18769,7 +18770,6 @@ packages:
|
||||||
engines: {node: '>=4'}
|
engines: {node: '>=4'}
|
||||||
dependencies:
|
dependencies:
|
||||||
has-flag: 3.0.0
|
has-flag: 3.0.0
|
||||||
dev: true
|
|
||||||
|
|
||||||
/supports-color@7.2.0:
|
/supports-color@7.2.0:
|
||||||
resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
|
resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
|
||||||
|
@ -18932,6 +18932,7 @@ packages:
|
||||||
acorn: 8.11.3
|
acorn: 8.11.3
|
||||||
commander: 2.20.3
|
commander: 2.20.3
|
||||||
source-map-support: 0.5.21
|
source-map-support: 0.5.21
|
||||||
|
dev: false
|
||||||
|
|
||||||
/test-exclude@6.0.0:
|
/test-exclude@6.0.0:
|
||||||
resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==}
|
resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==}
|
||||||
|
@ -19390,7 +19391,7 @@ packages:
|
||||||
chalk: 4.1.2
|
chalk: 4.1.2
|
||||||
cli-highlight: 2.1.11
|
cli-highlight: 2.1.11
|
||||||
dayjs: 1.11.10
|
dayjs: 1.11.10
|
||||||
debug: 4.3.4(supports-color@8.1.1)
|
debug: 4.3.4(supports-color@5.5.0)
|
||||||
dotenv: 16.0.3
|
dotenv: 16.0.3
|
||||||
glob: 10.3.10
|
glob: 10.3.10
|
||||||
ioredis: 5.3.2
|
ioredis: 5.3.2
|
||||||
|
@ -19653,6 +19654,7 @@ packages:
|
||||||
requiresBuild: true
|
requiresBuild: true
|
||||||
dependencies:
|
dependencies:
|
||||||
node-gyp-build: 4.6.0
|
node-gyp-build: 4.6.0
|
||||||
|
dev: false
|
||||||
|
|
||||||
/util-deprecate@1.0.2:
|
/util-deprecate@1.0.2:
|
||||||
resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
|
resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
|
||||||
|
@ -19744,17 +19746,17 @@ packages:
|
||||||
core-util-is: 1.0.2
|
core-util-is: 1.0.2
|
||||||
extsprintf: 1.3.0
|
extsprintf: 1.3.0
|
||||||
|
|
||||||
/vite-node@0.34.6(@types/node@20.11.5)(sass@1.70.0)(terser@5.27.0):
|
/vite-node@0.34.6(@types/node@20.11.5)(sass@1.70.0):
|
||||||
resolution: {integrity: sha512-nlBMJ9x6n7/Amaz6F3zJ97EBwR2FkzhBRxF5e+jE6LA3yi6Wtc2lyTij1OnDMIr34v5g/tVQtsVAzhT0jc5ygA==}
|
resolution: {integrity: sha512-nlBMJ9x6n7/Amaz6F3zJ97EBwR2FkzhBRxF5e+jE6LA3yi6Wtc2lyTij1OnDMIr34v5g/tVQtsVAzhT0jc5ygA==}
|
||||||
engines: {node: '>=v14.18.0'}
|
engines: {node: '>=v14.18.0'}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
dependencies:
|
dependencies:
|
||||||
cac: 6.7.14
|
cac: 6.7.14
|
||||||
debug: 4.3.4(supports-color@8.1.1)
|
debug: 4.3.4(supports-color@5.5.0)
|
||||||
mlly: 1.5.0
|
mlly: 1.5.0
|
||||||
pathe: 1.1.2
|
pathe: 1.1.2
|
||||||
picocolors: 1.0.0
|
picocolors: 1.0.0
|
||||||
vite: 5.0.12(@types/node@20.11.5)(sass@1.70.0)(terser@5.27.0)
|
vite: 5.0.12(@types/node@20.11.5)(sass@1.70.0)
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- '@types/node'
|
- '@types/node'
|
||||||
- less
|
- less
|
||||||
|
@ -19770,7 +19772,7 @@ packages:
|
||||||
resolution: {integrity: sha512-p4D8CFVhZS412SyQX125qxyzOgIFouwOcvjZWk6bQbNPR1wtaEzFT6jZxAjf1dejlGqa6fqHcuCvQea6EWUkUA==}
|
resolution: {integrity: sha512-p4D8CFVhZS412SyQX125qxyzOgIFouwOcvjZWk6bQbNPR1wtaEzFT6jZxAjf1dejlGqa6fqHcuCvQea6EWUkUA==}
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/vite@5.0.12(@types/node@20.11.5)(sass@1.70.0)(terser@5.27.0):
|
/vite@5.0.12(@types/node@20.11.5)(sass@1.70.0):
|
||||||
resolution: {integrity: sha512-4hsnEkG3q0N4Tzf1+t6NdN9dg/L3BM+q8SWgbSPnJvrgH2kgdyzfVJwbR1ic69/4uMJJ/3dqDZZE5/WwqW8U1w==}
|
resolution: {integrity: sha512-4hsnEkG3q0N4Tzf1+t6NdN9dg/L3BM+q8SWgbSPnJvrgH2kgdyzfVJwbR1ic69/4uMJJ/3dqDZZE5/WwqW8U1w==}
|
||||||
engines: {node: ^18.0.0 || >=20.0.0}
|
engines: {node: ^18.0.0 || >=20.0.0}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
|
@ -19803,7 +19805,6 @@ packages:
|
||||||
postcss: 8.4.33
|
postcss: 8.4.33
|
||||||
rollup: 4.9.6
|
rollup: 4.9.6
|
||||||
sass: 1.70.0
|
sass: 1.70.0
|
||||||
terser: 5.27.0
|
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
fsevents: 2.3.3
|
fsevents: 2.3.3
|
||||||
|
|
||||||
|
@ -19814,12 +19815,12 @@ packages:
|
||||||
vitest: '>=0.16.0'
|
vitest: '>=0.16.0'
|
||||||
dependencies:
|
dependencies:
|
||||||
cross-fetch: 3.1.5
|
cross-fetch: 3.1.5
|
||||||
vitest: 0.34.6(happy-dom@10.0.3)(sass@1.70.0)(terser@5.27.0)
|
vitest: 0.34.6(happy-dom@10.0.3)(sass@1.70.0)
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- encoding
|
- encoding
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/vitest@0.34.6(happy-dom@10.0.3)(sass@1.70.0)(terser@5.27.0):
|
/vitest@0.34.6(happy-dom@10.0.3)(sass@1.70.0):
|
||||||
resolution: {integrity: sha512-+5CALsOvbNKnS+ZHMXtuUC7nL8/7F1F2DnHGjSsszX8zCjWSSviphCb/NuS9Nzf4Q03KyyDRBAXhF/8lffME4Q==}
|
resolution: {integrity: sha512-+5CALsOvbNKnS+ZHMXtuUC7nL8/7F1F2DnHGjSsszX8zCjWSSviphCb/NuS9Nzf4Q03KyyDRBAXhF/8lffME4Q==}
|
||||||
engines: {node: '>=v14.18.0'}
|
engines: {node: '>=v14.18.0'}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
|
@ -19862,7 +19863,7 @@ packages:
|
||||||
acorn-walk: 8.3.2
|
acorn-walk: 8.3.2
|
||||||
cac: 6.7.14
|
cac: 6.7.14
|
||||||
chai: 4.3.10
|
chai: 4.3.10
|
||||||
debug: 4.3.4(supports-color@8.1.1)
|
debug: 4.3.4(supports-color@5.5.0)
|
||||||
happy-dom: 10.0.3
|
happy-dom: 10.0.3
|
||||||
local-pkg: 0.4.3
|
local-pkg: 0.4.3
|
||||||
magic-string: 0.30.5
|
magic-string: 0.30.5
|
||||||
|
@ -19872,8 +19873,8 @@ packages:
|
||||||
strip-literal: 1.3.0
|
strip-literal: 1.3.0
|
||||||
tinybench: 2.6.0
|
tinybench: 2.6.0
|
||||||
tinypool: 0.7.0
|
tinypool: 0.7.0
|
||||||
vite: 5.0.12(@types/node@20.11.5)(sass@1.70.0)(terser@5.27.0)
|
vite: 5.0.12(@types/node@20.11.5)(sass@1.70.0)
|
||||||
vite-node: 0.34.6(@types/node@20.11.5)(sass@1.70.0)(terser@5.27.0)
|
vite-node: 0.34.6(@types/node@20.11.5)(sass@1.70.0)
|
||||||
why-is-node-running: 2.2.2
|
why-is-node-running: 2.2.2
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- less
|
- less
|
||||||
|
@ -19944,7 +19945,7 @@ packages:
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
eslint: '>=6.0.0'
|
eslint: '>=6.0.0'
|
||||||
dependencies:
|
dependencies:
|
||||||
debug: 4.3.4(supports-color@8.1.1)
|
debug: 4.3.4(supports-color@5.5.0)
|
||||||
eslint: 8.56.0
|
eslint: 8.56.0
|
||||||
eslint-scope: 7.2.2
|
eslint-scope: 7.2.2
|
||||||
eslint-visitor-keys: 3.4.3
|
eslint-visitor-keys: 3.4.3
|
||||||
|
@ -20274,6 +20275,19 @@ packages:
|
||||||
async-limiter: 1.0.1
|
async-limiter: 1.0.1
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
|
/ws@8.16.0:
|
||||||
|
resolution: {integrity: sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==}
|
||||||
|
engines: {node: '>=10.0.0'}
|
||||||
|
peerDependencies:
|
||||||
|
bufferutil: ^4.0.1
|
||||||
|
utf-8-validate: '>=5.0.2'
|
||||||
|
peerDependenciesMeta:
|
||||||
|
bufferutil:
|
||||||
|
optional: true
|
||||||
|
utf-8-validate:
|
||||||
|
optional: true
|
||||||
|
dev: true
|
||||||
|
|
||||||
/ws@8.16.0(bufferutil@4.0.7)(utf-8-validate@6.0.3):
|
/ws@8.16.0(bufferutil@4.0.7)(utf-8-validate@6.0.3):
|
||||||
resolution: {integrity: sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==}
|
resolution: {integrity: sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==}
|
||||||
engines: {node: '>=10.0.0'}
|
engines: {node: '>=10.0.0'}
|
||||||
|
@ -20288,6 +20302,7 @@ packages:
|
||||||
dependencies:
|
dependencies:
|
||||||
bufferutil: 4.0.7
|
bufferutil: 4.0.7
|
||||||
utf-8-validate: 6.0.3
|
utf-8-validate: 6.0.3
|
||||||
|
dev: false
|
||||||
|
|
||||||
/xev@3.0.2:
|
/xev@3.0.2:
|
||||||
resolution: {integrity: sha512-8kxuH95iMXzHZj+fwqfA4UrPcYOy6bGIgfWzo9Ji23JoEc30ge/Z++Ubkiuy8c0+M64nXmmxrmJ7C8wnuBhluw==}
|
resolution: {integrity: sha512-8kxuH95iMXzHZj+fwqfA4UrPcYOy6bGIgfWzo9Ji23JoEc30ge/Z++Ubkiuy8c0+M64nXmmxrmJ7C8wnuBhluw==}
|
||||||
|
|
Loading…
Reference in New Issue