mirror of
https://github.com/linux-odyssey/linux-odyssey.git
synced 2026-11-05 19:20:12 +08:00
fix: analytics type errors
This commit is contained in:
1 parent
f7e2b00358
commit
253564376d
26 files changed
+53
-322
No files matched your search
@@ -1,6 +0,0 @@
|
||||
{
|
||||
"watch": ["src", "views"],
|
||||
"ext": "ts,handlebars,js",
|
||||
"ignore": ["src/**/*.spec.ts"],
|
||||
"exec": "node --loader ts-node/esm src/index.ts"
|
||||
}
|
||||
@@ -3,13 +3,12 @@
|
||||
"version": "1.0.0",
|
||||
"main": "src/index.js",
|
||||
"private": true,
|
||||
"type": "module",
|
||||
"license": "GPL",
|
||||
"scripts": {
|
||||
"start": "node dist/index.js",
|
||||
"build": "tsc -b -f",
|
||||
"watch": "tsc -b --watch",
|
||||
"dev": "nodemon"
|
||||
"start": "node dist/analytics/src/index.js",
|
||||
"build": "tsc",
|
||||
"type-check": "tsc --noEmit",
|
||||
"dev": "tsx watch src/index.ts"
|
||||
},
|
||||
"dependencies": {
|
||||
"dotenv": "^16.4.5",
|
||||
@@ -23,9 +22,8 @@
|
||||
"@swc/helpers": "^0.5.6",
|
||||
"@types/express": "^4.17.21",
|
||||
"@types/node": "^20.11.20",
|
||||
"nodemon": "^3.1.0",
|
||||
"regenerator-runtime": "^0.14.1",
|
||||
"ts-node": "^10.9.2",
|
||||
"tsx": "^4.19.3",
|
||||
"typescript": "^5.3.3"
|
||||
}
|
||||
}
|
||||
Whitespace-only changes.
@@ -1,6 +1,6 @@
|
||||
import type { Request, Response } from 'express'
|
||||
import Pagination from '../models/pagination.js'
|
||||
import { errorCommands } from '../models/commands.js'
|
||||
import Pagination from '../models/pagination'
|
||||
import { errorCommands } from '../models/commands'
|
||||
|
||||
export async function commandListController(
|
||||
req: Request,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { Request, Response } from 'express'
|
||||
import { userCount } from '../models/users.js'
|
||||
import { questList } from '../models/quests.js'
|
||||
import { userCount } from '../models/users'
|
||||
import { questList } from '../models/quests'
|
||||
|
||||
export async function homeController(req: Request, res: Response) {
|
||||
const quests = await questList()
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { Request, Response } from 'express'
|
||||
import { questList } from '../models/quests.js'
|
||||
import { questList } from '../models/quests'
|
||||
|
||||
export async function questListController(req: Request, res: Response) {
|
||||
const quests = await questList()
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { Request, Response } from 'express'
|
||||
import Pagination from '../models/pagination.js'
|
||||
import { sessionList, sessionDetail } from '../models/sessions.js'
|
||||
import Pagination from '../models/pagination'
|
||||
import { sessionList, sessionDetail } from '../models/sessions'
|
||||
|
||||
export async function sessionListController(req: Request, res: Response) {
|
||||
const { nextKey, order } = req.query as { nextKey: string; order: string }
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import { Request, Response } from 'express'
|
||||
import mongoose from 'mongoose'
|
||||
import Pagination from '../models/pagination.js'
|
||||
import { userList, userDetail, idToUser } from '../models/users.js'
|
||||
import Pagination from '../models/pagination'
|
||||
import { userList, userDetail, idToUser } from '../models/users'
|
||||
|
||||
export async function userListController(req: Request, res: Response) {
|
||||
const { nextKey, order } = req.query as { nextKey: string; order: string }
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
import connectDB from '@models'
|
||||
import { connectDB } from '../../models'
|
||||
import express from 'express'
|
||||
import { engine } from 'express-handlebars'
|
||||
import basicAuth from 'express-basic-auth'
|
||||
import config from './config.js'
|
||||
import router from './router.js'
|
||||
import config from './config'
|
||||
import router from './router'
|
||||
|
||||
async function main() {
|
||||
await connectDB(config.db)
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { Command } from '@models'
|
||||
import Pagination from './pagination.js'
|
||||
import { Command } from '../../../models'
|
||||
import Pagination from './pagination'
|
||||
|
||||
// eslint-disable-next-line import/prefer-default-export
|
||||
export async function errorCommands(pagination: Pagination) {
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
/* eslint-disable class-methods-use-this */
|
||||
// eslint-disable-next-line max-classes-per-file
|
||||
import mongoose, { Types } from 'mongoose'
|
||||
|
||||
export const DESC: string = 'desc'
|
||||
|
||||
@@ -1,8 +1,14 @@
|
||||
/* eslint-disable object-shorthand */
|
||||
/* eslint-disable func-names */
|
||||
import { UserProfile } from '@models'
|
||||
import { UserProfile } from '../../../models'
|
||||
|
||||
export function questList() {
|
||||
export interface QuestProgress {
|
||||
_id: string
|
||||
started: number
|
||||
completed: number
|
||||
completedRate: number
|
||||
failed: number
|
||||
}
|
||||
|
||||
export function questList(): Promise<QuestProgress[]> {
|
||||
return UserProfile.aggregate([
|
||||
{
|
||||
$project: {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { Command, Session } from '@models'
|
||||
import Pagination from './pagination.js'
|
||||
import { Command, Session } from '../../../models'
|
||||
import Pagination from './pagination'
|
||||
import {
|
||||
CommandObject,
|
||||
SessionDetail,
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import { Session, User } from '@models'
|
||||
import { Types } from 'mongoose'
|
||||
import Pagination from './pagination.js'
|
||||
import { IUser, UserSessionDetail } from '../interface.js'
|
||||
import { Session, User, IUser, ISession } from '../../../models'
|
||||
import { HydratedDocument, Types } from 'mongoose'
|
||||
import Pagination from './pagination'
|
||||
import { UserSessionDetail } from '../interface'
|
||||
|
||||
function loginMethods(user: IUser): string[] {
|
||||
const methods: string[] = []
|
||||
@@ -23,7 +23,11 @@ export function userCount() {
|
||||
}
|
||||
|
||||
export async function userList(pagination: Pagination) {
|
||||
const users = await Session.aggregate([
|
||||
const users: {
|
||||
userData: HydratedDocument<IUser>
|
||||
count: number
|
||||
lastActivityAt: Date
|
||||
}[] = await Session.aggregate([
|
||||
pagination.match('user'),
|
||||
{
|
||||
$group: {
|
||||
@@ -62,7 +66,7 @@ export async function userList(pagination: Pagination) {
|
||||
export async function userDetail(
|
||||
id: Types.ObjectId
|
||||
): Promise<UserSessionDetail[]> {
|
||||
const sessions = await Session.find({
|
||||
const sessions: HydratedDocument<ISession>[] = await Session.find({
|
||||
user: id,
|
||||
})
|
||||
return sessions.map((session): UserSessionDetail => {
|
||||
|
||||
@@ -1,16 +1,13 @@
|
||||
import { Router } from 'express'
|
||||
|
||||
import { homeController } from './controllers/index.js'
|
||||
import {
|
||||
userListController,
|
||||
userDetailController,
|
||||
} from './controllers/users.js'
|
||||
import { questListController } from './controllers/quests.js'
|
||||
import { commandListController } from './controllers/commands.js'
|
||||
import { homeController } from './controllers/index'
|
||||
import { userListController, userDetailController } from './controllers/users'
|
||||
import { questListController } from './controllers/quests'
|
||||
import { commandListController } from './controllers/commands'
|
||||
import {
|
||||
sessionDetailController,
|
||||
sessionListController,
|
||||
} from './controllers/sessions.js'
|
||||
} from './controllers/sessions'
|
||||
|
||||
const router = Router()
|
||||
|
||||
|
||||
@@ -1,11 +1,9 @@
|
||||
{
|
||||
"extends": "../../tsconfig.json",
|
||||
"compilerOptions": {
|
||||
"rootDir": "src",
|
||||
"outDir": "./dist"
|
||||
},
|
||||
"include": ["src"],
|
||||
"references": [{ "path": "../models" }],
|
||||
"include": ["src", "../models"],
|
||||
"ts-node": {
|
||||
"swc": true
|
||||
}
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
import { z } from 'zod'
|
||||
|
||||
export * from './session.js'
|
||||
|
||||
export const passwordPolicy = {
|
||||
minLength: 8,
|
||||
minNumbers: 1,
|
||||
|
||||
@@ -1,15 +0,0 @@
|
||||
export interface SessionSummaryResponse {
|
||||
_id: string
|
||||
user: string
|
||||
quest: string
|
||||
status: string
|
||||
createdAt: Date
|
||||
lastActivityAt: Date
|
||||
}
|
||||
|
||||
export interface SessionDetailResponse extends SessionSummaryResponse {
|
||||
hints: string[][]
|
||||
tasks: string[][]
|
||||
responses: string[][]
|
||||
graph: any
|
||||
}
|
||||
@@ -1,52 +0,0 @@
|
||||
import { describe, it, expect, beforeAll } from '@jest/globals'
|
||||
import fs from 'fs/promises'
|
||||
import path from 'path'
|
||||
import yaml from 'yaml'
|
||||
import { questSchema } from '../src/quest/quest.js'
|
||||
|
||||
describe('Parse all quests', () => {
|
||||
let quests: any[] = []
|
||||
|
||||
test('should parse all quests', async () => {
|
||||
const questDirectory = path.join(process.cwd(), 'quests')
|
||||
|
||||
const loadQuests = async () => {
|
||||
const questNames = await fs.readdir(questDirectory, {
|
||||
withFileTypes: true,
|
||||
})
|
||||
|
||||
return Promise.all(
|
||||
questNames
|
||||
.filter(
|
||||
(dirent) => dirent.isDirectory() && !dirent.name.startsWith('.')
|
||||
)
|
||||
.map(async (dirent) => {
|
||||
const id = dirent.name
|
||||
const questPath = path.join(questDirectory, id)
|
||||
const files = await fs.readdir(questPath)
|
||||
if (!files.includes('game.yml')) {
|
||||
throw new Error(`Missing game.yml in quest ${id}`)
|
||||
}
|
||||
|
||||
const body = await fs.readFile(
|
||||
path.join(questPath, 'game.yml'),
|
||||
'utf-8'
|
||||
)
|
||||
const questData = yaml.parse(body, { merge: true })
|
||||
const image = files.includes('Dockerfile') ? id : 'base'
|
||||
return {
|
||||
id,
|
||||
image,
|
||||
...questData,
|
||||
}
|
||||
})
|
||||
)
|
||||
}
|
||||
|
||||
quests = await loadQuests()
|
||||
quests.forEach((quest) => {
|
||||
console.log(`Quest ID: ${quest.id}`)
|
||||
expect(questSchema.safeParse(quest).error).toBeUndefined()
|
||||
})
|
||||
})
|
||||
})
|
||||
@@ -1,93 +0,0 @@
|
||||
import { describe, it, expect } from '@jest/globals'
|
||||
import { questSchema } from '../src/index.js'
|
||||
|
||||
describe('Test quest schema', () => {
|
||||
it('should parse quest schema', () => {
|
||||
const sampleQuest = {
|
||||
id: 'get-started',
|
||||
image: 'base',
|
||||
title: '終端機的基本知識',
|
||||
instruction: `歡迎來到 Linux Odyssey!
|
||||
在這個關卡中,你將會學到:
|
||||
1. 如何使用這個網站
|
||||
2. 如何使用終端機`,
|
||||
stages: [
|
||||
{
|
||||
id: 'start',
|
||||
task: '按下 `開始` ����開始',
|
||||
condition: {
|
||||
command: ['^echo start$'],
|
||||
},
|
||||
responses: [
|
||||
{
|
||||
content: `在畫面的中下方的區��是終端機,你可以在終端機��輸入指令來操作電��。
|
||||
在終端機中,你所看到的 \`commander:~ $\` 叫做命令提示字串。
|
||||
��令提示字串最後的��字號 \`$\` 叫命令提示符,你必須將指令輸入在它的後方。
|
||||
��你輸入完指令並按下 Enter 之後,終端機會��行你輸入的指令,並且會從終端機的下一行開始輸出指令的��行結果。
|
||||
直到你看到新的 \`commander:~ $\` 出現時,代表你可以輸入下一個指令了。
|
||||
��在請你輸入 \`echo hello\` 來看看會發生什麼事。`,
|
||||
},
|
||||
],
|
||||
hints: ['�� 在 `commander:~ $` ��面輸入 `echo hello` ��按下 Enter'],
|
||||
},
|
||||
{
|
||||
id: 'echo-hello',
|
||||
task: '在終端機輸入 `echo hello`',
|
||||
requirements: ['start'],
|
||||
condition: {
|
||||
command: ['^echo hello$'],
|
||||
},
|
||||
responses: [
|
||||
{
|
||||
content: `你應��可以看到終端機上��示了以下內容:
|
||||
\`\`\`
|
||||
commander:~ $ echo hello
|
||||
hello
|
||||
\`\`\`
|
||||
第一行的 \`commander:~ $\` 是命令提示字串,接在後方的 \`echo hello\` 是你輸入的指令。
|
||||
第二行的 \`hello\` ��是終端機的輸出結果。
|
||||
你現在知道了如何在終端機上輸入指令,以及查看終端機輸出的位置。
|
||||
��在請輸入 \`echo next\` 來��續下一個步��。`,
|
||||
},
|
||||
],
|
||||
hints: ['�� ���入 `echo next` ���續下一個步��'],
|
||||
},
|
||||
{
|
||||
id: 'echo-next',
|
||||
task: '在終端機輸入 `echo next`',
|
||||
requirements: ['echo-hello'],
|
||||
condition: {
|
||||
command: ['^echo next$'],
|
||||
},
|
||||
responses: [
|
||||
{
|
||||
content: `\`Ctrl + C\` 在終端機中是一個很重要的快捷鍵,它可以用來中��正在��行的指令,並產生一個新的命令提示字串,讓你可以��續輸入指令。
|
||||
如果指令��行很久沒有反應,或你因為其他原因想要中��指令,你可以按下 \`Ctrl + C\` 來中��指令。
|
||||
又或者你輸入了錯��的指令,����得慢慢��除,你也可以按下 \`Ctrl + C\` 來產生新的命令提示字串重新輸入指令。
|
||||
如果你已經理解了��才的說明,請輸入 \`echo finish\` 來結束這一關。`,
|
||||
},
|
||||
],
|
||||
hints: [
|
||||
'�� ��下 `Ctrl + C` 能��中��正在��行的指令',
|
||||
'�� ��下 `Ctrl + C` 能��產生新的命令提示字串',
|
||||
'�� ���入 `echo finish` 來結束這一關',
|
||||
],
|
||||
},
|
||||
{
|
||||
id: 'END',
|
||||
task: '結束關卡',
|
||||
requirements: ['echo-next'],
|
||||
condition: {
|
||||
command: ['^echo finish$'],
|
||||
},
|
||||
responses: [
|
||||
{
|
||||
content: '恭喜你完成了這個關卡!',
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
}
|
||||
expect(questSchema.safeParse(sampleQuest).error).toBeUndefined()
|
||||
})
|
||||
})
|
||||
@@ -1,22 +0,0 @@
|
||||
import { describe, it, expect } from '@jest/globals'
|
||||
import { responseSchema } from '../src/quest/response.js'
|
||||
|
||||
describe('parsing response', () => {
|
||||
it('should parse valid response', () => {
|
||||
const response = {
|
||||
type: 'narrative',
|
||||
content: 'This is a response content',
|
||||
}
|
||||
const result = responseSchema.safeParse(response)
|
||||
expect(result.error).toBeUndefined()
|
||||
})
|
||||
|
||||
it('should fail to parse invalid response', () => {
|
||||
const response = {
|
||||
type: 'dialogue',
|
||||
content: 'This is a response content',
|
||||
}
|
||||
const result = responseSchema.safeParse(response)
|
||||
expect(result.error).toBeUndefined()
|
||||
})
|
||||
})
|
||||
@@ -1,29 +0,0 @@
|
||||
import { describe, it, expect } from '@jest/globals'
|
||||
import { stageSchema } from '../src/quest/stage.js'
|
||||
|
||||
describe('parsing stage', () => {
|
||||
it('should parse valid stage', () => {
|
||||
const stage = {
|
||||
id: 'start',
|
||||
task: '按下 `開始` ����開始',
|
||||
requirements: ['start'],
|
||||
condition: {
|
||||
command: ['^echo start$'],
|
||||
},
|
||||
responses: [
|
||||
{
|
||||
type: 'text',
|
||||
content: `在畫面的中下方的區��是終端機,你可以在終端機��輸入指令來操作電��。
|
||||
在終端機中,你所看到的 \`commander:~ $\` 叫做命令提示字串。
|
||||
��令提示字串最後的��字號 \`$\` 叫命令提示符,你必須將指令輸入在它的後方。
|
||||
��你輸入完指令並按下 Enter 之後,終端機會��行你輸入的指令,並且會從終端機的下一行開始輸出指令的��行結果。
|
||||
直到你看到新的 \`commander:~ $\` 出現時,代表你可以輸入下一個指令了。
|
||||
��在請你輸入 \`echo hello\` 來看看會發生什麼事。`,
|
||||
},
|
||||
],
|
||||
hints: ['�� 在 `commander:~ $` ��面輸入 `echo hello` ��按下 Enter'],
|
||||
}
|
||||
const result = stageSchema.safeParse(stage)
|
||||
expect(result.error).toBeUndefined()
|
||||
})
|
||||
})
|
||||
@@ -5,7 +5,7 @@ export { Session, ISession } from './session.js'
|
||||
export { Command, ICommand } from './command.js'
|
||||
export { UserProfile, IUserProfile, IProgress } from './userProfile.js'
|
||||
|
||||
export default async function connectDB(uri: string) {
|
||||
export async function connectDB(uri: string) {
|
||||
const db = await mongoose.connect(uri)
|
||||
return db.connection.getClient()
|
||||
}
|
||||
|
||||
+1
-1
@@ -5,7 +5,7 @@ import YAML from 'yaml'
|
||||
import swaggerUI from 'swagger-ui-express'
|
||||
import passport from 'passport'
|
||||
import * as trpcExpress from '@trpc/server/adapters/express'
|
||||
import connectDB from '../../packages/models'
|
||||
import { connectDB } from '../../packages/models'
|
||||
|
||||
import './auth/passport.js'
|
||||
import socketServer from './api/socket.js'
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"forceConsistentCasingInFileNames": true,
|
||||
"esModuleInterop": true,
|
||||
"strict": true,
|
||||
"skipLibCheck": true,
|
||||
"sourceMap": true,
|
||||
|
||||
@@ -3441,7 +3441,7 @@ chmodr@~1.0.2:
|
||||
resolved "https://registry.yarnpkg.com/chmodr/-/chmodr-1.0.2.tgz#04662b932d0f02ec66deaa2b0ea42811968e3eb9"
|
||||
integrity sha512-oHosCxCZpaI/Db320r8M5SHHZuVfnFJVwkSGkI81QLnnVg25pDw//NgD4fy1WvvydhZNi2G+jrbNSprRkfbRYA==
|
||||
|
||||
chokidar@^3.5.2, chokidar@^3.5.3:
|
||||
chokidar@^3.5.3:
|
||||
version "3.6.0"
|
||||
resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz"
|
||||
integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==
|
||||
@@ -3922,7 +3922,7 @@ debug@2.6.9:
|
||||
dependencies:
|
||||
ms "2.0.0"
|
||||
|
||||
debug@4, debug@4.x, debug@^4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@~4.3.1, debug@~4.3.2, debug@~4.3.4:
|
||||
debug@4, debug@4.x, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@~4.3.1, debug@~4.3.2, debug@~4.3.4:
|
||||
version "4.3.4"
|
||||
resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz"
|
||||
integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==
|
||||
@@ -5590,11 +5590,6 @@ iferr@^0.1.5:
|
||||
resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501"
|
||||
integrity sha512-DUNFN5j7Tln0D+TxzloUjKB+CtVu6myn0JEFak6dG18mNt9YkQ6lzGCdafwofISZ1lLF3xRHJ98VKy9ynkcFaA==
|
||||
|
||||
ignore-by-default@^1.0.1:
|
||||
version "1.0.1"
|
||||
resolved "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz"
|
||||
integrity sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==
|
||||
|
||||
ignore@^5.1.1, ignore@^5.2.0, ignore@^5.2.4:
|
||||
version "5.3.1"
|
||||
resolved "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz"
|
||||
@@ -7123,22 +7118,6 @@ node-uuid@~1.4.7:
|
||||
resolved "https://registry.yarnpkg.com/node-uuid/-/node-uuid-1.4.8.tgz#b040eb0923968afabf8d32fb1f17f1167fdab907"
|
||||
integrity sha512-TkCET/3rr9mUuRp+CpO7qfgT++aAxfDRaalQhwPFzI9BY/2rCDn6OfpZOVggi1AXfTPpfkTrg5f5WQx5G1uLxA==
|
||||
|
||||
nodemon@^3.1.0:
|
||||
version "3.1.0"
|
||||
resolved "https://registry.npmjs.org/nodemon/-/nodemon-3.1.0.tgz"
|
||||
integrity sha512-xqlktYlDMCepBJd43ZQhjWwMw2obW/JRvkrLxq5RCNcuDDX1DbcPT+qT1IlIIdf+DhnWs90JpTMe+Y5KxOchvA==
|
||||
dependencies:
|
||||
chokidar "^3.5.2"
|
||||
debug "^4"
|
||||
ignore-by-default "^1.0.1"
|
||||
minimatch "^3.1.2"
|
||||
pstree.remy "^1.1.8"
|
||||
semver "^7.5.3"
|
||||
simple-update-notifier "^2.0.0"
|
||||
supports-color "^5.5.0"
|
||||
touch "^3.1.0"
|
||||
undefsafe "^2.0.5"
|
||||
|
||||
"nopt@2 || 3", nopt@~3.0.6:
|
||||
version "3.0.6"
|
||||
resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9"
|
||||
@@ -7153,13 +7132,6 @@ nopt@^5.0.0:
|
||||
dependencies:
|
||||
abbrev "1"
|
||||
|
||||
nopt@~1.0.10:
|
||||
version "1.0.10"
|
||||
resolved "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz"
|
||||
integrity sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==
|
||||
dependencies:
|
||||
abbrev "1"
|
||||
|
||||
normalize-git-url@~3.0.2:
|
||||
version "3.0.2"
|
||||
resolved "https://registry.yarnpkg.com/normalize-git-url/-/normalize-git-url-3.0.2.tgz#8e5f14be0bdaedb73e07200310aa416c27350fc4"
|
||||
@@ -7977,11 +7949,6 @@ psl@^1.1.28, psl@^1.1.33:
|
||||
resolved "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz"
|
||||
integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==
|
||||
|
||||
pstree.remy@^1.1.8:
|
||||
version "1.1.8"
|
||||
resolved "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz"
|
||||
integrity sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==
|
||||
|
||||
pump@^3.0.0:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz"
|
||||
@@ -8659,13 +8626,6 @@ simple-swizzle@^0.2.2:
|
||||
dependencies:
|
||||
is-arrayish "^0.3.1"
|
||||
|
||||
simple-update-notifier@^2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz"
|
||||
integrity sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==
|
||||
dependencies:
|
||||
semver "^7.5.3"
|
||||
|
||||
sisteransi@^1.0.5:
|
||||
version "1.0.5"
|
||||
resolved "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz"
|
||||
@@ -9066,7 +9026,7 @@ supports-color@^2.0.0:
|
||||
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
|
||||
integrity sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==
|
||||
|
||||
supports-color@^5.3.0, supports-color@^5.5.0:
|
||||
supports-color@^5.3.0:
|
||||
version "5.5.0"
|
||||
resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz"
|
||||
integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
|
||||
@@ -9267,13 +9227,6 @@ toidentifier@1.0.1:
|
||||
resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz"
|
||||
integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==
|
||||
|
||||
touch@^3.1.0:
|
||||
version "3.1.0"
|
||||
resolved "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz"
|
||||
integrity sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==
|
||||
dependencies:
|
||||
nopt "~1.0.10"
|
||||
|
||||
tough-cookie@^4.1.3:
|
||||
version "4.1.3"
|
||||
resolved "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz"
|
||||
@@ -9532,11 +9485,6 @@ unbox-primitive@^1.0.2:
|
||||
has-symbols "^1.0.3"
|
||||
which-boxed-primitive "^1.0.2"
|
||||
|
||||
undefsafe@^2.0.5:
|
||||
version "2.0.5"
|
||||
resolved "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz"
|
||||
integrity sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==
|
||||
|
||||
undici-types@~5.26.4:
|
||||
version "5.26.5"
|
||||
resolved "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz"
|
||||
|
||||
Reference in new issue
Block a user