Compare commits
	
		
			18 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 17fff8c665 | ||
|   | fa9f0d9ff9 | ||
|   | 77ccf3b929 | ||
|   | 4b205aee91 | ||
|   | d348e211d4 | ||
|   | 42539575a6 | ||
|   | 8bce241170 | ||
|   | c039665a97 | ||
|   | 92977f303d | ||
|   | 0038f3b244 | ||
|   | 2f1fb9fe2d | ||
|   | 8c6d5408eb | ||
|   | 3f6a55aabd | ||
|   | f37c25d00e | ||
|   | 23821d6fad | ||
|   | c384c4ca6c | ||
|   | 946ba2a8ae | ||
|   | 55b673cc6f | 
| @@ -5,7 +5,7 @@ | ||||
| import * as fs from 'fs'; | ||||
| import * as gulp from 'gulp'; | ||||
| import * as rimraf from 'rimraf'; | ||||
| import * as replace from 'gulp-replace'; | ||||
| const replace = require('gulp-replace'); | ||||
| const terser = require('gulp-terser'); | ||||
| const cssnano = require('gulp-cssnano'); | ||||
|  | ||||
|   | ||||
| @@ -704,6 +704,7 @@ editCode: "Code bearbeiten" | ||||
| apply: "Anwenden" | ||||
| receiveAnnouncementFromInstance: "E-Mail-Benachrichtigungen von dieser Instanz empfangen" | ||||
| emailNotification: "E-Mail-Benachrichtigungen" | ||||
| publish: "Veröffentlichen" | ||||
| inChannelSearch: "In Kanal suchen" | ||||
| useReactionPickerForContextMenu: "Reaktionsauswahl durch Rechtsklick öffnen" | ||||
| typingUsers: "{users} ist/sind am schreiben..." | ||||
| @@ -739,7 +740,15 @@ switch: "Wechseln" | ||||
| noMaintainerInformationWarning: "Betreiberinformationen sind nicht konfiguriert." | ||||
| noBotProtectionWarning: "Bot-Schutz ist nicht konfiguriert." | ||||
| configure: "Konfigurieren" | ||||
| postToGallery: "Beitrag zu Galerie hinzufügen" | ||||
| gallery: "Galerie" | ||||
| recentPosts: "Neue Beiträge" | ||||
| popularPosts: "Beliebte Beiträge" | ||||
| shareWithNote: "Mit Notiz teilen" | ||||
| _gallery: | ||||
|   my: "Meine Galerie" | ||||
|   liked: "Beiträge, die mir gefallen" | ||||
|   like: "Gefällt mir" | ||||
|   unlike: "\"Gefällt mir\" entfernen" | ||||
| _email: | ||||
|   _follow: | ||||
|   | ||||
| @@ -704,6 +704,7 @@ editCode: "Edit code" | ||||
| apply: "Apply" | ||||
| receiveAnnouncementFromInstance: "Receive Email notifications from this instance" | ||||
| emailNotification: "Email notifications" | ||||
| publish: "Publish" | ||||
| inChannelSearch: "Search in channel" | ||||
| useReactionPickerForContextMenu: "Open reaction picker on right-click" | ||||
| typingUsers: "{users} is/are typing..." | ||||
| @@ -740,7 +741,15 @@ switch: "Switch" | ||||
| noMaintainerInformationWarning: "Maintainer information is not configured." | ||||
| noBotProtectionWarning: "Bot protection is not configured." | ||||
| configure: "Configure" | ||||
| postToGallery: "Post to Gallery" | ||||
| gallery: "Gallery" | ||||
| recentPosts: "Recent posts" | ||||
| popularPosts: "Popular posts" | ||||
| shareWithNote: "Share with note" | ||||
| _gallery: | ||||
|   my: "My Gallery" | ||||
|   liked: "Liked Posts" | ||||
|   like: "Like" | ||||
|   unlike: "Undo like" | ||||
| _email: | ||||
|   _follow: | ||||
|   | ||||
| @@ -138,6 +138,7 @@ flagAsBotDescription: "Si ce compte est géré de manière automatisée , défin | ||||
| flagAsCat: "Ce compte est un chat" | ||||
| flagAsCatDescription: "Activer l'option \" Je suis un chat \" pour ce compte." | ||||
| autoAcceptFollowed: "Accepter automatiquement les demandes d’abonnement venant d’utilisateur·rice·s que vous suivez" | ||||
| addAccount: "Ajouter un compte" | ||||
| loginFailed: "Échec de la connexion" | ||||
| showOnRemote: "Voir sur l’instance distante" | ||||
| general: "Général" | ||||
| @@ -451,6 +452,7 @@ category: "Catégorie" | ||||
| tags: "Étiquettes" | ||||
| docSource: "Source de ce document" | ||||
| createAccount: "Créer un compte" | ||||
| existingAccount: "Compte existant" | ||||
| regenerate: "Générer à nouveau" | ||||
| fontSize: "Taille de la police" | ||||
| noFollowRequests: "Vous n’avez aucune demande d’abonnement en attente" | ||||
| @@ -701,6 +703,7 @@ editCode: "Modifier le code" | ||||
| apply: "Appliquer" | ||||
| receiveAnnouncementFromInstance: "Recevoir les messages d'information de l'instance" | ||||
| emailNotification: "Notifications par mail" | ||||
| publish: "Public" | ||||
| inChannelSearch: "Chercher dans le canal" | ||||
| useReactionPickerForContextMenu: "Clic-droit pour ouvrir le panneau de réactions" | ||||
| typingUsers: "{users} est en train d'écrire" | ||||
| @@ -731,7 +734,20 @@ disabled: "Désactivé" | ||||
| quickAction: "Actions rapides" | ||||
| user: "Utilisateur·rice·s" | ||||
| administration: "Gestion" | ||||
| accounts: "Comptes" | ||||
| switch: "Remplacer" | ||||
| noMaintainerInformationWarning: "Informations administrateur non configurées." | ||||
| noBotProtectionWarning: "La protection contre les bots n'est pas configurée." | ||||
| configure: "Configurer" | ||||
| postToGallery: "Publier dans la galerie" | ||||
| gallery: "Galerie" | ||||
| recentPosts: "Les plus récentes" | ||||
| popularPosts: "Les plus consultées" | ||||
| shareWithNote: "Partager dans une note" | ||||
| _gallery: | ||||
|   my: "Mes publications" | ||||
|   liked: " Publications que j'ai aimées" | ||||
|   like: "J'aime" | ||||
|   unlike: "Je n’aime pas" | ||||
| _email: | ||||
|   _follow: | ||||
| @@ -884,11 +900,13 @@ _theme: | ||||
|   funcKind: "Type de fonction" | ||||
|   argument: "Argument" | ||||
|   alpha: "Transparence" | ||||
|   darken: "Assombrir" | ||||
|   darken: "Sombre" | ||||
|   lighten: "Clair" | ||||
|   inputConstantName: "Insérez un nom de constante" | ||||
|   importInfo: "Vous pouvez importer un thème vers l’éditeur de thèmes en saisissant son code ici." | ||||
|   deleteConstantConfirm: "Êtes-vous sûr·e de vouloir supprimer la constante {const} ?" | ||||
|   keys: | ||||
|     accent: "Accentuation" | ||||
|     bg: "Arrière-plan" | ||||
|     fg: "Texte" | ||||
|     focus: "Mise au point" | ||||
| @@ -924,6 +942,8 @@ _theme: | ||||
|     driveFolderBg: "Arrière-plan du dossier de disque" | ||||
|     badge: "Badge" | ||||
|     messageBg: "Arrière plan de la discussion" | ||||
|     accentDarken: "Plus sombre" | ||||
|     accentLighten: "Plus clair" | ||||
|     fgHighlighted: "Texte mis en évidence" | ||||
| _sfx: | ||||
|   note: "Nouvelle note" | ||||
| @@ -1139,12 +1159,12 @@ _instanceCharts: | ||||
|   usersTotal: "Nombre d'utilisateur·rice·s au total cumulé" | ||||
|   notes: "Variation du nombre des notes" | ||||
|   notesTotal: "Nombre total cumulé des notes" | ||||
|   ff: "Variation des abonné·e·s" | ||||
|   ffTotal: "Nombre d'abonné·e·s au total cumulé" | ||||
|   ff: "Variation des abonné·e·s et des abonnements" | ||||
|   ffTotal: "Total cumulé du nombre d'abonné·e·s et du nombre d'abonnements" | ||||
|   cacheSize: "Variation de la taille du cache" | ||||
|   cacheSizeTotal: "La taille du cache au total cumulé" | ||||
|   cacheSizeTotal: "Total cumulé de la taille du cache" | ||||
|   files: "Variation du nombre de fichiers" | ||||
|   filesTotal: "Nombre de fichiers au total cumulé" | ||||
|   filesTotal: "Total cumulé du nombre de fichiers" | ||||
| _timelines: | ||||
|   home: "Principal" | ||||
|   local: "Local" | ||||
| @@ -1221,7 +1241,7 @@ _pages: | ||||
|   deleted: "La page a été supprimée" | ||||
|   pageSetting: "Paramètres de la Page" | ||||
|   nameAlreadyExists: "L'URL de page spécifiée existe déjà" | ||||
|   invalidNameTitle: "La URL de la page spécifiée n’est pas valide" | ||||
|   invalidNameTitle: "L'URL de page spécifiée n’est pas valide" | ||||
|   invalidNameText: "Assurez-vous qu’il n’est pas vide" | ||||
|   editThisPage: "Éditer cette page" | ||||
|   viewSource: "Afficher la source" | ||||
| @@ -1243,14 +1263,14 @@ _pages: | ||||
|   font: "Police de caractères" | ||||
|   fontSerif: "Serif" | ||||
|   fontSansSerif: "Sans Serif" | ||||
|   eyeCatchingImageSet: "Définir une image attirante" | ||||
|   eyeCatchingImageRemove: "Supprimer une image attirante" | ||||
|   eyeCatchingImageSet: "Définir une image attractive" | ||||
|   eyeCatchingImageRemove: "Supprimer l'image attractive" | ||||
|   chooseBlock: "Ajouter un bloc" | ||||
|   selectType: "Choisir un type" | ||||
|   enterVariableName: "Veuillez entrer un nom pour votre variable" | ||||
|   variableNameIsAlreadyUsed: "Cette variable est déjà utilisée" | ||||
|   variableNameIsAlreadyUsed: "Ce nom de variable est déjà utilisé" | ||||
|   contentBlocks: "Contenu" | ||||
|   inputBlocks: "Entrée" | ||||
|   inputBlocks: "Blocs d'entrée" | ||||
|   specialBlocks: "Spécial" | ||||
|   blocks: | ||||
|     text: "Texte" | ||||
|   | ||||
| @@ -136,6 +136,7 @@ flagAsBotDescription: "Se l'account esegue principalmente operazioni automatiche | ||||
| flagAsCat: "Io sono un gatto" | ||||
| flagAsCatDescription: "Abilita l'opzione \"Io sono un gatto\" per l'account." | ||||
| autoAcceptFollowed: "Accetta automaticamente le richieste di follow da utenti che già segui" | ||||
| addAccount: "Aggiungi account" | ||||
| loginFailed: "Accesso non riuscito" | ||||
| showOnRemote: "Sfoglia sull'istanza remota" | ||||
| general: "Generali" | ||||
| @@ -439,6 +440,7 @@ category: "Categoria" | ||||
| tags: "Tag" | ||||
| docSource: "Sorgente della scheda" | ||||
| createAccount: "Crea il tuo account" | ||||
| existingAccount: "Account esistente" | ||||
| regenerate: "Generare di nuovo" | ||||
| fontSize: "Dimensione carattere" | ||||
| noFollowRequests: "Non hai alcuna richiesta di follow" | ||||
| @@ -569,6 +571,7 @@ useGlobalSetting: "Usa impostazioni generali" | ||||
| useGlobalSettingDesc: "Se abilitato, le impostazioni notifiche dell'account verranno utilizzate. Se disabilitato, si possono definire diverse singole impostazioni." | ||||
| other: "Avanzate" | ||||
| fileIdOrUrl: "ID o URL del file" | ||||
| chatOpenBehavior: "Comportamento della finestra di chat quando viene aperta" | ||||
| behavior: "Comportamento" | ||||
| abuseReports: "Segnala" | ||||
| reportAbuse: "Segnala" | ||||
| @@ -650,9 +653,12 @@ youAreRunningUpToDateClient: "Stai usando la versione più recente del client." | ||||
| newVersionOfClientAvailable: "Una nuova versione del tuo client è disponibile." | ||||
| usageAmount: "In utilizzo" | ||||
| capacity: "Capacità" | ||||
| inUse: "In utilizzo" | ||||
| editCode: "Modifica codice" | ||||
| apply: "Applica" | ||||
| receiveAnnouncementFromInstance: "Ricevi i messaggi informativi dall'istanza" | ||||
| emailNotification: "Eventi per notifiche via mail" | ||||
| publish: "Pubblico" | ||||
| inChannelSearch: "Cerca in canale" | ||||
| useReactionPickerForContextMenu: "Cliccare sul tasto destro per aprire il pannello di reazioni" | ||||
| typingUsers: "{users} sta(nno) scrivendo" | ||||
| @@ -683,8 +689,21 @@ disabled: "Inattivo" | ||||
| quickAction: "Azioni rapide" | ||||
| user: "Utente" | ||||
| administration: "Gestione" | ||||
| accounts: "Account" | ||||
| switch: "Sostituisci" | ||||
| noMaintainerInformationWarning: "Le informazioni amministratore non sono impostate." | ||||
| noBotProtectionWarning: "Nessuna protezione impostata contro i bot." | ||||
| configure: "Imposta" | ||||
| postToGallery: "Pubblicare nella galleria" | ||||
| gallery: "Galleria" | ||||
| recentPosts: "Le più recenti" | ||||
| popularPosts: "Le più visualizzate" | ||||
| shareWithNote: "Condividere in nota" | ||||
| _gallery: | ||||
|   unlike: "Togli Mi piace" | ||||
|   my: "Le mie pubblicazioni" | ||||
|   liked: "Pubblicazioni che mi piacciono" | ||||
|   like: "Mi piace!" | ||||
|   unlike: "Non mi piace più" | ||||
| _email: | ||||
|   _follow: | ||||
|     title: "Ha iniziato a seguirti" | ||||
| @@ -916,6 +935,7 @@ _widgets: | ||||
|   photos: "Foto" | ||||
|   digitalClock: "Orologio digitale" | ||||
|   federation: "Federazione" | ||||
|   postForm: "Finestra di pubblicazione" | ||||
|   button: "Pulsante" | ||||
|   onlineUsers: "Utenti online" | ||||
|   jobQueue: "Coda di lavoro" | ||||
| @@ -989,6 +1009,9 @@ _instanceCharts: | ||||
|   users: "Variazione del numero di utenti" | ||||
|   usersTotal: "Totale cumulativo di utenti" | ||||
|   notes: "Variazione del numero di note" | ||||
|   notesTotal: "Totale cumulato di note" | ||||
|   files: "Variazione del numero di file" | ||||
|   filesTotal: "Totale cumulato del numero di file" | ||||
| _timelines: | ||||
|   home: "Home" | ||||
|   local: "Locale" | ||||
| @@ -996,8 +1019,16 @@ _timelines: | ||||
|   global: "Federata" | ||||
| _rooms: | ||||
|   roomOf: "Camera di {user}" | ||||
|   addFurniture: "Disponi mobilia" | ||||
|   translate: "Sposta" | ||||
|   rotate: "Ruota" | ||||
|   exit: "Indietro" | ||||
|   remove: "Togli" | ||||
|   clear: "Rimuovi tutto" | ||||
|   clearConfirm: "Sei sicur@ di voler rimuovere tutti i mobili dalla tua camera?" | ||||
|   leaveConfirm: "Hai fatto modifiche ancora non salvate. Vuoi davvero uscire?" | ||||
|   chooseImage: "Seleziona immagine" | ||||
|   roomType: "Tipo di stanza" | ||||
|   _roomType: | ||||
|     default: "Predefinito" | ||||
|     washitsu: "Washitsu" | ||||
| @@ -1034,6 +1065,7 @@ _rooms: | ||||
|     cube: "Cubo" | ||||
|     tv: "Televisore" | ||||
|     pinguin: "Pinguino" | ||||
|     rubik-cube: "Cubo di Rubik" | ||||
|     bin: "Cestino" | ||||
|     cup-noodle: "Noodle istantanei" | ||||
| _pages: | ||||
| @@ -1044,6 +1076,8 @@ _pages: | ||||
|   updated: "Pagina aggiornata con successo!" | ||||
|   deleted: "Pagina eliminata" | ||||
|   pageSetting: "Impostazioni pagina" | ||||
|   nameAlreadyExists: "Esiste già una pagina con lo stesso URL." | ||||
|   invalidNameTitle: "L'URL di pagina definito non è valido" | ||||
|   editThisPage: "Modifica questa pagina" | ||||
|   viewSource: "Visualizza sorgente" | ||||
|   viewPage: "Visualizza pagina" | ||||
| @@ -1056,11 +1090,21 @@ _pages: | ||||
|   content: "Blocco di pagina" | ||||
|   variables: "Variabili" | ||||
|   title: "Titolo" | ||||
|   url: "URL della pagina" | ||||
|   summary: "Riassunto di pagina" | ||||
|   hideTitleWhenPinned: "Nascondere il titolo pagina quando è fissata in cima al profilo." | ||||
|   font: "Tipo di carattere" | ||||
|   fontSerif: "Serif" | ||||
|   fontSansSerif: "Sans serif" | ||||
|   eyeCatchingImageSet: "Imposta un'immagine attrattiva" | ||||
|   eyeCatchingImageRemove: "Elimina l'immagine attrattiva" | ||||
|   chooseBlock: "Aggiungi blocco" | ||||
|   selectType: "Seleziona tipo" | ||||
|   enterVariableName: "Digita un nome di variabile" | ||||
|   variableNameIsAlreadyUsed: "Esiste già una variabile con lo stesso nome" | ||||
|   contentBlocks: "Contenuto" | ||||
|   inputBlocks: "Blocchi di input" | ||||
|   specialBlocks: "Speciale" | ||||
|   blocks: | ||||
|     text: "Testo" | ||||
|     textarea: "Area di testo" | ||||
| @@ -1070,16 +1114,20 @@ _pages: | ||||
|     if: "Se" | ||||
|     _if: | ||||
|       variable: "Variabili" | ||||
|     post: "Finestra di pubblicazione" | ||||
|     _post: | ||||
|       text: "Contenuto" | ||||
|     textInput: "Immissione testo" | ||||
|     _textInput: | ||||
|       name: "Nome della variabile" | ||||
|       text: "Titolo" | ||||
|       default: "Valore predefinito" | ||||
|     textareaInput: "Immissione testo a più righe" | ||||
|     _textareaInput: | ||||
|       name: "Nome della variabile" | ||||
|       text: "Titolo" | ||||
|       default: "Valore predefinito" | ||||
|     numberInput: "Immissione numerica" | ||||
|     _numberInput: | ||||
|       name: "Nome della variabile" | ||||
|       text: "Titolo" | ||||
| @@ -1092,24 +1140,35 @@ _pages: | ||||
|       id: "ID nota" | ||||
|       idDescription: "Qui puoi anche incollare l'URL della nota che vuoi impostare." | ||||
|       detailed: "Visualizzazione dettagliata" | ||||
|     switch: "Interruttore" | ||||
|     _switch: | ||||
|       name: "Nome della variabile" | ||||
|       text: "Titolo" | ||||
|       default: "Valore predefinito" | ||||
|     counter: "Contatore" | ||||
|     _counter: | ||||
|       name: "Nome della variabile" | ||||
|       text: "Titolo" | ||||
|       inc: "Valore da aggiungere" | ||||
|     _button: | ||||
|       text: "Titolo" | ||||
|       colored: "Colorato" | ||||
|       action: "Operazione da eseguire quando viene premuto il pulsante" | ||||
|       _action: | ||||
|         dialog: "Visualizzare una finestra di dialogo" | ||||
|         _dialog: | ||||
|           content: "Contenuto" | ||||
|         resetRandom: "Ripristinare un numero aleatorio" | ||||
|         pushEvent: "Inviare evento" | ||||
|         _pushEvent: | ||||
|           event: "Nome evento" | ||||
|           message: "Messaggio da visualizzare quando abilitato" | ||||
|           variable: "Variabile da inviare" | ||||
|           no-variable: "Nessun contenuto" | ||||
|         callAiScript: "Chiamare AiScript" | ||||
|         _callAiScript: | ||||
|           functionName: "Nome della funzione" | ||||
|     radioButton: "Opzioni" | ||||
|     _radioButton: | ||||
|       name: "Nome della variabile" | ||||
|       title: "Titolo" | ||||
| @@ -1123,6 +1182,8 @@ _pages: | ||||
|       list: "Liste" | ||||
|     blocks: | ||||
|       text: "Testo" | ||||
|       multiLineText: "Testo (a più righe)" | ||||
|       textList: "Lista di testo" | ||||
|       _strLen: | ||||
|         arg1: "Testo" | ||||
|       _strPick: | ||||
| @@ -1177,13 +1238,18 @@ _pages: | ||||
|         arg2: "B" | ||||
|       _if: | ||||
|         arg1: "Se" | ||||
|         arg2: "Se" | ||||
|       random: "Aleatorietà" | ||||
|       _randomPick: | ||||
|         arg1: "Liste" | ||||
|       _dailyRandomPick: | ||||
|         arg1: "Liste" | ||||
|       _seedRandom: | ||||
|         arg2: "Probabilità" | ||||
|       _seedRandomPick: | ||||
|         arg2: "Liste" | ||||
|       _DRPWPM: | ||||
|         arg1: "Lista di testo" | ||||
|       _pick: | ||||
|         arg1: "Liste" | ||||
|       _listLen: | ||||
| @@ -1197,6 +1263,7 @@ _pages: | ||||
|     types: | ||||
|       string: "Testo" | ||||
|       array: "Liste" | ||||
|       stringArray: "Lista di testo" | ||||
| _notification: | ||||
|   fileUploaded: "File caricato correttamente" | ||||
|   youGotMention: "{name} ti ha menzionato" | ||||
|   | ||||
| @@ -726,6 +726,7 @@ active: "최근에 활동함" | ||||
| offline: "오프라인" | ||||
| user: "유저" | ||||
| administration: "관리" | ||||
| gallery: "갤러리" | ||||
| _gallery: | ||||
|   unlike: "좋아요 해제" | ||||
| _email: | ||||
|   | ||||
| @@ -704,6 +704,7 @@ editCode: "编辑代码" | ||||
| apply: "应用" | ||||
| receiveAnnouncementFromInstance: "从实例接收通知" | ||||
| emailNotification: "邮件通知" | ||||
| publish: "发布" | ||||
| inChannelSearch: "频道内搜索" | ||||
| useReactionPickerForContextMenu: "单击右键打开回应工具栏" | ||||
| typingUsers: "{users}正在输入" | ||||
| @@ -741,7 +742,15 @@ switch: "切换" | ||||
| noMaintainerInformationWarning: "管理人员信息未设置。" | ||||
| noBotProtectionWarning: "Bot保护未设置。" | ||||
| configure: "设置" | ||||
| postToGallery: "发送到图库" | ||||
| gallery: "图库" | ||||
| recentPosts: "最新发布" | ||||
| popularPosts: "热门投稿" | ||||
| shareWithNote: "在帖子中分享" | ||||
| _gallery: | ||||
|   my: "我的图库" | ||||
|   liked: "喜欢的图片" | ||||
|   like: "喜欢❤" | ||||
|   unlike: "取消赞" | ||||
| _email: | ||||
|   _follow: | ||||
|   | ||||
							
								
								
									
										45
									
								
								package.json
									
									
									
									
									
								
							
							
						
						
									
										45
									
								
								package.json
									
									
									
									
									
								
							| @@ -1,7 +1,7 @@ | ||||
| { | ||||
| 	"name": "misskey", | ||||
| 	"author": "syuilo <syuilotan@yahoo.co.jp>", | ||||
| 	"version": "12.79.0", | ||||
| 	"version": "12.79.2", | ||||
| 	"codename": "indigo", | ||||
| 	"repository": { | ||||
| 		"type": "git", | ||||
| @@ -47,16 +47,15 @@ | ||||
| 		"@sinonjs/fake-timers": "7.0.5", | ||||
| 		"@syuilo/aiscript": "0.11.1", | ||||
| 		"@types/bcryptjs": "2.4.2", | ||||
| 		"@types/bull": "3.15.0", | ||||
| 		"@types/bull": "3.15.1", | ||||
| 		"@types/cbor": "5.0.1", | ||||
| 		"@types/dateformat": "3.0.1", | ||||
| 		"@types/escape-regexp": "0.0.0", | ||||
| 		"@types/glob": "7.1.3", | ||||
| 		"@types/gulp": "4.0.8", | ||||
| 		"@types/gulp-rename": "2.0.0", | ||||
| 		"@types/gulp-replace": "0.0.31", | ||||
| 		"@types/is-url": "1.2.28", | ||||
| 		"@types/js-yaml": "4.0.0", | ||||
| 		"@types/js-yaml": "4.0.1", | ||||
| 		"@types/jsdom": "16.2.10", | ||||
| 		"@types/jsonld": "1.5.5", | ||||
| 		"@types/katex": "0.11.0", | ||||
| @@ -107,31 +106,31 @@ | ||||
| 		"@typescript-eslint/parser": "4.22.0", | ||||
| 		"@vue/compiler-sfc": "3.0.11", | ||||
| 		"abort-controller": "3.0.0", | ||||
| 		"apexcharts": "3.26.0", | ||||
| 		"apexcharts": "3.26.1", | ||||
| 		"autobind-decorator": "2.4.0", | ||||
| 		"autosize": "4.0.2", | ||||
| 		"autwh": "0.1.0", | ||||
| 		"aws-sdk": "2.887.0", | ||||
| 		"aws-sdk": "2.892.0", | ||||
| 		"bcryptjs": "2.4.3", | ||||
| 		"blurhash": "1.1.3", | ||||
| 		"broadcast-channel": "3.5.3", | ||||
| 		"bull": "3.22.0", | ||||
| 		"bull": "3.22.3", | ||||
| 		"cafy": "15.2.1", | ||||
| 		"cbor": "7.0.5", | ||||
| 		"chalk": "4.1.0", | ||||
| 		"chalk": "4.1.1", | ||||
| 		"chart.js": "2.9.4", | ||||
| 		"cli-highlight": "2.1.11", | ||||
| 		"commander": "7.2.0", | ||||
| 		"concurrently": "6.0.2", | ||||
| 		"content-disposition": "0.5.3", | ||||
| 		"core-js": "3.10.1", | ||||
| 		"core-js": "3.11.0", | ||||
| 		"crc-32": "1.2.0", | ||||
| 		"css-loader": "5.2.1", | ||||
| 		"css-loader": "5.2.4", | ||||
| 		"cssnano": "5.0.1", | ||||
| 		"dateformat": "4.5.1", | ||||
| 		"diskusage": "1.1.3", | ||||
| 		"escape-regexp": "0.0.1", | ||||
| 		"eslint": "7.24.0", | ||||
| 		"eslint": "7.25.0", | ||||
| 		"eslint-plugin-vue": "7.9.0", | ||||
| 		"eventemitter3": "4.0.7", | ||||
| 		"feed": "4.2.2", | ||||
| @@ -142,7 +141,7 @@ | ||||
| 		"gulp": "4.0.2", | ||||
| 		"gulp-cssnano": "2.1.3", | ||||
| 		"gulp-rename": "2.0.0", | ||||
| 		"gulp-replace": "1.0.0", | ||||
| 		"gulp-replace": "1.1.1", | ||||
| 		"gulp-terser": "2.0.1", | ||||
| 		"gulp-tslint": "8.1.4", | ||||
| 		"hard-source-webpack-plugin": "0.13.1", | ||||
| @@ -160,7 +159,7 @@ | ||||
| 		"json5-loader": "4.0.1", | ||||
| 		"jsonld": "4.0.1", | ||||
| 		"jsrsasign": "8.0.20", | ||||
| 		"katex": "0.13.2", | ||||
| 		"katex": "0.13.3", | ||||
| 		"koa": "2.13.1", | ||||
| 		"koa-bodyparser": "4.3.0", | ||||
| 		"koa-favicon": "2.1.0", | ||||
| @@ -172,7 +171,7 @@ | ||||
| 		"koa-views": "7.0.1", | ||||
| 		"langmap": "0.0.16", | ||||
| 		"lookup-dns-cache": "2.1.0", | ||||
| 		"markdown-it": "12.0.5", | ||||
| 		"markdown-it": "12.0.6", | ||||
| 		"markdown-it-anchor": "7.1.0", | ||||
| 		"matter-js": "0.17.1", | ||||
| 		"mfm-js": "0.16.3", | ||||
| @@ -188,7 +187,7 @@ | ||||
| 		"parse5": "6.0.1", | ||||
| 		"pg": "8.6.0", | ||||
| 		"portscanner": "2.2.0", | ||||
| 		"postcss": "8.2.10", | ||||
| 		"postcss": "8.2.12", | ||||
| 		"postcss-loader": "5.2.0", | ||||
| 		"prismjs": "1.23.0", | ||||
| 		"probe-image-size": "7.1.0", | ||||
| @@ -202,7 +201,7 @@ | ||||
| 		"ratelimiter": "3.4.1", | ||||
| 		"re2": "1.15.9", | ||||
| 		"reconnecting-websocket": "4.4.0", | ||||
| 		"redis": "3.1.1", | ||||
| 		"redis": "3.1.2", | ||||
| 		"redis-lock": "0.1.4", | ||||
| 		"reflect-metadata": "0.1.13", | ||||
| 		"regenerator-runtime": "0.13.7", | ||||
| @@ -212,7 +211,7 @@ | ||||
| 		"rimraf": "3.0.2", | ||||
| 		"rndstr": "1.0.0", | ||||
| 		"s-age": "1.1.2", | ||||
| 		"sass": "1.32.8", | ||||
| 		"sass": "1.32.11", | ||||
| 		"sass-loader": "11.0.1", | ||||
| 		"seedrandom": "3.0.5", | ||||
| 		"sharp": "0.28.1", | ||||
| @@ -228,9 +227,9 @@ | ||||
| 		"throttle-debounce": "3.0.1", | ||||
| 		"tinycolor2": "1.4.2", | ||||
| 		"tmp": "0.2.1", | ||||
| 		"ts-loader": "8.1.0", | ||||
| 		"ts-loader": "9.1.1", | ||||
| 		"ts-node": "9.1.1", | ||||
| 		"tsc-alias": "1.2.9", | ||||
| 		"tsc-alias": "1.2.10", | ||||
| 		"tsconfig-paths": "3.9.0", | ||||
| 		"tslint": "6.1.3", | ||||
| 		"tslint-sonarts": "1.9.0", | ||||
| @@ -250,15 +249,15 @@ | ||||
| 		"vue-svg-loader": "0.17.0-beta.2", | ||||
| 		"vuedraggable": "4.0.1", | ||||
| 		"web-push": "3.4.4", | ||||
| 		"webpack": "5.33.2", | ||||
| 		"webpack": "5.35.1", | ||||
| 		"webpack-cli": "4.6.0", | ||||
| 		"websocket": "1.0.34", | ||||
| 		"ws": "7.4.4", | ||||
| 		"ws": "7.4.5", | ||||
| 		"xev": "2.0.1" | ||||
| 	}, | ||||
| 	"devDependencies": { | ||||
| 		"@types/chai": "4.2.15", | ||||
| 		"@types/fluent-ffmpeg": "2.1.16", | ||||
| 		"@types/chai": "4.2.16", | ||||
| 		"@types/fluent-ffmpeg": "2.1.17", | ||||
| 		"chai": "4.3.4", | ||||
| 		"cross-env": "7.0.3" | ||||
| 	} | ||||
|   | ||||
| @@ -6,7 +6,7 @@ | ||||
| </template> | ||||
|  | ||||
| <script lang="ts"> | ||||
| import { defineComponent } from 'vue'; | ||||
| import { defineComponent, PropType } from 'vue'; | ||||
|  | ||||
| type Captcha = { | ||||
| 	render(container: string | Node, options: { | ||||
| @@ -32,7 +32,7 @@ declare global { | ||||
| export default defineComponent({ | ||||
| 	props: { | ||||
| 		provider: { | ||||
| 			type: String, | ||||
| 			type: String as PropType<CaptchaProvider>, | ||||
| 			required: true, | ||||
| 		}, | ||||
| 		sitekey: { | ||||
| @@ -51,19 +51,25 @@ export default defineComponent({ | ||||
| 	}, | ||||
|  | ||||
| 	computed: { | ||||
| 		loaded() { | ||||
| 			return !!window[this.provider as CaptchaProvider]; | ||||
| 		variable(): string { | ||||
| 			switch (this.provider) { | ||||
| 				case 'hcaptcha': return 'hcaptcha'; | ||||
| 				case 'recaptcha': return 'grecaptcha'; | ||||
| 			} | ||||
| 		}, | ||||
| 		src() { | ||||
| 		loaded(): boolean { | ||||
| 			return !!window[this.variable]; | ||||
| 		}, | ||||
| 		src(): string { | ||||
| 			const endpoint = ({ | ||||
| 				hcaptcha: 'https://hcaptcha.com/1', | ||||
| 				recaptcha: 'https://www.recaptcha.net/recaptcha', | ||||
| 			} as Record<PropertyKey, unknown>)[this.provider]; | ||||
| 			} as Record<CaptchaProvider, string>)[this.provider]; | ||||
|  | ||||
| 			return `${typeof endpoint == 'string' ? endpoint : 'about:invalid'}/api.js?render=explicit`; | ||||
| 			return `${typeof endpoint === 'string' ? endpoint : 'about:invalid'}/api.js?render=explicit`; | ||||
| 		}, | ||||
| 		captcha() { | ||||
| 			return window[this.provider as CaptchaProvider] || {} as unknown as Captcha; | ||||
| 		captcha(): Captcha { | ||||
| 			return window[this.variable] || {} as unknown as Captcha; | ||||
| 		}, | ||||
| 	}, | ||||
|  | ||||
| @@ -94,7 +100,7 @@ export default defineComponent({ | ||||
|  | ||||
| 	methods: { | ||||
| 		reset() { | ||||
| 			this.captcha?.reset(); | ||||
| 			if (this.captcha?.reset) this.captcha.reset(); | ||||
| 		}, | ||||
| 		requestRender() { | ||||
| 			if (this.captcha.render && this.$refs.captcha instanceof Element) { | ||||
|   | ||||
| @@ -81,7 +81,7 @@ export default defineComponent({ | ||||
| 		getMenu() { | ||||
| 			return [{ | ||||
| 				text: this.$ts.rename, | ||||
| 				icon: faICursor, | ||||
| 				icon: 'fas fa-i-cursor', | ||||
| 				action: this.rename | ||||
| 			}, { | ||||
| 				text: this.file.isSensitive ? this.$ts.unmarkAsSensitive : this.$ts.markAsSensitive, | ||||
|   | ||||
| @@ -247,7 +247,7 @@ export default defineComponent({ | ||||
| 				} | ||||
| 			}, null, { | ||||
| 				text: this.$ts.rename, | ||||
| 				icon: faICursor, | ||||
| 				icon: 'fas fa-i-cursor', | ||||
| 				action: this.rename | ||||
| 			}, null, { | ||||
| 				text: this.$ts.delete, | ||||
|   | ||||
| @@ -614,7 +614,7 @@ export default defineComponent({ | ||||
| 				type: 'label' | ||||
| 			}, this.folder ? { | ||||
| 				text: this.$ts.renameFolder, | ||||
| 				icon: faICursor, | ||||
| 				icon: 'fas fa-i-cursor', | ||||
| 				action: () => { this.renameFolder(this.folder); } | ||||
| 			} : undefined, this.folder ? { | ||||
| 				text: this.$ts.deleteFolder, | ||||
|   | ||||
| @@ -16,16 +16,16 @@ | ||||
| 			</template> | ||||
| 		</div> | ||||
| 		<div class="sub"> | ||||
| 			<MkA to="/docs" @click.passive="close()"> | ||||
| 			<MkA to="/docs" @click.passive="close()" v-click-anime> | ||||
| 				<i class="fas fa-question-circle icon"></i> | ||||
| 				<div class="text">{{ $ts.help }}</div> | ||||
| 			</MkA> | ||||
| 			<MkA to="/about" @click.passive="close()"> | ||||
| 			<MkA to="/about" @click.passive="close()" v-click-anime> | ||||
| 				<i class="fas fa-info-circle icon"></i> | ||||
| 				<div class="text">{{ $t('aboutX', { x: instanceName }) }}</div> | ||||
| 			</MkA> | ||||
| 			<MkA to="/about-misskey" @click.passive="close()"> | ||||
| 				<i class="fas fa-info-circle icon"></i> | ||||
| 			<MkA to="/about-misskey" @click.passive="close()" v-click-anime> | ||||
| 				<img src="/static-assets/favicon.png" class="icon"/> | ||||
| 				<div class="text">{{ $ts.aboutMisskey }}</div> | ||||
| 			</MkA> | ||||
| 		</div> | ||||
| @@ -101,6 +101,7 @@ export default defineComponent({ | ||||
| 			flex-direction: column; | ||||
| 			align-items: center; | ||||
| 			justify-content: center; | ||||
| 			vertical-align: bottom; | ||||
| 			width: 128px; | ||||
| 			height: 128px; | ||||
| 			border-radius: var(--radius); | ||||
| @@ -117,6 +118,7 @@ export default defineComponent({ | ||||
|  | ||||
| 			> .icon { | ||||
| 				font-size: 26px; | ||||
| 				height: 32px; | ||||
| 			} | ||||
|  | ||||
| 			> .text { | ||||
|   | ||||
| @@ -93,7 +93,7 @@ export default defineComponent({ | ||||
| 			if (this.menu) return; | ||||
| 			this.menu = os.modalMenu([{ | ||||
| 				text: this.$ts.renameFile, | ||||
| 				icon: faICursor, | ||||
| 				icon: 'fas fa-i-cursor', | ||||
| 				action: () => { this.rename(file) } | ||||
| 			}, { | ||||
| 				text: file.isSensitive ? this.$ts.unmarkAsSensitive : this.$ts.markAsSensitive, | ||||
|   | ||||
| @@ -1,39 +1,57 @@ | ||||
| <template> | ||||
| <FormBase class="mmnnbwxb" v-if="meta"> | ||||
| 	<div class="_formItem logo"> | ||||
| 		<img v-if="meta.logoImageUrl" :src="meta.logoImageUrl"> | ||||
| 		<span v-else class="text">{{ instanceName }}</span> | ||||
| <FormBase> | ||||
| 	<div class="_formItem"> | ||||
| 		<div class="_formPanel fwhjspax"> | ||||
| 			<img :src="$instance.iconUrl || $instance.faviconUrl || '/favicon.ico'" alt="" class="icon"/> | ||||
| 			<span class="name">{{ $instance.name || host }}</span> | ||||
| 		</div> | ||||
| 	</div> | ||||
|  | ||||
| 	<FormTextarea readonly :value="$instance.description"> | ||||
| 	</FormTextarea> | ||||
|  | ||||
| 	<FormGroup> | ||||
| 		<FormKeyValueView> | ||||
| 			<template #key>Misskey</template> | ||||
| 			<template #value>v{{ version }}</template> | ||||
| 		</FormKeyValueView> | ||||
| 		<FormLink to="/about-misskey">{{ $ts.aboutMisskey }}</FormLink> | ||||
| 	</FormGroup> | ||||
|  | ||||
| 	<FormGroup> | ||||
| 		<FormKeyValueView> | ||||
| 			<template #key>{{ $ts.administrator }}</template> | ||||
| 			<template #value>{{ meta.maintainerName }}</template> | ||||
| 			<template #value>{{ $instance.maintainerName }}</template> | ||||
| 		</FormKeyValueView> | ||||
| 		<FormKeyValueView> | ||||
| 			<template #key>{{ $ts.contact }}</template> | ||||
| 			<template #value>{{ meta.maintainerEmail }}</template> | ||||
| 			<template #value>{{ $instance.maintainerEmail }}</template> | ||||
| 		</FormKeyValueView> | ||||
| 	</FormGroup> | ||||
|  | ||||
| 	<FormLink v-if="meta.tosUrl" :to="meta.tosUrl" external>{{ $ts.tos }}</FormLink> | ||||
| 	<FormLink v-if="$instance.tosUrl" :to="$instance.tosUrl" external>{{ $ts.tos }}</FormLink> | ||||
|  | ||||
| 	<FormGroup v-if="stats"> | ||||
| 		<template #label>{{ $ts.statistics }}</template> | ||||
| 		<FormKeyValueView> | ||||
| 			<template #key>{{ $ts.users }}</template> | ||||
| 			<template #value>{{ number(stats.originalUsersCount) }}</template> | ||||
| 		</FormKeyValueView> | ||||
| 		<FormKeyValueView> | ||||
| 			<template #key>{{ $ts.notes }}</template> | ||||
| 			<template #value>{{ number(stats.originalNotesCount) }}</template> | ||||
| 		</FormKeyValueView> | ||||
| 	<FormSuspense :p="initStats"> | ||||
| 		<FormGroup> | ||||
| 			<template #label>{{ $ts.statistics }}</template> | ||||
| 			<FormKeyValueView> | ||||
| 				<template #key>{{ $ts.users }}</template> | ||||
| 				<template #value>{{ number(stats.originalUsersCount) }}</template> | ||||
| 			</FormKeyValueView> | ||||
| 			<FormKeyValueView> | ||||
| 				<template #key>{{ $ts.notes }}</template> | ||||
| 				<template #value>{{ number(stats.originalNotesCount) }}</template> | ||||
| 			</FormKeyValueView> | ||||
| 		</FormGroup> | ||||
| 	</FormSuspense> | ||||
|  | ||||
| 	<FormGroup> | ||||
| 		<template #label>Well-known resources</template> | ||||
| 		<FormLink :to="`/.well-known/host-meta`" external>host-meta</FormLink> | ||||
| 		<FormLink :to="`/.well-known/host-meta.json`" external>host-meta.json</FormLink> | ||||
| 		<FormLink :to="`/.well-known/nodeinfo`" external>nodeinfo</FormLink> | ||||
| 		<FormLink :to="`/robots.txt`" external>robots.txt</FormLink> | ||||
| 		<FormLink :to="`/manifest.json`" external>manifest.json</FormLink> | ||||
| 	</FormGroup> | ||||
| </FormBase> | ||||
| </template> | ||||
| @@ -45,9 +63,12 @@ import FormLink from '@client/components/form/link.vue'; | ||||
| import FormBase from '@client/components/form/base.vue'; | ||||
| import FormGroup from '@client/components/form/group.vue'; | ||||
| import FormKeyValueView from '@client/components/form/key-value-view.vue'; | ||||
| import FormTextarea from '@client/components/form/textarea.vue'; | ||||
| import FormSuspense from '@client/components/form/suspense.vue'; | ||||
| import * as os from '@client/os'; | ||||
| import number from '@client/filters/number'; | ||||
| import * as symbols from '@client/symbols'; | ||||
| import { host } from '@client/config'; | ||||
|  | ||||
| export default defineComponent({ | ||||
| 	components: { | ||||
| @@ -55,6 +76,8 @@ export default defineComponent({ | ||||
| 		FormGroup, | ||||
| 		FormLink, | ||||
| 		FormKeyValueView, | ||||
| 		FormTextarea, | ||||
| 		FormSuspense, | ||||
| 	}, | ||||
|  | ||||
| 	data() { | ||||
| @@ -63,24 +86,17 @@ export default defineComponent({ | ||||
| 				title: this.$ts.instanceInfo, | ||||
| 				icon: 'fas fa-info-circle' | ||||
| 			}, | ||||
| 			host, | ||||
| 			version, | ||||
| 			instanceName, | ||||
| 			stats: null, | ||||
| 			initStats: () => os.api('stats', { | ||||
| 			}).then((stats) => { | ||||
| 				this.stats = stats; | ||||
| 			}) | ||||
| 		} | ||||
| 	}, | ||||
|  | ||||
| 	computed: { | ||||
| 		meta() { | ||||
| 			return this.$instance; | ||||
| 		}, | ||||
| 	}, | ||||
|  | ||||
| 	created() { | ||||
| 		os.api('stats').then(stats => { | ||||
| 			this.stats = stats; | ||||
| 		}); | ||||
| 	}, | ||||
|  | ||||
| 	methods: { | ||||
| 		number | ||||
| 	} | ||||
| @@ -88,18 +104,20 @@ export default defineComponent({ | ||||
| </script> | ||||
|  | ||||
| <style lang="scss" scoped> | ||||
| .mmnnbwxb { | ||||
| 	max-width: 800px; | ||||
| 	box-sizing: border-box; | ||||
| 	margin: 0 auto; | ||||
| .fwhjspax { | ||||
| 	padding: 16px; | ||||
| 	text-align: center; | ||||
|  | ||||
| 	> .logo { | ||||
| 		text-align: center; | ||||
| 	> .icon { | ||||
| 		display: block; | ||||
| 		margin: auto; | ||||
| 		height: 64px; | ||||
| 		border-radius: 8px; | ||||
| 	} | ||||
|  | ||||
| 		> img { | ||||
| 			vertical-align: bottom; | ||||
| 			max-height: 100px; | ||||
| 		} | ||||
| 	> .name { | ||||
| 		display: block; | ||||
| 		margin-top: 12px; | ||||
| 	} | ||||
| } | ||||
| </style> | ||||
|   | ||||
							
								
								
									
										168
									
								
								src/client/pages/gallery/edit.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										168
									
								
								src/client/pages/gallery/edit.vue
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,168 @@ | ||||
| <template> | ||||
| <FormBase> | ||||
| 	<FormSuspense :p="init"> | ||||
| 		<FormInput v-model:value="title"> | ||||
| 			<span>{{ $ts.title }}</span> | ||||
| 		</FormInput> | ||||
|  | ||||
| 		<FormTextarea v-model:value="description" :max="500"> | ||||
| 			<span>{{ $ts.description }}</span> | ||||
| 		</FormTextarea> | ||||
|  | ||||
| 		<FormGroup> | ||||
| 			<div v-for="file in files" :key="file.id" class="_formItem _formPanel wqugxsfx" :style="{ backgroundImage: file ? `url(${ file.thumbnailUrl })` : null }"> | ||||
| 				<div class="name">{{ file.name }}</div> | ||||
| 				<button class="remove _button" @click="remove(file)" v-tooltip="$ts.remove"><i class="fas fa-times"></i></button> | ||||
| 			</div> | ||||
| 			<FormButton @click="selectFile" primary><i class="fas fa-plus"></i> {{ $ts.attachFile }}</FormButton> | ||||
| 		</FormGroup> | ||||
|  | ||||
| 		<FormSwitch v-model:value="isSensitive">{{ $ts.markAsSensitive }}</FormSwitch> | ||||
|  | ||||
| 		<FormButton v-if="postId" @click="save" primary><i class="fas fa-save"></i> {{ $ts.save }}</FormButton> | ||||
| 		<FormButton v-else @click="save" primary><i class="fas fa-save"></i> {{ $ts.publish }}</FormButton> | ||||
|  | ||||
| 		<FormButton v-if="postId" @click="del" danger><i class="fas fa-trash-alt"></i> {{ $ts.delete }}</FormButton> | ||||
| 	</FormSuspense> | ||||
| </FormBase> | ||||
| </template> | ||||
|  | ||||
| <script lang="ts"> | ||||
| import { computed, defineComponent } from 'vue'; | ||||
| import FormButton from '@client/components/form/button.vue'; | ||||
| import FormInput from '@client/components/form/input.vue'; | ||||
| import FormTextarea from '@client/components/form/textarea.vue'; | ||||
| import FormSwitch from '@client/components/form/switch.vue'; | ||||
| import FormTuple from '@client/components/form/tuple.vue'; | ||||
| import FormBase from '@client/components/form/base.vue'; | ||||
| import FormGroup from '@client/components/form/group.vue'; | ||||
| import FormSuspense from '@client/components/form/suspense.vue'; | ||||
| import { selectFile } from '@client/scripts/select-file'; | ||||
| import * as os from '@client/os'; | ||||
| import * as symbols from '@client/symbols'; | ||||
|  | ||||
| export default defineComponent({ | ||||
| 	components: { | ||||
| 		FormButton, | ||||
| 		FormInput, | ||||
| 		FormTextarea, | ||||
| 		FormSwitch, | ||||
| 		FormBase, | ||||
| 		FormGroup, | ||||
| 		FormSuspense, | ||||
| 	}, | ||||
|  | ||||
| 	props: { | ||||
| 		postId: { | ||||
| 			type: String, | ||||
| 			required: false, | ||||
| 			default: null, | ||||
| 		} | ||||
| 	}, | ||||
| 	 | ||||
| 	data() { | ||||
| 		return { | ||||
| 			[symbols.PAGE_INFO]: computed(() => this.postId ? { | ||||
| 				title: this.$ts.edit, | ||||
| 				icon: 'fas fa-pencil-alt' | ||||
| 			} : { | ||||
| 				title: this.$ts.postToGallery, | ||||
| 				icon: 'fas fa-pencil-alt' | ||||
| 			}), | ||||
| 			init: null, | ||||
| 			files: [], | ||||
| 			description: null, | ||||
| 			title: null, | ||||
| 			isSensitive: false, | ||||
| 		} | ||||
| 	}, | ||||
|  | ||||
| 	watch: { | ||||
| 		postId: { | ||||
| 			handler() { | ||||
| 				this.init = () => this.postId ? os.api('gallery/posts/show', { | ||||
| 					postId: this.postId | ||||
| 				}).then(post => { | ||||
| 					this.files = post.files; | ||||
| 					this.title = post.title; | ||||
| 					this.description = post.description; | ||||
| 					this.isSensitive = post.isSensitive; | ||||
| 				}) : Promise.resolve(null); | ||||
| 			}, | ||||
| 			immediate: true, | ||||
| 		} | ||||
| 	}, | ||||
|  | ||||
| 	methods: { | ||||
| 		selectFile(e) { | ||||
| 			selectFile(e.currentTarget || e.target, null, true).then(files => { | ||||
| 				this.files = this.files.concat(files); | ||||
| 			}); | ||||
| 		}, | ||||
|  | ||||
| 		remove(file) { | ||||
| 			this.files = this.files.filter(f => f.id !== file.id); | ||||
| 		}, | ||||
|  | ||||
| 		async save() { | ||||
| 			if (this.postId) { | ||||
| 				await os.apiWithDialog('gallery/posts/update', { | ||||
| 					postId: this.postId, | ||||
| 					title: this.title, | ||||
| 					description: this.description, | ||||
| 					fileIds: this.files.map(file => file.id), | ||||
| 					isSensitive: this.isSensitive, | ||||
| 				}); | ||||
| 				this.$router.push(`/gallery/${this.postId}`); | ||||
| 			} else { | ||||
| 				const post = await os.apiWithDialog('gallery/posts/create', { | ||||
| 					title: this.title, | ||||
| 					description: this.description, | ||||
| 					fileIds: this.files.map(file => file.id), | ||||
| 					isSensitive: this.isSensitive, | ||||
| 				}); | ||||
| 				this.$router.push(`/gallery/${post.id}`); | ||||
| 			} | ||||
| 		}, | ||||
|  | ||||
| 		async del() { | ||||
| 			const { canceled } = await os.dialog({ | ||||
| 				type: 'warning', | ||||
| 				text: this.$ts.deleteConfirm, | ||||
| 				showCancelButton: true | ||||
| 			}); | ||||
| 			if (canceled) return; | ||||
| 			await os.apiWithDialog('gallery/posts/delete', { | ||||
| 				postId: this.postId, | ||||
| 			}); | ||||
| 			this.$router.push(`/gallery`); | ||||
| 		} | ||||
| 	} | ||||
| }); | ||||
| </script> | ||||
|  | ||||
| <style lang="scss" scoped> | ||||
| .wqugxsfx { | ||||
| 	height: 200px; | ||||
| 	background-size: contain; | ||||
| 	background-position: center; | ||||
| 	background-repeat: no-repeat; | ||||
| 	position: relative; | ||||
|  | ||||
| 	> .name { | ||||
| 		position: absolute; | ||||
| 		top: 8px; | ||||
| 		left: 9px; | ||||
| 		padding: 8px; | ||||
| 		background: var(--panel); | ||||
| 	} | ||||
|  | ||||
| 	> .remove { | ||||
| 		position: absolute; | ||||
| 		top: 8px; | ||||
| 		right: 9px; | ||||
| 		padding: 8px; | ||||
| 		background: var(--panel); | ||||
| 	} | ||||
| } | ||||
| </style> | ||||
| @@ -1,110 +0,0 @@ | ||||
| <template> | ||||
| <FormBase> | ||||
| 	<FormInput v-model:value="title"> | ||||
| 		<span>{{ $ts.title }}</span> | ||||
| 	</FormInput> | ||||
|  | ||||
| 	<FormTextarea v-model:value="description" :max="500"> | ||||
| 		<span>{{ $ts.description }}</span> | ||||
| 	</FormTextarea> | ||||
|  | ||||
| 	<FormGroup> | ||||
| 		<div v-for="file in files" :key="file.id" class="_formItem _formPanel wqugxsfx" :style="{ backgroundImage: file ? `url(${ file.thumbnailUrl })` : null }"> | ||||
| 			<div class="name">{{ file.name }}</div> | ||||
| 			<button class="remove _button" @click="remove(file)" v-tooltip="$ts.remove"><i class="fas fa-times"></i></button> | ||||
| 		</div> | ||||
| 		<FormButton @click="selectFile" primary><i class="fas fa-plus"></i> {{ $ts.attachFile }}</FormButton> | ||||
| 	</FormGroup> | ||||
|  | ||||
| 	<FormSwitch v-model:value="isSensitive">{{ $ts.markAsSensitive }}</FormSwitch> | ||||
|  | ||||
| 	<FormButton @click="publish" primary><i class="fas fa-save"></i> {{ $ts.publish }}</FormButton> | ||||
| </FormBase> | ||||
| </template> | ||||
|  | ||||
| <script lang="ts"> | ||||
| import { defineComponent } from 'vue'; | ||||
| import FormButton from '@client/components/form/button.vue'; | ||||
| import FormInput from '@client/components/form/input.vue'; | ||||
| import FormTextarea from '@client/components/form/textarea.vue'; | ||||
| import FormSwitch from '@client/components/form/switch.vue'; | ||||
| import FormTuple from '@client/components/form/tuple.vue'; | ||||
| import FormBase from '@client/components/form/base.vue'; | ||||
| import FormGroup from '@client/components/form/group.vue'; | ||||
| import { selectFile } from '@client/scripts/select-file'; | ||||
| import * as os from '@client/os'; | ||||
| import * as symbols from '@client/symbols'; | ||||
|  | ||||
| export default defineComponent({ | ||||
| 	components: { | ||||
| 		FormButton, | ||||
| 		FormInput, | ||||
| 		FormTextarea, | ||||
| 		FormSwitch, | ||||
| 		FormBase, | ||||
| 		FormGroup, | ||||
| 	}, | ||||
| 	 | ||||
| 	data() { | ||||
| 		return { | ||||
| 			[symbols.PAGE_INFO]: { | ||||
| 				title: this.$ts.postToGallery, | ||||
| 				icon: 'fas fa-pencil-alt' | ||||
| 			}, | ||||
| 			files: [], | ||||
| 			description: null, | ||||
| 			title: null, | ||||
| 			isSensitive: false, | ||||
| 		} | ||||
| 	}, | ||||
|  | ||||
| 	methods: { | ||||
| 		selectFile(e) { | ||||
| 			selectFile(e.currentTarget || e.target, null, true).then(files => { | ||||
| 				this.files = this.files.concat(files); | ||||
| 			}); | ||||
| 		}, | ||||
|  | ||||
| 		remove(file) { | ||||
| 			this.files = this.files.filter(f => f.id !== file.id); | ||||
| 		}, | ||||
|  | ||||
| 		async publish() { | ||||
| 			const post = await os.apiWithDialog('gallery/posts/create', { | ||||
| 				title: this.title, | ||||
| 				description: this.description, | ||||
| 				fileIds: this.files.map(file => file.id), | ||||
| 				isSensitive: this.isSensitive, | ||||
| 			}); | ||||
|  | ||||
| 			this.$router.push(`/gallery/${post.id}`); | ||||
| 		} | ||||
| 	} | ||||
| }); | ||||
| </script> | ||||
|  | ||||
| <style lang="scss" scoped> | ||||
| .wqugxsfx { | ||||
| 	height: 200px; | ||||
| 	background-size: contain; | ||||
| 	background-position: center; | ||||
| 	background-repeat: no-repeat; | ||||
| 	position: relative; | ||||
|  | ||||
| 	> .name { | ||||
| 		position: absolute; | ||||
| 		top: 8px; | ||||
| 		left: 9px; | ||||
| 		padding: 8px; | ||||
| 		background: var(--panel); | ||||
| 	} | ||||
|  | ||||
| 	> .remove { | ||||
| 		position: absolute; | ||||
| 		top: 8px; | ||||
| 		right: 9px; | ||||
| 		padding: 8px; | ||||
| 		background: var(--panel); | ||||
| 	} | ||||
| } | ||||
| </style> | ||||
| @@ -19,7 +19,8 @@ | ||||
| 						<MkButton class="button" @click="like()" v-else v-tooltip="$ts._gallery.like"><i class="far fa-heart"></i><span class="count" v-if="post.likedCount > 0">{{ post.likedCount }}</span></MkButton> | ||||
| 					</div> | ||||
| 					<div class="other"> | ||||
| 						<button class="_button" @click="createNote" v-tooltip="$ts.shareWithNote" v-click-anime><i class="fas fa-retweet fa-fw"></i></button> | ||||
| 						<button v-if="$i && $i.id === post.user.id" class="_button" @click="edit" v-tooltip="$ts.edit" v-click-anime><i class="fas fa-pencil-alt fa-fw"></i></button> | ||||
| 						<button class="_button" @click="shareWithNote" v-tooltip="$ts.shareWithNote" v-click-anime><i class="fas fa-retweet fa-fw"></i></button> | ||||
| 						<button class="_button" @click="share" v-tooltip="$ts.share" v-click-anime><i class="fas fa-share-alt fa-fw"></i></button> | ||||
| 					</div> | ||||
| 				</div> | ||||
| @@ -84,6 +85,11 @@ export default defineComponent({ | ||||
| 					title: this.post.title, | ||||
| 					text: this.post.description, | ||||
| 				}, | ||||
| 				actions: [{ | ||||
| 					icon: 'fas fa-pencil-alt', | ||||
| 					text: this.$ts.edit, | ||||
| 					handler: this.edit | ||||
| 				}] | ||||
| 			} : null), | ||||
| 			otherPostsPagination: { | ||||
| 				endpoint: 'users/gallery/posts', | ||||
| @@ -125,6 +131,12 @@ export default defineComponent({ | ||||
| 			}); | ||||
| 		}, | ||||
|  | ||||
| 		shareWithNote() { | ||||
| 			os.post({ | ||||
| 				initialText: `${this.post.title} ${url}/gallery/${this.post.id}` | ||||
| 			}); | ||||
| 		}, | ||||
|  | ||||
| 		like() { | ||||
| 			os.apiWithDialog('gallery/posts/like', { | ||||
| 				postId: this.postId, | ||||
| @@ -149,10 +161,8 @@ export default defineComponent({ | ||||
| 			}); | ||||
| 		}, | ||||
|  | ||||
| 		createNote() { | ||||
| 			os.post({ | ||||
| 				initialText: `${this.post.title} ${url}/gallery/${this.post.id}` | ||||
| 			}); | ||||
| 		edit() { | ||||
| 			this.$router.push(`/gallery/${this.post.id}/edit`); | ||||
| 		} | ||||
| 	} | ||||
| }); | ||||
|   | ||||
| @@ -147,7 +147,6 @@ import * as os from '@client/os'; | ||||
| import number from '@client/filters/number'; | ||||
| import bytes from '@client/filters/bytes'; | ||||
| import * as symbols from '@client/symbols'; | ||||
| import { url } from '@client/config'; | ||||
|  | ||||
| const chartLimit = 90; | ||||
| const sum = (...arr) => arr.reduce((r, a) => r.map((b, i) => a[i] + b)); | ||||
| @@ -449,7 +448,7 @@ export default defineComponent({ | ||||
| .fnfelxur { | ||||
| 	padding: 16px; | ||||
|  | ||||
| 	> img { | ||||
| 	> .icon { | ||||
| 		display: block; | ||||
| 		margin: auto; | ||||
| 		height: 64px; | ||||
|   | ||||
| @@ -25,7 +25,6 @@ export default defineComponent({ | ||||
| 				endpoint: 'notes/mentions', | ||||
| 				limit: 10, | ||||
| 			}, | ||||
| 			faAt | ||||
| 		}; | ||||
| 	}, | ||||
|  | ||||
|   | ||||
| @@ -1,35 +1,60 @@ | ||||
| <template> | ||||
| <div class="xcukqgmh _root" v-if="page" :key="page.id" v-size="{ max: [450] }"> | ||||
| 	<div class="_block main"> | ||||
| 		<!-- | ||||
| 		<div class="header"> | ||||
| 			<h1>{{ page.title }}</h1> | ||||
| <div class="_root"> | ||||
| 	<transition name="fade" mode="out-in"> | ||||
| 		<div v-if="page" class="xcukqgmh" :key="page.id" v-size="{ max: [450] }"> | ||||
| 			<div class="_block main"> | ||||
| 				<!-- | ||||
| 				<div class="header"> | ||||
| 					<h1>{{ page.title }}</h1> | ||||
| 				</div> | ||||
| 				--> | ||||
| 				<div class="banner"> | ||||
| 					<img :src="page.eyeCatchingImage.url" v-if="page.eyeCatchingImageId"/> | ||||
| 				</div> | ||||
| 				<div class="content"> | ||||
| 					<XPage :page="page"/> | ||||
| 				</div> | ||||
| 				<div class="actions"> | ||||
| 					<div class="like"> | ||||
| 						<MkButton class="button" @click="unlike()" v-if="page.isLiked" v-tooltip="$ts._pages.unlike" primary><i class="fas fa-heart"></i><span class="count" v-if="page.likedCount > 0">{{ page.likedCount }}</span></MkButton> | ||||
| 						<MkButton class="button" @click="like()" v-else v-tooltip="$ts._pages.like"><i class="far fa-heart"></i><span class="count" v-if="page.likedCount > 0">{{ page.likedCount }}</span></MkButton> | ||||
| 					</div> | ||||
| 					<div class="other"> | ||||
| 						<button class="_button" @click="shareWithNote" v-tooltip="$ts.shareWithNote" v-click-anime><i class="fas fa-retweet fa-fw"></i></button> | ||||
| 						<button class="_button" @click="share" v-tooltip="$ts.share" v-click-anime><i class="fas fa-share-alt fa-fw"></i></button> | ||||
| 					</div> | ||||
| 				</div> | ||||
| 				<div class="user"> | ||||
| 					<MkAvatar :user="page.user" class="avatar"/> | ||||
| 					<div class="name"> | ||||
| 						<MkUserName :user="page.user" style="display: block;"/> | ||||
| 						<MkAcct :user="page.user"/> | ||||
| 					</div> | ||||
| 					<MkFollowButton v-if="!$i || $i.id != page.user.id" :user="page.user" :inline="true" :transparent="false" :full="true" large class="koudoku"/> | ||||
| 				</div> | ||||
| 				<div class="links"> | ||||
| 					<MkA :to="`/@${username}/pages/${pageName}/view-source`" class="link">{{ $ts._pages.viewSource }}</MkA> | ||||
| 					<template v-if="$i && $i.id === page.userId"> | ||||
| 						<MkA :to="`/pages/edit/${page.id}`" class="link">{{ $ts._pages.editThisPage }}</MkA> | ||||
| 						<button v-if="$i.pinnedPageId === page.id" @click="pin(false)" class="link _textButton">{{ $ts.unpin }}</button> | ||||
| 						<button v-else @click="pin(true)" class="link _textButton">{{ $ts.pin }}</button> | ||||
| 					</template> | ||||
| 				</div> | ||||
| 			</div> | ||||
| 			<div class="footer"> | ||||
| 				<div><i class="far fa-clock"></i> {{ $ts.createdAt }}: <MkTime :time="page.createdAt" mode="detail"/></div> | ||||
| 				<div v-if="page.createdAt != page.updatedAt"><i class="far fa-clock"></i> {{ $ts.updatedAt }}: <MkTime :time="page.updatedAt" mode="detail"/></div> | ||||
| 			</div> | ||||
| 			<MkContainer :max-height="300" :foldable="true" class="other"> | ||||
| 				<template #header><i class="fas fa-clock"></i> {{ $ts.recentPosts }}</template> | ||||
| 				<MkPagination :pagination="otherPostsPagination" #default="{items}"> | ||||
| 					<MkPagePreview v-for="page in items" :page="page" :key="page.id" class="_gap"/> | ||||
| 				</MkPagination> | ||||
| 			</MkContainer> | ||||
| 		</div> | ||||
| 		--> | ||||
| 		<div class="banner"> | ||||
| 			<img :src="page.eyeCatchingImage.url" v-if="page.eyeCatchingImageId"/> | ||||
| 		</div> | ||||
| 		<div class="content"> | ||||
| 			<XPage :page="page"/> | ||||
| 			<small style="display: block; opacity: 0.7; margin-top: 1em;">@{{ page.user.username }}</small> | ||||
| 		</div> | ||||
| 		<div class="like"> | ||||
| 			<MkButton class="button" @click="unlike()" v-if="page.isLiked" v-tooltip="$ts._pages.unlike" primary><i class="fas fa-heart"></i><span class="count" v-if="page.likedCount > 0">{{ page.likedCount }}</span></MkButton> | ||||
| 			<MkButton class="button" @click="like()" v-else v-tooltip="$ts._pages.like"><i class="far fa-heart"></i><span class="count" v-if="page.likedCount > 0">{{ page.likedCount }}</span></MkButton> | ||||
| 		</div> | ||||
| 		<div class="links"> | ||||
| 			<MkA :to="`/@${username}/pages/${pageName}/view-source`" class="link">{{ $ts._pages.viewSource }}</MkA> | ||||
| 			<template v-if="$i && $i.id === page.userId"> | ||||
| 				<MkA :to="`/pages/edit/${page.id}`" class="link">{{ $ts._pages.editThisPage }}</MkA> | ||||
| 				<button v-if="$i.pinnedPageId === page.id" @click="pin(false)" class="link _textButton">{{ $ts.unpin }}</button> | ||||
| 				<button v-else @click="pin(true)" class="link _textButton">{{ $ts.pin }}</button> | ||||
| 			</template> | ||||
| 		</div> | ||||
| 	</div> | ||||
| 	<div class="footer"> | ||||
| 		<div><i class="far fa-clock"></i> {{ $ts.createdAt }}: <MkTime :time="page.createdAt" mode="detail"/></div> | ||||
| 		<div v-if="page.createdAt != page.updatedAt"><i class="far fa-clock"></i> {{ $ts.updatedAt }}: <MkTime :time="page.updatedAt" mode="detail"/></div> | ||||
| 	</div> | ||||
| 		<MkError v-else-if="error" @retry="fetch()"/> | ||||
| 		<MkLoading v-else/> | ||||
| 	</transition> | ||||
| </div> | ||||
| </template> | ||||
|  | ||||
| @@ -39,11 +64,20 @@ import XPage from '@client/components/page/page.vue'; | ||||
| import MkButton from '@client/components/ui/button.vue'; | ||||
| import * as os from '@client/os'; | ||||
| import * as symbols from '@client/symbols'; | ||||
| import { url } from '@client/config'; | ||||
| import MkFollowButton from '@client/components/follow-button.vue'; | ||||
| import MkContainer from '@client/components/ui/container.vue'; | ||||
| import MkPagination from '@client/components/ui/pagination.vue'; | ||||
| import MkPagePreview from '@client/components/page-preview.vue'; | ||||
|  | ||||
| export default defineComponent({ | ||||
| 	components: { | ||||
| 		XPage, | ||||
| 		MkButton, | ||||
| 		MkFollowButton, | ||||
| 		MkContainer, | ||||
| 		MkPagination, | ||||
| 		MkPagePreview, | ||||
| 	}, | ||||
|  | ||||
| 	props: { | ||||
| @@ -69,6 +103,14 @@ export default defineComponent({ | ||||
| 				}, | ||||
| 			} : null), | ||||
| 			page: null, | ||||
| 			error: null, | ||||
| 			otherPostsPagination: { | ||||
| 				endpoint: 'users/pages', | ||||
| 				limit: 6, | ||||
| 				params: () => ({ | ||||
| 					userId: this.page.user.id | ||||
| 				}) | ||||
| 			}, | ||||
| 		}; | ||||
| 	}, | ||||
|  | ||||
| @@ -90,11 +132,28 @@ export default defineComponent({ | ||||
|  | ||||
| 	methods: { | ||||
| 		fetch() { | ||||
| 			this.page = null; | ||||
| 			os.api('pages/show', { | ||||
| 				name: this.pageName, | ||||
| 				username: this.username, | ||||
| 			}).then(page => { | ||||
| 				this.page = page; | ||||
| 			}).catch(e => { | ||||
| 				this.error = e; | ||||
| 			}); | ||||
| 		}, | ||||
|  | ||||
| 		share() { | ||||
| 			navigator.share({ | ||||
| 				title: this.page.title || this.page.name, | ||||
| 				text: this.page.summary, | ||||
| 				url: `${url}/@${this.page.user.username}/pages/${this.page.name}` | ||||
| 			}); | ||||
| 		}, | ||||
|  | ||||
| 		shareWithNote() { | ||||
| 			os.post({ | ||||
| 				initialText: `${this.page.title || this.page.name} ${url}/@${this.page.user.username}/pages/${this.page.name}` | ||||
| 			}); | ||||
| 		}, | ||||
|  | ||||
| @@ -132,6 +191,15 @@ export default defineComponent({ | ||||
| </script> | ||||
|  | ||||
| <style lang="scss" scoped> | ||||
| .fade-enter-active, | ||||
| .fade-leave-active { | ||||
| 	transition: opacity 0.125s ease; | ||||
| } | ||||
| .fade-enter-from, | ||||
| .fade-leave-to { | ||||
| 	opacity: 0; | ||||
| } | ||||
|  | ||||
| .xcukqgmh { | ||||
| 	--padding: 32px; | ||||
|  | ||||
| @@ -140,6 +208,8 @@ export default defineComponent({ | ||||
| 	} | ||||
|  | ||||
| 	> .main { | ||||
| 		padding: var(--padding); | ||||
|  | ||||
| 		> .header { | ||||
| 			padding: 16px; | ||||
|  | ||||
| @@ -150,36 +220,79 @@ export default defineComponent({ | ||||
|  | ||||
| 		> .banner { | ||||
| 			> img { | ||||
| 				// TODO: 良い感じのアスペクト比で表示 | ||||
| 				display: block; | ||||
| 				width: 100%; | ||||
| 				height: 120px; | ||||
| 				height: 150px; | ||||
| 				object-fit: cover; | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		> .content { | ||||
| 			padding: var(--padding); | ||||
| 			margin-top: 16px; | ||||
| 			padding: 16px 0 0 0; | ||||
| 		} | ||||
|  | ||||
| 		> .like { | ||||
| 			padding: var(--padding); | ||||
| 		> .actions { | ||||
| 			display: flex; | ||||
| 			align-items: center; | ||||
| 			margin-top: 16px; | ||||
| 			padding: 16px 0 0 0; | ||||
| 			border-top: solid 0.5px var(--divider); | ||||
|  | ||||
| 			> .button { | ||||
| 				--accent: rgb(241 97 132); | ||||
| 				--X8: rgb(241 92 128); | ||||
| 				--buttonBg: rgb(216 71 106 / 5%); | ||||
| 				--buttonHoverBg: rgb(216 71 106 / 10%); | ||||
| 				color: #ff002f; | ||||
| 			> .like { | ||||
| 				> .button { | ||||
| 					--accent: rgb(241 97 132); | ||||
| 					--X8: rgb(241 92 128); | ||||
| 					--buttonBg: rgb(216 71 106 / 5%); | ||||
| 					--buttonHoverBg: rgb(216 71 106 / 10%); | ||||
| 					color: #ff002f; | ||||
|  | ||||
| 				::v-deep(.count) { | ||||
| 					margin-left: 0.5em; | ||||
| 					::v-deep(.count) { | ||||
| 						margin-left: 0.5em; | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
|  | ||||
| 			> .other { | ||||
| 				margin-left: auto; | ||||
|  | ||||
| 				> button { | ||||
| 					padding: 8px; | ||||
| 					margin: 0 8px; | ||||
|  | ||||
| 					&:hover { | ||||
| 						color: var(--fgHighlighted); | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		> .user { | ||||
| 			margin-top: 16px; | ||||
| 			padding: 16px 0 0 0; | ||||
| 			border-top: solid 0.5px var(--divider); | ||||
| 			display: flex; | ||||
| 			align-items: center; | ||||
|  | ||||
| 			> .avatar { | ||||
| 				width: 52px; | ||||
| 				height: 52px; | ||||
| 			} | ||||
|  | ||||
| 			> .name { | ||||
| 				margin: 0 0 0 12px; | ||||
| 				font-size: 90%; | ||||
| 			} | ||||
|  | ||||
| 			> .koudoku { | ||||
| 				margin-left: auto; | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		> .links { | ||||
| 			padding: var(--padding); | ||||
| 			margin-top: 16px; | ||||
| 			padding: 24px 0 0 0; | ||||
| 			border-top: solid 0.5px var(--divider); | ||||
|  | ||||
| 			> .link { | ||||
|   | ||||
| @@ -161,15 +161,15 @@ | ||||
| 					</dl> | ||||
| 				</div> | ||||
| 				<div class="status"> | ||||
| 					<MkA :to="userPage(user)" :class="{ active: page === 'index' }"> | ||||
| 					<MkA :to="userPage(user)" :class="{ active: page === 'index' }" v-click-anime> | ||||
| 						<b>{{ number(user.notesCount) }}</b> | ||||
| 						<span>{{ $ts.notes }}</span> | ||||
| 					</MkA> | ||||
| 					<MkA :to="userPage(user, 'following')" :class="{ active: page === 'following' }"> | ||||
| 					<MkA :to="userPage(user, 'following')" :class="{ active: page === 'following' }" v-click-anime> | ||||
| 						<b>{{ number(user.followingCount) }}</b> | ||||
| 						<span>{{ $ts.following }}</span> | ||||
| 					</MkA> | ||||
| 					<MkA :to="userPage(user, 'followers')" :class="{ active: page === 'followers' }"> | ||||
| 					<MkA :to="userPage(user, 'followers')" :class="{ active: page === 'followers' }" v-click-anime> | ||||
| 						<b>{{ number(user.followersCount) }}</b> | ||||
| 						<span>{{ $ts.followers }}</span> | ||||
| 					</MkA> | ||||
|   | ||||
| @@ -38,7 +38,8 @@ export const router = createRouter({ | ||||
| 		{ path: '/pages/new', component: page('page-editor/page-editor') }, | ||||
| 		{ path: '/pages/edit/:pageId', component: page('page-editor/page-editor'), props: route => ({ initPageId: route.params.pageId }) }, | ||||
| 		{ path: '/gallery', component: page('gallery/index') }, | ||||
| 		{ path: '/gallery/new', component: page('gallery/new') }, | ||||
| 		{ path: '/gallery/new', component: page('gallery/edit') }, | ||||
| 		{ path: '/gallery/:postId/edit', component: page('gallery/edit'), props: route => ({ postId: route.params.postId }) }, | ||||
| 		{ path: '/gallery/:postId', component: page('gallery/post'), props: route => ({ postId: route.params.postId }) }, | ||||
| 		{ path: '/channels', component: page('channels') }, | ||||
| 		{ path: '/channels/new', component: page('channel-editor') }, | ||||
|   | ||||
| @@ -18,9 +18,11 @@ export const builtinThemes = [ | ||||
| 	require('@client/themes/l-light.json5'), | ||||
| 	require('@client/themes/l-apricot.json5'), | ||||
| 	require('@client/themes/l-rainy.json5'), | ||||
| 	require('@client/themes/l-vivid.json5'), | ||||
|  | ||||
| 	require('@client/themes/d-dark.json5'), | ||||
| 	require('@client/themes/d-persimmon.json5'), | ||||
| 	require('@client/themes/d-astro.json5'), | ||||
| 	require('@client/themes/d-black.json5'), | ||||
| ] as Theme[]; | ||||
|  | ||||
|   | ||||
| @@ -62,8 +62,9 @@ export const defaultStore = markRaw(new Storage('base', { | ||||
| 			'notifications', | ||||
| 			'messaging', | ||||
| 			'drive', | ||||
| 			'-', | ||||
| 			'followRequests', | ||||
| 			'-', | ||||
| 			'gallery', | ||||
| 			'featured', | ||||
| 			'explore', | ||||
| 			'announcements', | ||||
|   | ||||
							
								
								
									
										76
									
								
								src/client/themes/d-astro.json5
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										76
									
								
								src/client/themes/d-astro.json5
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,76 @@ | ||||
| { | ||||
| 	id: '080a01c5-377d-4fbb-88cc-6bb5d04977ea', | ||||
| 	base: 'dark', | ||||
| 	name: 'Mi Astro', | ||||
| 	author: 'syuilo', | ||||
| 	props: { | ||||
| 		bg: '#232125', | ||||
| 		fg: '#efdab9', | ||||
| 		cwBg: '#687390', | ||||
| 		cwFg: '#393f4f', | ||||
| 		link: '#78b0a0', | ||||
| 		warn: '#ecb637', | ||||
| 		badge: '#31b1ce', | ||||
| 		error: '#ec4137', | ||||
| 		focus: ':alpha<0.3<@accent', | ||||
| 		navBg: '@panel', | ||||
| 		navFg: '@fg', | ||||
| 		panel: '#2a272b', | ||||
| 		accent: '#81c08b', | ||||
| 		header: ':alpha<0.7<@bg', | ||||
| 		infoBg: '#253142', | ||||
| 		infoFg: '#fff', | ||||
| 		renote: '#659CC8', | ||||
| 		shadow: 'rgba(0, 0, 0, 0.3)', | ||||
| 		divider: 'rgba(255, 255, 255, 0.1)', | ||||
| 		hashtag: '#ff9156', | ||||
| 		mention: '#ffd152', | ||||
| 		modalBg: 'rgba(0, 0, 0, 0.5)', | ||||
| 		success: '#86b300', | ||||
| 		buttonBg: 'rgba(255, 255, 255, 0.05)', | ||||
| 		acrylicBg: ':alpha<0.5<@bg', | ||||
| 		cwHoverBg: '#707b97', | ||||
| 		indicator: '@accent', | ||||
| 		mentionMe: '#fb5d38', | ||||
| 		messageBg: ':lighten<5<@bg', | ||||
| 		navActive: '@accent', | ||||
| 		infoWarnBg: '#42321c', | ||||
| 		infoWarnFg: '#ffbd3e', | ||||
| 		navHoverFg: ':lighten<17<@fg', | ||||
| 		dateLabelFg: '@fg', | ||||
| 		inputBorder: '#959da2', | ||||
| 		panelBorder: 'rgba(0, 0, 0, 0)', | ||||
| 		panelShadow: '" 0 8px 24px rgba(0, 0, 0, 0.12)', | ||||
| 		accentDarken: ':darken<10<@accent', | ||||
| 		acrylicPanel: ':alpha<0.5<@panel', | ||||
| 		navIndicator: '@accent', | ||||
| 		accentLighten: ':lighten<10<@accent', | ||||
| 		buttonHoverBg: 'rgba(255, 255, 255, 0.1)', | ||||
| 		driveFolderBg: ':alpha<0.3<@accent', | ||||
| 		fgHighlighted: ':lighten<3<@fg', | ||||
| 		panelHeaderBg: ':lighten<3<@panel', | ||||
| 		panelHeaderFg: '@fg', | ||||
| 		htmlThemeColor: '@bg', | ||||
| 		panelHighlight: ':lighten<3<@panel', | ||||
| 		listItemHoverBg: 'rgba(255, 255, 255, 0.03)', | ||||
| 		scrollbarHandle: 'rgba(255, 255, 255, 0.2)', | ||||
| 		wallpaperOverlay: 'rgba(0, 0, 0, 0.5)', | ||||
| 		panelHeaderDivider: 'rgba(0, 0, 0, 0)', | ||||
| 		scrollbarHandleHover: 'rgba(255, 255, 255, 0.4)', | ||||
| 		X2: ':darken<2<@panel', | ||||
| 		X3: 'rgba(255, 255, 255, 0.05)', | ||||
| 		X4: 'rgba(255, 255, 255, 0.1)', | ||||
| 		X5: 'rgba(255, 255, 255, 0.05)', | ||||
| 		X6: 'rgba(255, 255, 255, 0.15)', | ||||
| 		X7: 'rgba(255, 255, 255, 0.05)', | ||||
| 		X8: ':lighten<5<@accent', | ||||
| 		X9: ':darken<5<@accent', | ||||
| 		X10: ':alpha<0.4<@accent', | ||||
| 		X11: 'rgba(0, 0, 0, 0.3)', | ||||
| 		X12: 'rgba(255, 255, 255, 0.1)', | ||||
| 		X13: 'rgba(255, 255, 255, 0.15)', | ||||
| 		X14: ':alpha<0.5<@navBg', | ||||
| 		X15: ':alpha<0<@panel', | ||||
| 		X16: ':alpha<0.7<@panel', | ||||
| 	}, | ||||
| } | ||||
| @@ -10,7 +10,7 @@ | ||||
| 	props: { | ||||
| 		bg: '#f9f9f9', | ||||
| 		fg: '#676767', | ||||
| 		divider: 'rgb(223, 223, 223)', | ||||
| 		divider: '#e8e8e8', | ||||
| 		header: ':alpha<0.7<@panel', | ||||
| 		navBg: '#fff', | ||||
| 		panel: '#fff', | ||||
|   | ||||
							
								
								
									
										82
									
								
								src/client/themes/l-vivid.json5
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										82
									
								
								src/client/themes/l-vivid.json5
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,82 @@ | ||||
| { | ||||
| 	id: '6128c2a9-5c54-43fe-a47d-17942356470b', | ||||
|  | ||||
| 	name: 'Mi Vivid', | ||||
| 	author: 'syuilo', | ||||
|  | ||||
| 	base: 'light', | ||||
|  | ||||
| 	props: { | ||||
| 		bg: '#fafafa', | ||||
| 		fg: '#444', | ||||
| 		cwBg: '#b1b9c1', | ||||
| 		cwFg: '#fff', | ||||
| 		link: '#ff9400', | ||||
| 		warn: '#ecb637', | ||||
| 		badge: '#31b1ce', | ||||
| 		error: '#ec4137', | ||||
| 		focus: ':alpha<0.3<@accent', | ||||
| 		navBg: '@panel', | ||||
| 		navFg: '@fg', | ||||
| 		panel: '#fff', | ||||
| 		accent: '#008cff', | ||||
| 		header: ':alpha<0.7<@panel', | ||||
| 		infoBg: '#e5f5ff', | ||||
| 		infoFg: '#72818a', | ||||
| 		renote: '@accent', | ||||
| 		shadow: 'rgba(0, 0, 0, 0.1)', | ||||
| 		divider: 'rgba(0, 0, 0, 0.08)', | ||||
| 		hashtag: '#92d400', | ||||
| 		mention: '@accent', | ||||
| 		modalBg: 'rgba(0, 0, 0, 0.3)', | ||||
| 		success: '#86b300', | ||||
| 		buttonBg: 'rgba(0, 0, 0, 0.05)', | ||||
| 		acrylicBg: ':alpha<0.5<@bg', | ||||
| 		cwHoverBg: '#bbc4ce', | ||||
| 		indicator: '@accent', | ||||
| 		mentionMe: '@mention', | ||||
| 		messageBg: '@panel', | ||||
| 		navActive: '@accent', | ||||
| 		infoWarnBg: '#fff0db', | ||||
| 		infoWarnFg: '#573c08', | ||||
| 		navHoverFg: ':darken<17<@fg', | ||||
| 		dateLabelFg: '@fg', | ||||
| 		inputBorder: '#dae0e4', | ||||
| 		panelBorder: 'rgba(0, 0, 0, 0)', | ||||
| 		panelShadow: '" 0 8px 24px rgb(21 43 75 / 8%)', | ||||
| 		accentDarken: ':darken<10<@accent', | ||||
| 		acrylicPanel: ':alpha<0.5<@panel', | ||||
| 		navIndicator: '@accent', | ||||
| 		accentLighten: ':lighten<10<@accent', | ||||
| 		buttonHoverBg: 'rgba(0, 0, 0, 0.1)', | ||||
| 		driveFolderBg: ':alpha<0.3<@accent', | ||||
| 		fgHighlighted: ':darken<3<@fg', | ||||
| 		fgTransparent: ':alpha<0.5<@fg', | ||||
| 		panelHeaderBg: ':lighten<3<@panel', | ||||
| 		panelHeaderFg: '@fg', | ||||
| 		htmlThemeColor: '@bg', | ||||
| 		panelHighlight: ':darken<3<@panel', | ||||
| 		listItemHoverBg: 'rgba(0, 0, 0, 0.03)', | ||||
| 		scrollbarHandle: 'rgba(0, 0, 0, 0.2)', | ||||
| 		wallpaperOverlay: 'rgba(255, 255, 255, 0.5)', | ||||
| 		fgTransparentWeak: ':alpha<0.75<@fg', | ||||
| 		panelHeaderDivider: '@divider', | ||||
| 		scrollbarHandleHover: 'rgba(0, 0, 0, 0.4)', | ||||
| 		X2: ':darken<2<@panel', | ||||
| 		X3: 'rgba(0, 0, 0, 0.05)', | ||||
| 		X4: 'rgba(0, 0, 0, 0.1)', | ||||
| 		X5: 'rgba(0, 0, 0, 0.05)', | ||||
| 		X6: 'rgba(0, 0, 0, 0.25)', | ||||
| 		X7: 'rgba(0, 0, 0, 0.05)', | ||||
| 		X8: ':lighten<5<@accent', | ||||
| 		X9: ':darken<5<@accent', | ||||
| 		X10: ':alpha<0.4<@accent', | ||||
| 		X11: 'rgba(0, 0, 0, 0.1)', | ||||
| 		X12: 'rgba(0, 0, 0, 0.1)', | ||||
| 		X13: 'rgba(0, 0, 0, 0.15)', | ||||
| 		X14: ':alpha<0.5<@navBg', | ||||
| 		X15: ':alpha<0<@panel', | ||||
| 		X16: ':alpha<0.7<@panel', | ||||
| 		X17: ':alpha<0.8<@bg', | ||||
| 	}, | ||||
| } | ||||
| @@ -313,7 +313,7 @@ export default defineComponent({ | ||||
| 				} | ||||
| 			}; | ||||
| 			if (isLink(e.target)) return; | ||||
| 			if (['INPUT', 'TEXTAREA', 'IMG'].includes(e.target.tagName) || e.target.attributes['contenteditable']) return; | ||||
| 			if (['INPUT', 'TEXTAREA', 'IMG', 'VIDEO'].includes(e.target.tagName) || e.target.attributes['contenteditable']) return; | ||||
| 			if (window.getSelection().toString() !== '') return; | ||||
| 			const path = this.$route.path; | ||||
| 			os.contextMenu([{ | ||||
|   | ||||
| @@ -64,7 +64,7 @@ export default defineComponent({ | ||||
| 				} | ||||
| 			}; | ||||
| 			if (isLink(e.target)) return; | ||||
| 			if (['INPUT', 'TEXTAREA', 'IMG'].includes(e.target.tagName) || e.target.attributes['contenteditable']) return; | ||||
| 			if (['INPUT', 'TEXTAREA', 'IMG', 'VIDEO'].includes(e.target.tagName) || e.target.attributes['contenteditable']) return; | ||||
| 			if (window.getSelection().toString() !== '') return; | ||||
| 			const path = this.$route.path; | ||||
| 			os.contextMenu([{ | ||||
|   | ||||
| @@ -36,7 +36,6 @@ export default defineComponent({ | ||||
| 				endpoint: 'notes/mentions', | ||||
| 				limit: 10, | ||||
| 			}, | ||||
| 			faAt | ||||
| 		} | ||||
| 	}, | ||||
|  | ||||
|   | ||||
| @@ -31,8 +31,10 @@ | ||||
| 		<i class="fas fa-cog fa-fw"></i><span class="text">{{ $ts.settings }}</span> | ||||
| 	</MkA> | ||||
| 	<div class="divider"></div> | ||||
| 	<div class="foo"> | ||||
| 		<MkEmoji :normal="true" :no-style="true" emoji="🍮"/> | ||||
| 	<div class="about"> | ||||
| 		<MkA class="link" to="/about" v-click-anime> | ||||
| 			<img :src="$instance.iconUrl || $instance.faviconUrl || '/favicon.ico'" class="_ghost"/> | ||||
| 		</MkA> | ||||
| 	</div> | ||||
| 	<!--<MisskeyLogo class="misskey"/>--> | ||||
| </div> | ||||
| @@ -260,14 +262,21 @@ export default defineComponent({ | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	> .misskey { | ||||
| 	> .about { | ||||
| 		fill: currentColor; | ||||
| 	} | ||||
|  | ||||
| 	> .foo { | ||||
| 		text-align: center; | ||||
| 		padding: 8px 0 16px 0; | ||||
| 		opacity: 0.5; | ||||
| 		text-align: center; | ||||
|  | ||||
| 		> .link { | ||||
| 			display: block; | ||||
| 			width: 32px; | ||||
| 			margin: 0 auto; | ||||
|  | ||||
| 			img { | ||||
| 				display: block; | ||||
| 				width: 100%; | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	> .item { | ||||
|   | ||||
| @@ -165,7 +165,7 @@ export default defineComponent({ | ||||
| 				} | ||||
| 			}; | ||||
| 			if (isLink(e.target)) return; | ||||
| 			if (['INPUT', 'TEXTAREA', 'IMG'].includes(e.target.tagName) || e.target.attributes['contenteditable']) return; | ||||
| 			if (['INPUT', 'TEXTAREA', 'IMG', 'VIDEO'].includes(e.target.tagName) || e.target.attributes['contenteditable']) return; | ||||
| 			if (window.getSelection().toString() !== '') return; | ||||
| 			const path = this.$route.path; | ||||
| 			os.contextMenu([{ | ||||
|   | ||||
| @@ -191,7 +191,7 @@ export default defineComponent({ | ||||
| 				} | ||||
| 			}; | ||||
| 			if (isLink(e.target)) return; | ||||
| 			if (['INPUT', 'TEXTAREA', 'IMG'].includes(e.target.tagName) || e.target.attributes['contenteditable']) return; | ||||
| 			if (['INPUT', 'TEXTAREA', 'IMG', 'VIDEO'].includes(e.target.tagName) || e.target.attributes['contenteditable']) return; | ||||
| 			if (window.getSelection().toString() !== '') return; | ||||
| 			const path = this.$route.path; | ||||
| 			os.contextMenu([{ | ||||
|   | ||||
| @@ -110,7 +110,7 @@ y = Math.floor(pos / mapWidth) | ||||
| ``` | ||||
|  | ||||
| ### フォームコントロールの種類 | ||||
| #### スイッチ | ||||
| #### Interruttore | ||||
| type: `switch` スイッチを表示します。何かの機能をオン/オフさせたい場合に有用です。 | ||||
|  | ||||
| ##### プロパティ | ||||
|   | ||||
| @@ -27,4 +27,8 @@ export const kinds = [ | ||||
| 	'write:user-groups', | ||||
| 	'read:channels', | ||||
| 	'write:channels', | ||||
| 	'read:gallery', | ||||
| 	'write:gallery', | ||||
| 	'read:gallery-likes', | ||||
| 	'write:gallery-likes', | ||||
| ]; | ||||
|   | ||||
							
								
								
									
										40
									
								
								src/server/api/endpoints/gallery/posts/delete.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								src/server/api/endpoints/gallery/posts/delete.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,40 @@ | ||||
| import $ from 'cafy'; | ||||
| import define from '../../../define'; | ||||
| import { ApiError } from '../../../error'; | ||||
| import { GalleryPosts } from '../../../../../models'; | ||||
| import { ID } from '@/misc/cafy-id'; | ||||
|  | ||||
| export const meta = { | ||||
| 	tags: ['gallery'], | ||||
|  | ||||
| 	requireCredential: true as const, | ||||
|  | ||||
| 	kind: 'write:gallery', | ||||
|  | ||||
| 	params: { | ||||
| 		postId: { | ||||
| 			validator: $.type(ID), | ||||
| 		}, | ||||
| 	}, | ||||
|  | ||||
| 	errors: { | ||||
| 		noSuchPost: { | ||||
| 			message: 'No such post.', | ||||
| 			code: 'NO_SUCH_POST', | ||||
| 			id: 'ae52f367-4bd7-4ecd-afc6-5672fff427f5' | ||||
| 		}, | ||||
| 	} | ||||
| }; | ||||
|  | ||||
| export default define(meta, async (ps, user) => { | ||||
| 	const post = await GalleryPosts.findOne({ | ||||
| 		id: ps.postId, | ||||
| 		userId: user.id, | ||||
| 	}); | ||||
|  | ||||
| 	if (post == null) { | ||||
| 		throw new ApiError(meta.errors.noSuchPost); | ||||
| 	} | ||||
|  | ||||
| 	await GalleryPosts.delete(post.id); | ||||
| }); | ||||
							
								
								
									
										81
									
								
								src/server/api/endpoints/gallery/posts/update.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										81
									
								
								src/server/api/endpoints/gallery/posts/update.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,81 @@ | ||||
| import $ from 'cafy'; | ||||
| import * as ms from 'ms'; | ||||
| import define from '../../../define'; | ||||
| import { ID } from '../../../../../misc/cafy-id'; | ||||
| import { DriveFiles, GalleryPosts } from '../../../../../models'; | ||||
| import { GalleryPost } from '../../../../../models/entities/gallery-post'; | ||||
| import { ApiError } from '../../../error'; | ||||
|  | ||||
| export const meta = { | ||||
| 	tags: ['gallery'], | ||||
|  | ||||
| 	requireCredential: true as const, | ||||
|  | ||||
| 	kind: 'write:gallery', | ||||
|  | ||||
| 	limit: { | ||||
| 		duration: ms('1hour'), | ||||
| 		max: 300 | ||||
| 	}, | ||||
|  | ||||
| 	params: { | ||||
| 		postId: { | ||||
| 			validator: $.type(ID), | ||||
| 		}, | ||||
|  | ||||
| 		title: { | ||||
| 			validator: $.str.min(1), | ||||
| 		}, | ||||
|  | ||||
| 		description: { | ||||
| 			validator: $.optional.nullable.str, | ||||
| 		}, | ||||
|  | ||||
| 		fileIds: { | ||||
| 			validator: $.arr($.type(ID)).unique().range(1, 32), | ||||
| 		}, | ||||
|  | ||||
| 		isSensitive: { | ||||
| 			validator: $.optional.bool, | ||||
| 			default: false, | ||||
| 		}, | ||||
| 	}, | ||||
|  | ||||
| 	res: { | ||||
| 		type: 'object' as const, | ||||
| 		optional: false as const, nullable: false as const, | ||||
| 		ref: 'GalleryPost', | ||||
| 	}, | ||||
|  | ||||
| 	errors: { | ||||
|  | ||||
| 	} | ||||
| }; | ||||
|  | ||||
| export default define(meta, async (ps, user) => { | ||||
| 	const files = (await Promise.all(ps.fileIds.map(fileId => | ||||
| 		DriveFiles.findOne({ | ||||
| 			id: fileId, | ||||
| 			userId: user.id | ||||
| 		}) | ||||
| 	))).filter(file => file != null); | ||||
|  | ||||
| 	if (files.length === 0) { | ||||
| 		throw new Error(); | ||||
| 	} | ||||
|  | ||||
| 	await GalleryPosts.update({ | ||||
| 		id: ps.postId, | ||||
| 		userId: user.id, | ||||
| 	}, { | ||||
| 		updatedAt: new Date(), | ||||
| 		title: ps.title, | ||||
| 		description: ps.description, | ||||
| 		isSensitive: ps.isSensitive, | ||||
| 		fileIds: files.map(file => file.id) | ||||
| 	}); | ||||
|  | ||||
| 	const post = await GalleryPosts.findOneOrFail(ps.postId); | ||||
|  | ||||
| 	return await GalleryPosts.pack(post, user); | ||||
| }); | ||||
| @@ -252,7 +252,7 @@ router.get('/users/:user', async ctx => { | ||||
| }); | ||||
|  | ||||
| // Note | ||||
| router.get('/notes/:note', async ctx => { | ||||
| router.get('/notes/:note', async (ctx, next) => { | ||||
| 	const note = await Notes.findOne(ctx.params.note); | ||||
|  | ||||
| 	if (note) { | ||||
| @@ -277,11 +277,11 @@ router.get('/notes/:note', async ctx => { | ||||
| 		return; | ||||
| 	} | ||||
|  | ||||
| 	ctx.status = 404; | ||||
| 	await next(); | ||||
| }); | ||||
|  | ||||
| // Page | ||||
| router.get('/@:user/pages/:page', async ctx => { | ||||
| router.get('/@:user/pages/:page', async (ctx, next) => { | ||||
| 	const { username, host } = parseAcct(ctx.params.user); | ||||
| 	const user = await Users.findOne({ | ||||
| 		usernameLower: username.toLowerCase(), | ||||
| @@ -314,12 +314,12 @@ router.get('/@:user/pages/:page', async ctx => { | ||||
| 		return; | ||||
| 	} | ||||
|  | ||||
| 	ctx.status = 404; | ||||
| 	await next(); | ||||
| }); | ||||
|  | ||||
| // Clip | ||||
| // TODO: 非publicなclipのハンドリング | ||||
| router.get('/clips/:clip', async ctx => { | ||||
| router.get('/clips/:clip', async (ctx, next) => { | ||||
| 	const clip = await Clips.findOne({ | ||||
| 		id: ctx.params.clip, | ||||
| 	}); | ||||
| @@ -339,11 +339,11 @@ router.get('/clips/:clip', async ctx => { | ||||
| 		return; | ||||
| 	} | ||||
|  | ||||
| 	ctx.status = 404; | ||||
| 	await next(); | ||||
| }); | ||||
|  | ||||
| // Gallery post | ||||
| router.get('/gallery/:post', async ctx => { | ||||
| router.get('/gallery/:post', async (ctx, next) => { | ||||
| 	const post = await GalleryPosts.findOne(ctx.params.post); | ||||
|  | ||||
| 	if (post) { | ||||
| @@ -362,11 +362,11 @@ router.get('/gallery/:post', async ctx => { | ||||
| 		return; | ||||
| 	} | ||||
|  | ||||
| 	ctx.status = 404; | ||||
| 	await next(); | ||||
| }); | ||||
|  | ||||
| // Channel | ||||
| router.get('/channels/:channel', async ctx => { | ||||
| router.get('/channels/:channel', async (ctx, next) => { | ||||
| 	const channel = await Channels.findOne({ | ||||
| 		id: ctx.params.channel, | ||||
| 	}); | ||||
| @@ -384,7 +384,7 @@ router.get('/channels/:channel', async ctx => { | ||||
| 		return; | ||||
| 	} | ||||
|  | ||||
| 	ctx.status = 404; | ||||
| 	await next(); | ||||
| }); | ||||
| //#endregion | ||||
|  | ||||
|   | ||||
							
								
								
									
										306
									
								
								yarn.lock
									
									
									
									
									
								
							
							
						
						
									
										306
									
								
								yarn.lock
									
									
									
									
									
								
							| @@ -432,10 +432,10 @@ | ||||
|     "@types/connect" "*" | ||||
|     "@types/node" "*" | ||||
|  | ||||
| "@types/bull@3.15.0": | ||||
|   version "3.15.0" | ||||
|   resolved "https://registry.yarnpkg.com/@types/bull/-/bull-3.15.0.tgz#69c518d4e7a53056f287cebcc4ef4ffe91aaf201" | ||||
|   integrity sha512-54Y1RYkJt6i+4dH45w4gZOP6fyhksTvOImfgBYAxgq/nt5ZrES4xFWwOzt2bxAgSR7FMH9fwvaiJN/pripPzag== | ||||
| "@types/bull@3.15.1": | ||||
|   version "3.15.1" | ||||
|   resolved "https://registry.yarnpkg.com/@types/bull/-/bull-3.15.1.tgz#3c3fd665b43ef383ca95a91b8d1448461fae0898" | ||||
|   integrity sha512-thZyjxikoyuDa/ptZEqtTEPUjwlDenkpPigpIyad1X5UMp7U0fXTLiDHJjZ/5yXmVPuWx0cXFXj3drmva/UJRA== | ||||
|   dependencies: | ||||
|     "@types/ioredis" "*" | ||||
|  | ||||
| @@ -456,10 +456,10 @@ | ||||
|   dependencies: | ||||
|     "@types/node" "*" | ||||
|  | ||||
| "@types/chai@4.2.15": | ||||
|   version "4.2.15" | ||||
|   resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.2.15.tgz#b7a6d263c2cecf44b6de9a051cf496249b154553" | ||||
|   integrity sha512-rYff6FI+ZTKAPkJUoyz7Udq3GaoDZnxYDEvdEdFZASiA7PoErltHezDishqQiSDWrGxvxmplH304jyzQmjp0AQ== | ||||
| "@types/chai@4.2.16": | ||||
|   version "4.2.16" | ||||
|   resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.2.16.tgz#f09cc36e18d28274f942e7201147cce34d97e8c8" | ||||
|   integrity sha512-vI5iOAsez9+roLS3M3+Xx7w+WRuDtSmF8bQkrbcIJ2sC1PcDgVoA0WGpa+bIrJ+y8zqY2oi//fUctkxtIcXJCw== | ||||
|  | ||||
| "@types/cheerio@^0.22.10": | ||||
|   version "0.22.18" | ||||
| @@ -531,6 +531,11 @@ | ||||
|   resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.46.tgz#0fb6bfbbeabd7a30880504993369c4bf1deab1fe" | ||||
|   integrity sha512-laIjwTQaD+5DukBZaygQ79K1Z0jb1bPEMRrkXSLjtCcZm+abyp5YbrqpSLzD42FwWW6gK/aS4NYpJ804nG2brg== | ||||
|  | ||||
| "@types/estree@^0.0.47": | ||||
|   version "0.0.47" | ||||
|   resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.47.tgz#d7a51db20f0650efec24cd04994f523d93172ed4" | ||||
|   integrity sha512-c5ciR06jK8u9BstrmJyO97m+klJrrhCf9u3rLu3DEAJBirxRqSCvDQoYKmxuYwQI5SZChAWu+tq9oVlGRuzPAg== | ||||
|  | ||||
| "@types/events@*": | ||||
|   version "3.0.0" | ||||
|   resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" | ||||
| @@ -564,10 +569,10 @@ | ||||
|   resolved "https://registry.yarnpkg.com/@types/fancy-log/-/fancy-log-1.3.0.tgz#a61ab476e5e628cd07a846330df53b85e05c8ce0" | ||||
|   integrity sha512-mQjDxyOM1Cpocd+vm1kZBP7smwKZ4TNokFeds9LV7OZibmPJFEzY3+xZMrKfUdNT71lv8GoCPD6upKwHxubClw== | ||||
|  | ||||
| "@types/fluent-ffmpeg@2.1.16": | ||||
|   version "2.1.16" | ||||
|   resolved "https://registry.yarnpkg.com/@types/fluent-ffmpeg/-/fluent-ffmpeg-2.1.16.tgz#63949b0cb6bc88c9157a579cdd80858a269f3a3a" | ||||
|   integrity sha512-1FTstm6xY/2WsJVt6ARV7CiJjNCQDlR/nfw6xuYk5ITbVjk7sw89Biyqm2DGW4c3aZ3vBx+5irZvsql4eybpoQ== | ||||
| "@types/fluent-ffmpeg@2.1.17": | ||||
|   version "2.1.17" | ||||
|   resolved "https://registry.yarnpkg.com/@types/fluent-ffmpeg/-/fluent-ffmpeg-2.1.17.tgz#6958dda400fe1b33c21f3683db76905cb210d053" | ||||
|   integrity sha512-/bdvjKw/mtBHlJ2370d04nt4CsWqU5MrwS/NtO96V01jxitJ4+iq8OFNcqc5CegeV3TQOK3uueK02kvRK+zjUg== | ||||
|   dependencies: | ||||
|     "@types/node" "*" | ||||
|  | ||||
| @@ -604,13 +609,6 @@ | ||||
|     "@types/node" "*" | ||||
|     "@types/vinyl" "*" | ||||
|  | ||||
| "@types/gulp-replace@0.0.31": | ||||
|   version "0.0.31" | ||||
|   resolved "https://registry.yarnpkg.com/@types/gulp-replace/-/gulp-replace-0.0.31.tgz#87c3ac90b437694c58d68d1da677fcaff38b25ff" | ||||
|   integrity sha512-dbgQ1u0N9ShXrzahBgQfMSu6qUh8nlTLt7whhQ0S0sEUHhV3scysppJ1UX0fl53PJENgAL99ueykddyrCaDt7g== | ||||
|   dependencies: | ||||
|     "@types/node" "*" | ||||
|  | ||||
| "@types/gulp@4.0.8": | ||||
|   version "4.0.8" | ||||
|   resolved "https://registry.yarnpkg.com/@types/gulp/-/gulp-4.0.8.tgz#a5e43764d400b9818dc79b5ffa86e22a94521037" | ||||
| @@ -652,10 +650,10 @@ | ||||
|   resolved "https://registry.yarnpkg.com/@types/is-url/-/is-url-1.2.28.tgz#914dabd50546d9b0142806e42c72bc7c2b7e0787" | ||||
|   integrity sha1-kU2r1QVG2bAUKAbkLHK8fCt+B4c= | ||||
|  | ||||
| "@types/js-yaml@4.0.0": | ||||
|   version "4.0.0" | ||||
|   resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-4.0.0.tgz#d1a11688112091f2c711674df3a65ea2f47b5dfb" | ||||
|   integrity sha512-4vlpCM5KPCL5CfGmTbpjwVKbISRYhduEJvvUWsH5EB7QInhEj94XPZ3ts/9FPiLZFqYO0xoW4ZL8z2AabTGgJA== | ||||
| "@types/js-yaml@4.0.1": | ||||
|   version "4.0.1" | ||||
|   resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-4.0.1.tgz#5544730b65a480b18ace6b6ce914e519cec2d43b" | ||||
|   integrity sha512-xdOvNmXmrZqqPy3kuCQ+fz6wA0xU5pji9cd1nDrflWaAWtYLLGk5ykW0H6yg5TVyehHP1pfmuuSaZkhP+kspVA== | ||||
|  | ||||
| "@types/jsdom@16.2.10": | ||||
|   version "16.2.10" | ||||
| @@ -1601,10 +1599,10 @@ anymatch@~3.1.1: | ||||
|     normalize-path "^3.0.0" | ||||
|     picomatch "^2.0.4" | ||||
|  | ||||
| apexcharts@3.26.0: | ||||
|   version "3.26.0" | ||||
|   resolved "https://registry.yarnpkg.com/apexcharts/-/apexcharts-3.26.0.tgz#a78abc108b2e1b3086a738f0ec7c98e292f4a14b" | ||||
|   integrity sha512-zdYHs3k3tgmCn1BpYLj7rhGEndBYF33Pq1+g0ora37xAr+3act5CJrpdXM2jx2boVUyXgavoSp6sa8WpK7RkSA== | ||||
| apexcharts@3.26.1: | ||||
|   version "3.26.1" | ||||
|   resolved "https://registry.yarnpkg.com/apexcharts/-/apexcharts-3.26.1.tgz#2094ec0cfd00ed8129d93e73e75018716d55ef5b" | ||||
|   integrity sha512-Z/pfGTsL4YUm1tHd6a0d0G2hX4XUmhEI0b/5BxVK69dEB/XXvVMX9hKCkcIx+kPyVqVFCuo91ZjCdqjMcmSVBA== | ||||
|   dependencies: | ||||
|     svg.draggable.js "^2.2.2" | ||||
|     svg.easing.js "^2.0.0" | ||||
| @@ -1865,10 +1863,10 @@ autwh@0.1.0: | ||||
|   dependencies: | ||||
|     oauth "0.9.15" | ||||
|  | ||||
| aws-sdk@2.887.0: | ||||
|   version "2.887.0" | ||||
|   resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.887.0.tgz#53839921124b024d24005dbb83b372efdf2fe9b6" | ||||
|   integrity sha512-jFRVrdyvBEYmSSrriA92dXDn1VgCXnz6Rax6wRGQDhyCWH+9NzZ7ZvIag2Yy2SLpvoRU7IaiEmiBLbNe/BksgA== | ||||
| aws-sdk@2.892.0: | ||||
|   version "2.892.0" | ||||
|   resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.892.0.tgz#adec48f52f4b6f5c576dcbfac020bcec1eed3a25" | ||||
|   integrity sha512-OOXJ15AnJJMHZYXJQVy22Wjnp5GrZCfvCxmoZuXdsLNs8M+BL4mfBqma82+UkM2NhJgLYuAhDfvFUBob6VGIWw== | ||||
|   dependencies: | ||||
|     buffer "4.9.2" | ||||
|     events "1.1.1" | ||||
| @@ -2001,10 +1999,10 @@ binary-extensions@^2.0.0: | ||||
|   resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.0.0.tgz#23c0df14f6a88077f5f986c0d167ec03c3d5537c" | ||||
|   integrity sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow== | ||||
|  | ||||
| binaryextensions@2: | ||||
|   version "2.2.0" | ||||
|   resolved "https://registry.yarnpkg.com/binaryextensions/-/binaryextensions-2.2.0.tgz#e7c6ba82d4f5f5758c26078fe8eea28881233311" | ||||
|   integrity sha512-bHhs98rj/7i/RZpCSJ3uk55pLXOItjIrh2sRQZSM6OoktScX+LxJzvlU+FELp9j3TdcddTmmYArLSGptCTwjuw== | ||||
| binaryextensions@^2.2.0: | ||||
|   version "2.3.0" | ||||
|   resolved "https://registry.yarnpkg.com/binaryextensions/-/binaryextensions-2.3.0.tgz#1d269cbf7e6243ea886aa41453c3651ccbe13c22" | ||||
|   integrity sha512-nAihlQsYGyc5Bwq6+EsubvANYGExeJKHDO3RjnvwU042fawQTQfM3Kxn7IHUXQOz4bzfwsGYYHGSvXyW4zOGLg== | ||||
|  | ||||
| bl@^4.0.1, bl@^4.0.3: | ||||
|   version "4.0.3" | ||||
| @@ -2194,10 +2192,10 @@ builtin-modules@^1.1.1: | ||||
|   resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" | ||||
|   integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8= | ||||
|  | ||||
| bull@3.22.0: | ||||
|   version "3.22.0" | ||||
|   resolved "https://registry.yarnpkg.com/bull/-/bull-3.22.0.tgz#fb04b68189bd49e56155f4366df96330c059868c" | ||||
|   integrity sha512-csQTIuvoKnVuW6gbZmIe9mVkLy2DzvRodywjXN7cfYlvXKme3156FIc1Zssn5IRKpDKyyq0++AYsLO4mdtnf0Q== | ||||
| bull@3.22.3: | ||||
|   version "3.22.3" | ||||
|   resolved "https://registry.yarnpkg.com/bull/-/bull-3.22.3.tgz#14232e15431fddd5e572cdc87f3acbdd655371ef" | ||||
|   integrity sha512-nkSMtXkCGqjbH8ArFZWKbq3hQb/d5fW7N2m6C0iLeQKngB7pdObH+Lo9hK36v7f3ZENmiIScmKRN15wbyEJ5Pw== | ||||
|   dependencies: | ||||
|     cron-parser "^2.13.0" | ||||
|     debuglog "^1.0.0" | ||||
| @@ -2375,10 +2373,10 @@ chalk@4.0.0: | ||||
|     ansi-styles "^4.1.0" | ||||
|     supports-color "^7.1.0" | ||||
|  | ||||
| chalk@4.1.0, chalk@^4.0.0, chalk@^4.1.0: | ||||
|   version "4.1.0" | ||||
|   resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" | ||||
|   integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== | ||||
| chalk@4.1.1: | ||||
|   version "4.1.1" | ||||
|   resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.1.tgz#c80b3fab28bf6371e6863325eee67e618b77e6ad" | ||||
|   integrity sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg== | ||||
|   dependencies: | ||||
|     ansi-styles "^4.1.0" | ||||
|     supports-color "^7.1.0" | ||||
| @@ -2403,6 +2401,14 @@ chalk@^2.0.0, chalk@^2.3.0, chalk@^2.4.1, chalk@^2.4.2: | ||||
|     escape-string-regexp "^1.0.5" | ||||
|     supports-color "^5.3.0" | ||||
|  | ||||
| chalk@^4.0.0, chalk@^4.1.0: | ||||
|   version "4.1.0" | ||||
|   resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" | ||||
|   integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== | ||||
|   dependencies: | ||||
|     ansi-styles "^4.1.0" | ||||
|     supports-color "^7.1.0" | ||||
|  | ||||
| char-regex@^1.0.2: | ||||
|   version "1.0.2" | ||||
|   resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" | ||||
| @@ -2489,7 +2495,7 @@ cheerio@^0.22.0: | ||||
|     lodash.reject "^4.4.0" | ||||
|     lodash.some "^4.4.0" | ||||
|  | ||||
| chokidar@3.5.1, "chokidar@>=2.0.0 <4.0.0", chokidar@^2.0.0, chokidar@^3.3.1, chokidar@^3.5.0: | ||||
| chokidar@3.5.1, "chokidar@>=3.0.0 <4.0.0", chokidar@^2.0.0, chokidar@^3.3.1, chokidar@^3.5.0: | ||||
|   version "3.3.1" | ||||
|   resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.1.tgz#c84e5b3d18d9a4d77558fef466b1bf16bbeb3450" | ||||
|   integrity sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg== | ||||
| @@ -2984,10 +2990,10 @@ core-js-compat@^3.9.1: | ||||
|     browserslist "^4.16.3" | ||||
|     semver "7.0.0" | ||||
|  | ||||
| core-js@3.10.1: | ||||
|   version "3.10.1" | ||||
|   resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.10.1.tgz#e683963978b6806dcc6c0a4a8bd4ab0bdaf3f21a" | ||||
|   integrity sha512-pwCxEXnj27XG47mu7SXAwhLP3L5CrlvCB91ANUkIz40P27kUcvNfSdvyZJ9CLHiVoKSp+TTChMQMSKQEH/IQxA== | ||||
| core-js@3.11.0: | ||||
|   version "3.11.0" | ||||
|   resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.11.0.tgz#05dac6aa70c0a4ad842261f8957b961d36eb8926" | ||||
|   integrity sha512-bd79DPpx+1Ilh9+30aT5O1sgpQd4Ttg8oqkqi51ZzhedMM1omD2e6IOF48Z/DzDCZ2svp49tN/3vneTK6ZBkXw== | ||||
|  | ||||
| core-util-is@1.0.2, core-util-is@^1.0.2, core-util-is@~1.0.0: | ||||
|   version "1.0.2" | ||||
| @@ -3070,23 +3076,22 @@ css-declaration-sorter@6.0.0: | ||||
|   dependencies: | ||||
|     timsort "^0.3.0" | ||||
|  | ||||
| css-loader@5.2.1: | ||||
|   version "5.2.1" | ||||
|   resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-5.2.1.tgz#15fbd5b6ac4c1b170a098f804c5abd0722f2aa73" | ||||
|   integrity sha512-YCyRzlt/jgG1xanXZDG/DHqAueOtXFHeusP9TS478oP1J++JSKOyEgGW1GHVoCj/rkS+GWOlBwqQJBr9yajQ9w== | ||||
| css-loader@5.2.4: | ||||
|   version "5.2.4" | ||||
|   resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-5.2.4.tgz#e985dcbce339812cb6104ef3670f08f9893a1536" | ||||
|   integrity sha512-OFYGyINCKkdQsTrSYxzGSFnGS4gNjcXkKkQgWxK138jgnPt+lepxdjSZNc8sHAl5vP3DhsJUxufWIjOwI8PMMw== | ||||
|   dependencies: | ||||
|     camelcase "^6.2.0" | ||||
|     cssesc "^3.0.0" | ||||
|     icss-utils "^5.1.0" | ||||
|     loader-utils "^2.0.0" | ||||
|     postcss "^8.2.8" | ||||
|     postcss "^8.2.10" | ||||
|     postcss-modules-extract-imports "^3.0.0" | ||||
|     postcss-modules-local-by-default "^4.0.0" | ||||
|     postcss-modules-scope "^3.0.0" | ||||
|     postcss-modules-values "^4.0.0" | ||||
|     postcss-value-parser "^4.1.0" | ||||
|     schema-utils "^3.0.0" | ||||
|     semver "^7.3.4" | ||||
|     semver "^7.3.5" | ||||
|  | ||||
| css-select-base-adapter@^0.1.1: | ||||
|   version "0.1.1" | ||||
| @@ -3714,11 +3719,6 @@ ecdsa-sig-formatter@1.0.11: | ||||
|   dependencies: | ||||
|     safe-buffer "^5.0.1" | ||||
|  | ||||
| editions@^1.3.3: | ||||
|   version "1.3.4" | ||||
|   resolved "https://registry.yarnpkg.com/editions/-/editions-1.3.4.tgz#3662cb592347c3168eb8e498a0ff73271d67f50b" | ||||
|   integrity sha512-gzao+mxnYDzIysXKMQi/+M1mjy/rjestjg6OPoYTtI+3Izp23oiGZitsl9lPDPiTGXbcSIk1iJWhliSaglxnUg== | ||||
|  | ||||
| editorconfig@^0.15.3: | ||||
|   version "0.15.3" | ||||
|   resolved "https://registry.yarnpkg.com/editorconfig/-/editorconfig-0.15.3.tgz#bef84c4e75fb8dcb0ce5cee8efd51c15999befc5" | ||||
| @@ -3776,14 +3776,13 @@ end-of-stream@^1.0.0, end-of-stream@^1.1.0, end-of-stream@^1.4.1: | ||||
|   dependencies: | ||||
|     once "^1.4.0" | ||||
|  | ||||
| enhanced-resolve@^4.0.0: | ||||
|   version "4.1.1" | ||||
|   resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz#2937e2b8066cd0fe7ce0990a98f0d71a35189f66" | ||||
|   integrity sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA== | ||||
| enhanced-resolve@^5.0.0, enhanced-resolve@^5.8.0: | ||||
|   version "5.8.0" | ||||
|   resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.8.0.tgz#d9deae58f9d3773b6a111a5a46831da5be5c9ac0" | ||||
|   integrity sha512-Sl3KRpJA8OpprrtaIswVki3cWPiPKxXuFxJXBp+zNb6s6VwNWwFRUdtmzd2ReUut8n+sCPx7QCtQ7w5wfJhSgQ== | ||||
|   dependencies: | ||||
|     graceful-fs "^4.1.2" | ||||
|     memory-fs "^0.5.0" | ||||
|     tapable "^1.0.0" | ||||
|     graceful-fs "^4.2.4" | ||||
|     tapable "^2.2.0" | ||||
|  | ||||
| enhanced-resolve@^5.7.0: | ||||
|   version "5.7.0" | ||||
| @@ -3825,13 +3824,6 @@ envinfo@^7.7.3: | ||||
|   resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.7.3.tgz#4b2d8622e3e7366afb8091b23ed95569ea0208cc" | ||||
|   integrity sha512-46+j5QxbPWza0PB1i15nZx0xQ4I/EfQxg9J8Had3b408SV63nEtor2e+oiY63amTo9KTuh2a3XLObNwduxYwwA== | ||||
|  | ||||
| errno@^0.1.3: | ||||
|   version "0.1.7" | ||||
|   resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" | ||||
|   integrity sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg== | ||||
|   dependencies: | ||||
|     prr "~1.0.1" | ||||
|  | ||||
| error-ex@^1.2.0, error-ex@^1.3.1: | ||||
|   version "1.3.2" | ||||
|   resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" | ||||
| @@ -3988,10 +3980,10 @@ eslint-visitor-keys@^2.0.0: | ||||
|   resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz#21fdc8fbcd9c795cc0321f0563702095751511a8" | ||||
|   integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ== | ||||
|  | ||||
| eslint@7.24.0: | ||||
|   version "7.24.0" | ||||
|   resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.24.0.tgz#2e44fa62d93892bfdb100521f17345ba54b8513a" | ||||
|   integrity sha512-k9gaHeHiFmGCDQ2rEfvULlSLruz6tgfA8DEn+rY9/oYPFFTlz55mM/Q/Rij1b2Y42jwZiK3lXvNTw6w6TXzcKQ== | ||||
| eslint@7.25.0: | ||||
|   version "7.25.0" | ||||
|   resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.25.0.tgz#1309e4404d94e676e3e831b3a3ad2b050031eb67" | ||||
|   integrity sha512-TVpSovpvCNpLURIScDRB6g5CYu/ZFq9GfX2hLNIV4dSBKxIWojeDODvYl3t0k0VtMxYeR8OXPCFE5+oHMlGfhw== | ||||
|   dependencies: | ||||
|     "@babel/code-frame" "7.12.11" | ||||
|     "@eslint/eslintrc" "^0.4.0" | ||||
| @@ -4840,14 +4832,14 @@ gulp-rename@2.0.0: | ||||
|   resolved "https://registry.yarnpkg.com/gulp-rename/-/gulp-rename-2.0.0.tgz#9bbc3962b0c0f52fc67cd5eaff6c223ec5b9cf6c" | ||||
|   integrity sha512-97Vba4KBzbYmR5VBs9mWmK+HwIf5mj+/zioxfZhOKeXtx5ZjBk57KFlePf5nxq9QsTtFl0ejnHE3zTC9MHXqyQ== | ||||
|  | ||||
| gulp-replace@1.0.0: | ||||
|   version "1.0.0" | ||||
|   resolved "https://registry.yarnpkg.com/gulp-replace/-/gulp-replace-1.0.0.tgz#b32bd61654d97b8d78430a67b3e8ce067b7c9143" | ||||
|   integrity sha512-lgdmrFSI1SdhNMXZQbrC75MOl1UjYWlOWNbNRnz+F/KHmgxt3l6XstBoAYIdadwETFyG/6i+vWUSCawdC3pqOw== | ||||
| gulp-replace@1.1.1: | ||||
|   version "1.1.1" | ||||
|   resolved "https://registry.yarnpkg.com/gulp-replace/-/gulp-replace-1.1.1.tgz#ecb15cafa6df3cf2735aad5765be491be8b36eeb" | ||||
|   integrity sha512-gzVZ15/q2+6w7PmZy5zUO5V0s+IGrGz1a2RgImt4mo6eChZgHFbHKKEn52uWkDShhSijdeNz05HcxFN7HNSBKA== | ||||
|   dependencies: | ||||
|     istextorbinary "2.2.1" | ||||
|     readable-stream "^2.0.1" | ||||
|     replacestream "^4.0.0" | ||||
|     istextorbinary "^3.0.0" | ||||
|     replacestream "^4.0.3" | ||||
|     yargs-parser ">=5.0.0-security.0" | ||||
|  | ||||
| gulp-terser@2.0.1: | ||||
|   version "2.0.1" | ||||
| @@ -5722,14 +5714,13 @@ isstream@~0.1.2: | ||||
|   resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" | ||||
|   integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= | ||||
|  | ||||
| istextorbinary@2.2.1: | ||||
|   version "2.2.1" | ||||
|   resolved "https://registry.yarnpkg.com/istextorbinary/-/istextorbinary-2.2.1.tgz#a5231a08ef6dd22b268d0895084cf8d58b5bec53" | ||||
|   integrity sha512-TS+hoFl8Z5FAFMK38nhBkdLt44CclNRgDHWeMgsV8ko3nDlr/9UI2Sf839sW7enijf8oKsZYXRvM8g0it9Zmcw== | ||||
| istextorbinary@^3.0.0: | ||||
|   version "3.3.0" | ||||
|   resolved "https://registry.yarnpkg.com/istextorbinary/-/istextorbinary-3.3.0.tgz#06b1c57d948da11461bd237c00ce09e9902964f2" | ||||
|   integrity sha512-Tvq1W6NAcZeJ8op+Hq7tdZ434rqnMx4CCZ7H0ff83uEloDvVbqAwaMTZcafKGJT0VHkYzuXUiCY4hlXQg6WfoQ== | ||||
|   dependencies: | ||||
|     binaryextensions "2" | ||||
|     editions "^1.3.3" | ||||
|     textextensions "2" | ||||
|     binaryextensions "^2.2.0" | ||||
|     textextensions "^3.2.0" | ||||
|  | ||||
| jest-worker@^26.6.2: | ||||
|   version "26.6.2" | ||||
| @@ -5980,10 +5971,10 @@ jws@^4.0.0: | ||||
|     jwa "^2.0.0" | ||||
|     safe-buffer "^5.0.1" | ||||
|  | ||||
| katex@0.13.2: | ||||
|   version "0.13.2" | ||||
|   resolved "https://registry.yarnpkg.com/katex/-/katex-0.13.2.tgz#4075b9144e6af992ec9a4b772fa3754763be5f26" | ||||
|   integrity sha512-u/KhjFDhyPr+70aiBn9SL/9w/QlLagIXBi2NZSbNnBUp2tR8dCjQplyEMkEzniem5gOeSCBjlBUg4VaiWs1JJg== | ||||
| katex@0.13.3: | ||||
|   version "0.13.3" | ||||
|   resolved "https://registry.yarnpkg.com/katex/-/katex-0.13.3.tgz#b7b1f4a8de496ea8bfe60ab0b5e1822864288f00" | ||||
|   integrity sha512-/w0eycuK1xh201T0uFXYOZWPDoeqDHqR+6SLLKsYvNtUCYtmRjq8F+M74sdpzs+dJZYWv2eUsSW0r1AJfhZOCw== | ||||
|   dependencies: | ||||
|     commander "^6.0.0" | ||||
|  | ||||
| @@ -6545,10 +6536,10 @@ markdown-it-anchor@7.1.0: | ||||
|   resolved "https://registry.yarnpkg.com/markdown-it-anchor/-/markdown-it-anchor-7.1.0.tgz#30fb21497bf59e83ff4d1ddc052d821962e2489e" | ||||
|   integrity sha512-loQggrwsIkkP7TOrESvmYkV2ikbQNNKhHcWyqC7/C2CmfHl1tkUizJJU8C5aGgg7J6oXVQJx17gk7i47tNn/lQ== | ||||
|  | ||||
| markdown-it@12.0.5: | ||||
|   version "12.0.5" | ||||
|   resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-12.0.5.tgz#982907947dc1f72f9d651c5286678fd95af13f2e" | ||||
|   integrity sha512-9KB992Yy2TedaoKETgZPL2n3bmqqZxzUsZ4fxe2ho+/AYuQUz+iDKpfjLgKbg/lHcG6cGOj+L3gDrn9S2CxoRg== | ||||
| markdown-it@12.0.6: | ||||
|   version "12.0.6" | ||||
|   resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-12.0.6.tgz#adcc8e5fe020af292ccbdf161fe84f1961516138" | ||||
|   integrity sha512-qv3sVLl4lMT96LLtR7xeRJX11OUFjsaD5oVat2/SNBIb21bJXwal2+SklcRbTwGwqWpWH/HRtYavOoJE+seL8w== | ||||
|   dependencies: | ||||
|     argparse "^2.0.1" | ||||
|     entities "~2.1.0" | ||||
| @@ -6615,14 +6606,6 @@ mem@^4.0.0: | ||||
|     mimic-fn "^2.0.0" | ||||
|     p-is-promise "^2.0.0" | ||||
|  | ||||
| memory-fs@^0.5.0: | ||||
|   version "0.5.0" | ||||
|   resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.5.0.tgz#324c01288b88652966d161db77838720845a8e3c" | ||||
|   integrity sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA== | ||||
|   dependencies: | ||||
|     errno "^0.1.3" | ||||
|     readable-stream "^2.0.1" | ||||
|  | ||||
| merge-source-map@^1.1.0: | ||||
|   version "1.1.0" | ||||
|   resolved "https://registry.yarnpkg.com/merge-source-map/-/merge-source-map-1.1.0.tgz#2fdde7e6020939f70906a68f2d7ae685e4c8c646" | ||||
| @@ -8284,10 +8267,10 @@ postcss-zindex@^2.0.1: | ||||
|     postcss "^5.0.4" | ||||
|     uniqs "^2.0.0" | ||||
|  | ||||
| postcss@8.2.10: | ||||
|   version "8.2.10" | ||||
|   resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.2.10.tgz#ca7a042aa8aff494b334d0ff3e9e77079f6f702b" | ||||
|   integrity sha512-b/h7CPV7QEdrqIxtAf2j31U5ef05uBDuvoXv6L51Q4rcS1jdlXAVKJv+atCFdUXYl9dyTHGyoMzIepwowRJjFw== | ||||
| postcss@8.2.12, postcss@^8.2.10: | ||||
|   version "8.2.12" | ||||
|   resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.2.12.tgz#81248a1a87e0f575cc594a99a08207fd1c4addc4" | ||||
|   integrity sha512-BJnGT5+0q2tzvs6oQfnY2NpEJ7rIXNfBnZtQOKCIsweeWXBXeDd5k31UgTdS3d/c02ouspufn37mTaHWkJyzMQ== | ||||
|   dependencies: | ||||
|     colorette "^1.2.2" | ||||
|     nanoid "^3.1.22" | ||||
| @@ -8303,7 +8286,7 @@ postcss@^5.0.10, postcss@^5.0.11, postcss@^5.0.12, postcss@^5.0.13, postcss@^5.0 | ||||
|     source-map "^0.5.6" | ||||
|     supports-color "^3.2.3" | ||||
|  | ||||
| postcss@^8.1.10, postcss@^8.2.8: | ||||
| postcss@^8.1.10: | ||||
|   version "8.2.8" | ||||
|   resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.2.8.tgz#0b90f9382efda424c4f0f69a2ead6f6830d08ece" | ||||
|   integrity sha512-1F0Xb2T21xET7oQV9eKuctbM9S7BC0fetoHCc4H13z0PT6haiRLP4T0ZY4XWh7iLP0usgqykT6p9B2RtOf4FPw== | ||||
| @@ -8453,11 +8436,6 @@ proto-list@~1.2.1: | ||||
|   resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" | ||||
|   integrity sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk= | ||||
|  | ||||
| prr@~1.0.1: | ||||
|   version "1.0.1" | ||||
|   resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" | ||||
|   integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= | ||||
|  | ||||
| pseudomap@^1.0.2: | ||||
|   version "1.0.2" | ||||
|   resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" | ||||
| @@ -8847,10 +8825,10 @@ redis-parser@^3.0.0: | ||||
|   dependencies: | ||||
|     redis-errors "^1.0.0" | ||||
|  | ||||
| redis@3.1.1: | ||||
|   version "3.1.1" | ||||
|   resolved "https://registry.yarnpkg.com/redis/-/redis-3.1.1.tgz#a44bee7c072dcf685e139048d6a1a4d3b00f5d01" | ||||
|   integrity sha512-QhkKhOuzhogR1NDJfBD34TQJz2ZJwDhhIC6ZmvpftlmfYShHHQXjjNspAJ+Z2HH5NwSBVYBVganbiZ8bgFMHjg== | ||||
| redis@3.1.2: | ||||
|   version "3.1.2" | ||||
|   resolved "https://registry.yarnpkg.com/redis/-/redis-3.1.2.tgz#766851117e80653d23e0ed536254677ab647638c" | ||||
|   integrity sha512-grn5KoZLr/qrRQVwoSkmzdbw6pwF+/rwODtrOr6vuBRiR/f3rjSTGupbF90Zpqm2oenix8Do6RV7pYEkGwlKkw== | ||||
|   dependencies: | ||||
|     denque "^1.5.0" | ||||
|     redis-commands "^1.7.0" | ||||
| @@ -8954,7 +8932,7 @@ replace-homedir@^1.0.0: | ||||
|     is-absolute "^1.0.0" | ||||
|     remove-trailing-separator "^1.1.0" | ||||
|  | ||||
| replacestream@^4.0.0: | ||||
| replacestream@^4.0.3: | ||||
|   version "4.0.3" | ||||
|   resolved "https://registry.yarnpkg.com/replacestream/-/replacestream-4.0.3.tgz#3ee5798092be364b1cdb1484308492cb3dff2f36" | ||||
|   integrity sha512-AC0FiLS352pBBiZhd4VXB1Ab/lh0lEgpP+GGvZqbQh8a5cmXVoTe5EX/YeTFArnp4SRGTHh1qCHu9lGs1qG8sA== | ||||
| @@ -9257,12 +9235,12 @@ sass-loader@11.0.1: | ||||
|     klona "^2.0.4" | ||||
|     neo-async "^2.6.2" | ||||
|  | ||||
| sass@1.32.8: | ||||
|   version "1.32.8" | ||||
|   resolved "https://registry.yarnpkg.com/sass/-/sass-1.32.8.tgz#f16a9abd8dc530add8834e506878a2808c037bdc" | ||||
|   integrity sha512-Sl6mIeGpzjIUZqvKnKETfMf0iDAswD9TNlv13A7aAF3XZlRPMq4VvJWBC2N2DXbp94MQVdNSFG6LfF/iOXrPHQ== | ||||
| sass@1.32.11: | ||||
|   version "1.32.11" | ||||
|   resolved "https://registry.yarnpkg.com/sass/-/sass-1.32.11.tgz#b236b3ea55c76602c2ef2bd0445f0db581baa218" | ||||
|   integrity sha512-O9tRcob/fegUVSIV1ihLLZcftIOh0AF1VpKgusUfLqnb2jQ0GLDwI5ivv1FYWivGv8eZ/AwntTyTzjcHu0c/qw== | ||||
|   dependencies: | ||||
|     chokidar ">=2.0.0 <4.0.0" | ||||
|     chokidar ">=3.0.0 <4.0.0" | ||||
|  | ||||
| sax@1.2.1: | ||||
|   version "1.2.1" | ||||
| @@ -10095,7 +10073,7 @@ table@^6.0.4: | ||||
|     slice-ansi "^4.0.0" | ||||
|     string-width "^4.2.0" | ||||
|  | ||||
| tapable@^1.0.0, tapable@^1.0.0-beta.5: | ||||
| tapable@^1.0.0-beta.5: | ||||
|   version "1.1.3" | ||||
|   resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" | ||||
|   integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== | ||||
| @@ -10199,10 +10177,10 @@ textarea-caret@3.1.0: | ||||
|   resolved "https://registry.yarnpkg.com/textarea-caret/-/textarea-caret-3.1.0.tgz#5d5a35bb035fd06b2ff0e25d5359e97f2655087f" | ||||
|   integrity sha512-cXAvzO9pP5CGa6NKx0WYHl+8CHKZs8byMkt3PCJBCmq2a34YA9pO1NrQET5pzeqnBjBdToF5No4rrmkDUgQC2Q== | ||||
|  | ||||
| textextensions@2: | ||||
|   version "2.6.0" | ||||
|   resolved "https://registry.yarnpkg.com/textextensions/-/textextensions-2.6.0.tgz#d7e4ab13fe54e32e08873be40d51b74229b00fc4" | ||||
|   integrity sha512-49WtAWS+tcsy93dRt6P0P3AMD2m5PvXRhuEA0kaXos5ZLlujtYmpmFsB+QvWUSxE1ZsstmYXfQ7L40+EcQgpAQ== | ||||
| textextensions@^3.2.0: | ||||
|   version "3.3.0" | ||||
|   resolved "https://registry.yarnpkg.com/textextensions/-/textextensions-3.3.0.tgz#03530d5287b86773c08b77458589148870cc71d3" | ||||
|   integrity sha512-mk82dS8eRABNbeVJrEiN5/UMSCliINAuz8mkUwH4SwslkNP//gbEzlWNS5au0z5Dpx40SQxzqZevZkn+WYJ9Dw== | ||||
|  | ||||
| thenify-all@^1.0.0: | ||||
|   version "1.6.0" | ||||
| @@ -10404,14 +10382,13 @@ tree-kill@^1.2.2: | ||||
|   resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" | ||||
|   integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== | ||||
|  | ||||
| ts-loader@8.1.0: | ||||
|   version "8.1.0" | ||||
|   resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-8.1.0.tgz#d6292487df279c7cc79b6d3b70bb9d31682b693e" | ||||
|   integrity sha512-YiQipGGAFj2zBfqLhp28yUvPP9jUGqHxRzrGYuc82Z2wM27YIHbElXiaZDc93c3x0mz4zvBmS6q/DgExpdj37A== | ||||
| ts-loader@9.1.1: | ||||
|   version "9.1.1" | ||||
|   resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-9.1.1.tgz#83f598c37e648f3b6b2350bfac6f58f9253d078c" | ||||
|   integrity sha512-u91MdIE4rtN/06Q881uUzVeMoYy+CdFXoanCQXVGRubKKxgLjqQ/H9nkDbp6klkiPv3t18KLjZbEofkJodM3ow== | ||||
|   dependencies: | ||||
|     chalk "^4.1.0" | ||||
|     enhanced-resolve "^4.0.0" | ||||
|     loader-utils "^2.0.0" | ||||
|     enhanced-resolve "^5.0.0" | ||||
|     micromatch "^4.0.0" | ||||
|     semver "^7.3.4" | ||||
|  | ||||
| @@ -10427,10 +10404,10 @@ ts-node@9.1.1: | ||||
|     source-map-support "^0.5.17" | ||||
|     yn "3.1.1" | ||||
|  | ||||
| tsc-alias@1.2.9: | ||||
|   version "1.2.9" | ||||
|   resolved "https://registry.yarnpkg.com/tsc-alias/-/tsc-alias-1.2.9.tgz#9fbf38e5eb1bd89c7f4fc26ef0712e22a6ef8939" | ||||
|   integrity sha512-/ec9t/EIhW7h1oQ/mbezNlHsYipDsJY6IUi2SNRvzvnu8Iamp4nSUDUIdpx9jaoq2QZPKm63Je6bQZBGqWS4jA== | ||||
| tsc-alias@1.2.10: | ||||
|   version "1.2.10" | ||||
|   resolved "https://registry.yarnpkg.com/tsc-alias/-/tsc-alias-1.2.10.tgz#edcc018ab94104e795999a9960bb94e7c9a3ca23" | ||||
|   integrity sha512-6koWkGL9A/01qC65vVecgN3vZwCvWqx1GPoksgvQkNp+GAbT1z5tuFx+pvtmkYjR07WcNP1rGln/+RRvlIrNRQ== | ||||
|   dependencies: | ||||
|     "@jfonx/console-utils" "^1.0.3" | ||||
|     "@jfonx/file-utils" "^3.0.1" | ||||
| @@ -11093,7 +11070,36 @@ webpack-sources@^2.1.1: | ||||
|     source-list-map "^2.0.1" | ||||
|     source-map "^0.6.1" | ||||
|  | ||||
| webpack@5.33.2, webpack@^5: | ||||
| webpack@5.35.1: | ||||
|   version "5.35.1" | ||||
|   resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.35.1.tgz#857670799465c8a5cbb94c4c175d60ac42d18ba3" | ||||
|   integrity sha512-uWKYStqJ23+N6/EnMEwUjPSSKUG1tFmcuKhALEh/QXoUxwN8eb3ATNIZB38A+fO6QZ0xfc7Cu7KNV9LXNhDCsw== | ||||
|   dependencies: | ||||
|     "@types/eslint-scope" "^3.7.0" | ||||
|     "@types/estree" "^0.0.47" | ||||
|     "@webassemblyjs/ast" "1.11.0" | ||||
|     "@webassemblyjs/wasm-edit" "1.11.0" | ||||
|     "@webassemblyjs/wasm-parser" "1.11.0" | ||||
|     acorn "^8.0.4" | ||||
|     browserslist "^4.14.5" | ||||
|     chrome-trace-event "^1.0.2" | ||||
|     enhanced-resolve "^5.8.0" | ||||
|     es-module-lexer "^0.4.0" | ||||
|     eslint-scope "^5.1.1" | ||||
|     events "^3.2.0" | ||||
|     glob-to-regexp "^0.4.1" | ||||
|     graceful-fs "^4.2.4" | ||||
|     json-parse-better-errors "^1.0.2" | ||||
|     loader-runner "^4.2.0" | ||||
|     mime-types "^2.1.27" | ||||
|     neo-async "^2.6.2" | ||||
|     schema-utils "^3.0.0" | ||||
|     tapable "^2.1.1" | ||||
|     terser-webpack-plugin "^5.1.1" | ||||
|     watchpack "^2.0.0" | ||||
|     webpack-sources "^2.1.1" | ||||
|  | ||||
| webpack@^5: | ||||
|   version "5.33.2" | ||||
|   resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.33.2.tgz#c049717c9b038febf5a72fd2f53319ad59a8c1fc" | ||||
|   integrity sha512-X4b7F1sYBmJx8mlh2B7mV5szEkE0jYNJ2y3akgAP0ERi0vLCG1VvdsIxt8lFd4st6SUy0lf7W0CCQS566MBpJg== | ||||
| @@ -11277,7 +11283,12 @@ write-json-file@^2.3.0: | ||||
|     sort-keys "^2.0.0" | ||||
|     write-file-atomic "^2.0.0" | ||||
|  | ||||
| ws@7.4.4, ws@^7.4.4: | ||||
| ws@7.4.5: | ||||
|   version "7.4.5" | ||||
|   resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.5.tgz#a484dd851e9beb6fdb420027e3885e8ce48986c1" | ||||
|   integrity sha512-xzyu3hFvomRfXKH8vOFMU3OguG6oOvhXMo3xsGy3xWExqaM2dxBbVxuD99O7m3ZUFMvvscsZDqxfgMaRr/Nr1g== | ||||
|  | ||||
| ws@^7.4.4: | ||||
|   version "7.4.4" | ||||
|   resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.4.tgz#383bc9742cb202292c9077ceab6f6047b17f2d59" | ||||
|   integrity sha512-Qm8k8ojNQIMx7S+Zp8u/uHOx7Qazv3Yv4q68MiWWWOJhiwG5W3x7iqmRtJo8xxrciZUY4vRxUTJCKuRnF28ZZw== | ||||
| @@ -11397,6 +11408,11 @@ yargs-parser@5.0.0-security.0, yargs-parser@^5.0.0: | ||||
|     camelcase "^3.0.0" | ||||
|     object.assign "^4.1.0" | ||||
|  | ||||
| yargs-parser@>=5.0.0-security.0: | ||||
|   version "20.2.7" | ||||
|   resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.7.tgz#61df85c113edfb5a7a4e36eb8aa60ef423cbc90a" | ||||
|   integrity sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw== | ||||
|  | ||||
| yargs-parser@^13.1.2: | ||||
|   version "13.1.2" | ||||
|   resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" | ||||
|   | ||||
		Reference in New Issue
	
	Block a user