From 11368bc8316e0736926ad2a05f3584e2d59a90f4 Mon Sep 17 00:00:00 2001 From: undefined Date: Sat, 11 Jul 2020 20:00:43 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0cache-loader=EF=BC=8Cdebug?= =?UTF-8?q?=E6=A8=A1=E5=BC=8F=E4=B8=8B=E4=B8=8D=E5=86=8D=E4=BD=BF=E7=94=A8?= =?UTF-8?q?template=E7=BC=93=E5=AD=98=EF=BC=8C=E4=BF=AE=E5=A4=8D=E4=B8=80?= =?UTF-8?q?=E4=BA=9B=20bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build/development.js | 4 - build/hack.js | 20 +- build/index.js | 6 +- build/production.js | 3 - build/template.js | 21 -- build/webpack.js | 22 +- hydro/handler/contest.ts | 2 +- hydro/handler/discussion.ts | 36 +++- hydro/handler/judge.ts | 23 +- hydro/handler/problem.ts | 36 ++-- hydro/lib/template.ts | 33 ++- hydro/loader.ts | 9 +- hydro/model/contest.ts | 34 +-- hydro/model/discussion.ts | 2 +- hydro/model/task.ts | 13 +- package.json | 16 +- templates/components/comments_discussion.html | 8 +- templates/components/comments_solution.html | 14 +- templates/partials/problem_sidebar.html | 4 + ui/build/config/webpack.js | 4 +- yarn.lock | 204 ++++++------------ 21 files changed, 248 insertions(+), 266 deletions(-) delete mode 100644 build/development.js delete mode 100644 build/production.js diff --git a/build/development.js b/build/development.js deleted file mode 100644 index 43e47641c..000000000 --- a/build/development.js +++ /dev/null @@ -1,4 +0,0 @@ -global.DEBUG = true; -require('./index.js')('development').catch((e) => { - console.error(e); -}); diff --git a/build/hack.js b/build/hack.js index f2d8e27fd..499b2e206 100644 --- a/build/hack.js +++ b/build/hack.js @@ -25,16 +25,6 @@ module.exports = { console.error('Cannot hack sockjs'); } }, - yargs: () => { - const p = require.resolve('yargs'); - const file = fs.readFileSync(p).toString().split('\n'); - if (file[12].includes('const argv = yargs(processArgs, cwd, require)')) { - file[12] = 'const argv = yargs(processArgs, cwd)'; - fs.writeFileSync(p, file.join('\n')); - } else if (!file[12].includes('const argv = yargs(processArgs, cwd)')) { - console.error('Cannot hack yargs'); - } - }, saslprep: () => { const q = require.resolve('saslprep'); const mem = path.join(path.dirname(q), 'code-points.mem'); @@ -48,4 +38,14 @@ module.exports = { console.error('Cannot hack saslprep'); } }, + ftp: () => { + const p = require.resolve('ftp/lib/connection'); + const file = fs.readFileSync(p).toString().split('\n'); + if (file[51].includes('new Buffer')) { + file[51] = file[51].replace('new Buffer', 'Buffer.from'); + fs.writeFileSync(p, file.join('\n')); + } else if (!file[51].includes('Buffer.from')) { + console.error('Cannot hack ftp'); + } + }, }; diff --git a/build/index.js b/build/index.js index bb90f8660..b86c8a481 100644 --- a/build/index.js +++ b/build/index.js @@ -3,6 +3,7 @@ const fs = require('fs'); const path = require('path'); const zlib = require('zlib'); const yaml = require('js-yaml'); +const argv = require('yargs-parser')(process.argv.slice(2)); const { root, ignoreFailure, rmdir } = require('./utils'); const template = require('./template'); const hack = require('./hack'); @@ -84,4 +85,7 @@ async function build(type) { fs.writeFileSync(root('.build/install.js'), `global.Hydro="${d}"; ${installer}`); } -module.exports = build; +build(argv.development ? 'development' : 'production').catch((e) => { + console.error(e); + process.exit(1); +}); diff --git a/build/production.js b/build/production.js deleted file mode 100644 index ec842afda..000000000 --- a/build/production.js +++ /dev/null @@ -1,3 +0,0 @@ -require('./index.js')('production').catch((e) => { - console.error(e); -}); diff --git a/build/template.js b/build/template.js index 57ff42adc..a418e3792 100644 --- a/build/template.js +++ b/build/template.js @@ -24,27 +24,6 @@ const build = (dirOrObject) => { templates[i] = template; } } else templates = dirOrObject; - for (const i in templates) { - if (i.endsWith('.html') && !global.DEBUG && !templates[i].includes('No Compression')) { - templates[i] = templates[i] - .trim() - .replace(/ *\n */gmi, ' ') - .replace(/, /gmi, ',') - .replace(/%} {%/gmi, '%}{%') - .replace(/ %}/gmi, '%}') - .replace(/{% /gmi, '{%') - .replace(/> <') - .replace(/}} {{/gmi, '>{{') - .replace(/{{ /gmi, '{{') - .replace(/ }}/gmi, '}}') - .replace(/%} {%/gmi, '>{%') - .replace(/= /gmi, '=') - .replace(/ =/gmi, '=') - .trim(); - } - } return templates; }; diff --git a/build/webpack.js b/build/webpack.js index 5abf38f23..352a9081e 100644 --- a/build/webpack.js +++ b/build/webpack.js @@ -1,4 +1,5 @@ /* eslint-disable import/no-extraneous-dependencies */ +const path = require('path'); const webpack = require('webpack'); const FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin'); const { root } = require('./utils'); @@ -7,14 +8,31 @@ const build = async (type) => { const config = { mode: type, entry: { - app: root('dist/loader.js'), + app: root('hydro/loader.ts'), }, output: { filename: '[name].js', path: root('.build'), }, target: 'node', - module: {}, + module: { + rules: [ + { + test: /\.ts$/, + exclude: /node_modules/, + use: [ + { + loader: 'cache-loader', + options: { + cacheDirectory: path.resolve(__dirname, '..', '.cache', 'ts'), + }, + }, + 'ts-loader', + ], + }, + ], + }, + resolve: { extensions: ['.js', '.ts'] }, plugins: [ new webpack.ProgressPlugin(), new FriendlyErrorsPlugin({ diff --git a/hydro/handler/contest.ts b/hydro/handler/contest.ts index bb8ae02a7..2ca57b119 100644 --- a/hydro/handler/contest.ts +++ b/hydro/handler/contest.ts @@ -375,6 +375,7 @@ class ContestCreateHandler extends ContestHandler { } export async function apply() { + Route('contest_create', '/contest/create', ContestCreateHandler, PERM.PERM_CREATE_CONTEST); Route('contest_main', '/contest', ContestListHandler, PERM.PERM_VIEW_CONTEST); Route('contest_detail', '/contest/:tid', ContestDetailHandler, PERM.PERM_VIEW_CONTEST); Route('contest_edit', '/contest/:tid/edit', ContestEditHandler, PERM.PERM_VIEW_CONTEST); @@ -383,7 +384,6 @@ export async function apply() { Route('contest_detail_problem', '/contest/:tid/p/:pid', ContestProblemHandler, PERM.PERM_VIEW_CONTEST); Route('contest_detail_problem_submit', '/contest/:tid/p/:pid/submit', ContestProblemSubmitHandler, PERM.PERM_VIEW_CONTEST); Route('contest_code', '/contest/:tid/code', ContestCodeHandler, PERM.PERM_VIEW_CONTEST); - Route('contest_create', '/contest/create', ContestCreateHandler, PERM.PERM_CREATE_CONTEST); } global.Hydro.handler.contest = apply; diff --git a/hydro/handler/discussion.ts b/hydro/handler/discussion.ts index 0872358c6..e4c47d145 100644 --- a/hydro/handler/discussion.ts +++ b/hydro/handler/discussion.ts @@ -1,4 +1,5 @@ import { ObjectID } from 'mongodb'; +import { isSafeInteger } from 'lodash'; import { DiscussionNotFoundError, DocumentNotFoundError } from '../error'; import paginate from '../lib/paginate'; import * as system from '../model/system'; @@ -87,17 +88,23 @@ class DiscussionMainHandler extends Handler { } class DiscussionNodeHandler extends DiscussionHandler { - async get({ - domainId, type, name, page = 1, - }) { - if (ObjectID.isValid(name)) name = new ObjectID(name); + @param('type', Types.String) + @param('name', Types.String) + @param('page', Types.UnsignedInt, true) + async get(domainId: string, type: string, _name: string, page = 1) { + let name: ObjectID | string | number; + if (ObjectID.isValid(_name)) name = new ObjectID(_name); + else if (isSafeInteger(parseInt(_name, 10))) name = parseInt(_name, 10); + else name = _name; const [ddocs, dpcount] = await paginate( discussion.getMulti(domainId, { parentType: typeMapper[type], parentId: name }), page, await system.get('DISCUSSION_PER_PAGE'), ); + const uids = ddocs.map((ddoc) => ddoc.owner); + uids.push(this.vnode.owner); const [udict, vnodes] = await Promise.all([ - user.getList(domainId, ddocs.map((ddoc) => ddoc.owner)), + user.getList(domainId, uids), discussion.getNodes(domainId), ]); const path = [ @@ -105,7 +112,7 @@ class DiscussionNodeHandler extends DiscussionHandler { ['discussion_main', 'discussion_main'], [this.vnode.title, null, true], ]; - const vndict = { [typeMapper[type]]: { [name]: this.vnode } }; + const vndict = { [typeMapper[type]]: { [name.toString()]: this.vnode } }; this.response.template = 'discussion_main_or_node.html'; this.response.body = { ddocs, @@ -138,11 +145,20 @@ class DiscussionCreateHandler extends DiscussionHandler { this.response.body = { path, vnode: this.vnode }; } - async post({ - domainId, type, name, title, content, highlight, - }) { + @param('type', Types.String) + @param('name', Types.String) + @param('title', Types.String, isTitle) + @param('content', Types.String, isContent) + @param('highlight', Types.Boolean, true) + async post( + domainId: string, type: string, _name: string, + title: string, content: string, highlight = false, + ) { this.limitRate('add_discussion', 3600, 30); - if (ObjectID.isValid(name)) name = new ObjectID(name); + let name: ObjectID | string | number; + if (ObjectID.isValid(_name)) name = new ObjectID(_name); + else if (isSafeInteger(parseInt(_name, 10))) name = parseInt(_name, 10); + else name = _name; if (highlight) this.checkPerm(PERM.PERM_HIGHLIGHT_DISCUSSION); const did = await discussion.add( domainId, typeMapper[type], name, this.user._id, diff --git a/hydro/handler/judge.ts b/hydro/handler/judge.ts index 71251b595..a66051135 100644 --- a/hydro/handler/judge.ts +++ b/hydro/handler/judge.ts @@ -1,4 +1,5 @@ import yaml from 'js-yaml'; +import { ObjectID } from 'mongodb'; import { parseTimeMS, parseMemoryMB } from '../utils'; import * as record from '../model/record'; import * as problem from '../model/problem'; @@ -8,7 +9,7 @@ import * as user from '../model/user'; import * as task from '../model/task'; import * as bus from '../service/bus'; import { - Route, Handler, Connection, ConnectionHandler, + Route, Handler, Connection, ConnectionHandler, Types, param, } from '../service/server'; async function _postJudge(rdoc) { @@ -36,6 +37,8 @@ async function _postJudge(rdoc) { } export async function next(body) { + if (body.rid) body.rid = new ObjectID(body.rid); + if (body.tid) body.tid = new ObjectID(body.tid); let rdoc = await record.get(body.domainId, body.rid); const $set: any = {}; const $push: any = {}; @@ -66,6 +69,8 @@ export async function next(body) { } export async function end(body) { + if (body.rid) body.rid = new ObjectID(body.rid); + if (body.tid) body.tid = new ObjectID(body.tid); let rdoc = await record.get(body.domainId, body.rid); const $set: any = {}; const $push: any = {}; @@ -92,9 +97,17 @@ export async function end(body) { } class PretestHandler extends Handler { - async post({ - domainId, pid, code, lang, time = '1s', memory = '256m', input = '', - }) { + @param('pid', Types.UnsignedInt, true) + @param('code', Types.String) + @param('lang', Types.String) + @param('time', Types.String, true) + @param('memory', Types.String, true) + @param('input', Types.String, true) + async post( + domainId: string, pid = 0, + code: string, lang: string, + time = '1s', memory = '256m', input = '', + ) { if (pid) { const pdoc = await problem.get(domainId, pid); if (pdoc.config) { @@ -104,7 +117,7 @@ class PretestHandler extends Handler { } } const rid = await record.add(domainId, { - pid: pid || String.random(16), + pid, uid: this.user._id, type: 'run', time: parseTimeMS(time), diff --git a/hydro/handler/problem.ts b/hydro/handler/problem.ts index 8aed68703..551cfbca0 100644 --- a/hydro/handler/problem.ts +++ b/hydro/handler/problem.ts @@ -403,10 +403,6 @@ class ProblemSolutionHandler extends ProblemDetailHandler { }; } - async post({ domainId, psid }) { - if (psid) this.psdoc = await solution.get(domainId, new ObjectID(psid)); - } - @param('content', Types.String, isContent) async postSubmit(domainId: string, content: string) { this.checkPerm(PERM.PERM_CREATE_PROBLEM_SOLUTION); @@ -415,17 +411,21 @@ class ProblemSolutionHandler extends ProblemDetailHandler { } @param('content', Types.String, isContent) - async postEditSolution(domainId: string, content: string) { - if (this.psdoc.owner !== this.user._id) this.checkPerm(PERM.PERM_EDIT_PROBLEM_SOLUTION); + @param('psid', Types.ObjectID) + async postEditSolution(domainId: string, content: string, psid: ObjectID) { + let psdoc = await solution.get(domainId, psid); + if (psdoc.owner !== this.user._id) this.checkPerm(PERM.PERM_EDIT_PROBLEM_SOLUTION); else this.checkPerm(PERM.PERM_EDIT_PROBLEM_SOLUTION_SELF); - const psdoc = await solution.edit(domainId, this.psdoc.docId, content); + psdoc = await solution.edit(domainId, this.psdoc.docId, content); this.back({ psdoc }); } - async postDeleteSolution({ domainId }) { - if (this.psdoc.owner !== this.user._id) this.checkPerm(PERM.PERM_DELETE_PROBLEM_SOLUTION); + @param('psid', Types.ObjectID) + async postDeleteSolution(domainId: string, psid: ObjectID) { + const psdoc = await solution.get(domainId, psid); + if (psdoc.owner !== this.user._id) this.checkPerm(PERM.PERM_DELETE_PROBLEM_SOLUTION); else this.checkPerm(PERM.PERM_DELETE_PROBLEM_SOLUTION_SELF); - await solution.del(domainId, this.psdoc.docId); + await solution.del(domainId, psdoc.docId); this.back(); } @@ -471,16 +471,16 @@ class ProblemSolutionHandler extends ProblemDetailHandler { this.back(); } - async postUpvote({ domainId }) { - const [psdoc, pssdoc] = await solution.vote(domainId, this.psdoc.docId, this.user._id, 1); - this.response.body = { vote: psdoc.vote, user_vote: pssdoc.vote }; - this.back(); + @param('psid', Types.ObjectID) + async postUpvote(domainId: string, psid: ObjectID) { + const [psdoc, pssdoc] = await solution.vote(domainId, psid, this.user._id, 1); + this.back({ vote: psdoc.vote, user_vote: pssdoc.vote }); } - async postDownvote({ domainId }) { - const [psdoc, pssdoc] = await solution.vote(domainId, this.psdoc.docId, this.user._id, -1); - this.response.body = { vote: psdoc.vote, user_vote: pssdoc.vote }; - this.back(); + @param('psid', Types.ObjectID) + async postDownvote(domainId: string, psid: ObjectID) { + const [psdoc, pssdoc] = await solution.vote(domainId, psid, this.user._id, -1); + this.back({ vote: psdoc.vote, user_vote: pssdoc.vote }); } } diff --git a/hydro/lib/template.ts b/hydro/lib/template.ts index 300655fba..4bbade300 100644 --- a/hydro/lib/template.ts +++ b/hydro/lib/template.ts @@ -1,16 +1,33 @@ +import fs from 'fs'; +import path from 'path'; import nunjucks from 'nunjucks'; import * as markdown from './markdown'; import { STATUS, PERM, PRIV } from '../model/builtin'; import * as misc from './misc'; -function Loader() { } -Loader.prototype.getSource = function getSource(name) { - if (!global.Hydro.template[name]) throw new Error(`Cannot get template ${name}`); - return { - src: global.Hydro.template[name], - path: name, - }; -}; +class Loader extends nunjucks.Loader { + // eslint-disable-next-line class-methods-use-this + getSource(name: string) { + if (!process.env.debug) { + if (!global.Hydro.template[name]) throw new Error(`Cannot get template ${name}`); + return { + src: global.Hydro.template[name], + path: name, + noCache: false, + }; + } + let fullpath = null; + const base = path.join(process.cwd(), 'templates'); + const p = path.resolve(base, name); + if (fs.existsSync(p)) fullpath = p; + if (!fullpath) throw new Error(`Cannot get template ${name}`); + return { + src: fs.readFileSync(fullpath, 'utf-8'), + path: fullpath, + noCache: true, + }; + } +} class Nunjucks extends nunjucks.Environment { constructor() { diff --git a/hydro/loader.ts b/hydro/loader.ts index fbec6e861..4aa734de9 100644 --- a/hydro/loader.ts +++ b/hydro/loader.ts @@ -4,7 +4,9 @@ import './interface'; import cluster from 'cluster'; -import { argv } from 'yargs'; +import parse from 'yargs-parser'; + +const argv = parse(process.argv.slice(2)); global.Hydro = { stat: { reqCount: 0 }, @@ -25,7 +27,10 @@ global.Hydro = { }; global.onDestory = []; -if (argv.debug) console.log(process.argv); +if (argv.debug) { + console.log(process.argv); + process.env.debug = 'enable'; +} async function terminate() { for (const task of global.onDestory) { diff --git a/hydro/model/contest.ts b/hydro/model/contest.ts index 8a402bcca..ae9894377 100644 --- a/hydro/model/contest.ts +++ b/hydro/model/contest.ts @@ -51,7 +51,7 @@ const acm = { if (!j.accept) naccept[j.pid]++; } function _time(jdoc) { - const real = jdoc.rid.generationTime - Math.floor(tdoc.begin_at / 1000); + const real = jdoc.rid.generationTime - Math.floor(tdoc.beginAt / 1000); const penalty = 20 * 60 * naccept[jdoc.pid]; return real + penalty; } @@ -73,23 +73,27 @@ const acm = { { type: 'solved_problems', value: _('Solved Problems') }, ]; if (isExport) { - columns.push({ type: 'total_time', value: _('Total Time (Seconds)') }); - columns.push({ type: 'total_time_str', value: _('Total Time') }); + columns.push( + { type: 'total_time', value: _('Total Time (Seconds)') }, + { type: 'total_time_str', value: _('Total Time') }, + ); } for (const i in tdoc.pids) { if (isExport) { - columns.push({ - type: 'problem_flag', - value: '#{0} {1}'.format(i + 1, pdict[tdoc.pids[i]].title), - }); - columns.push({ - type: 'problem_time', - value: '#{0} {1}'.format(i + 1, _('Time (Seconds)')), - }); - columns.push({ - type: 'problem_time_str', - value: '#{0} {1}'.format(i + 1, _('Time')), - }); + columns.push( + { + type: 'problem_flag', + value: '#{0} {1}'.format(i + 1, pdict[tdoc.pids[i]].title), + }, + { + type: 'problem_time', + value: '#{0} {1}'.format(i + 1, _('Time (Seconds)')), + }, + { + type: 'problem_time_str', + value: '#{0} {1}'.format(i + 1, _('Time')), + }, + ); } else { columns.push({ type: 'problem_detail', diff --git a/hydro/model/discussion.ts b/hydro/model/discussion.ts index c37aadf28..4e23b7cd3 100644 --- a/hydro/model/discussion.ts +++ b/hydro/model/discussion.ts @@ -15,7 +15,7 @@ export const typeDisplay = { }; export function add( - domainId: string, parentType: number, parentId: ObjectID, + domainId: string, parentType: number, parentId: ObjectID | number | string, owner: number, title: string, content: string, ip: string | null = null, highlight: boolean = false, ) { diff --git a/hydro/model/task.ts b/hydro/model/task.ts index 8c8f5b79b..fa237f5ec 100644 --- a/hydro/model/task.ts +++ b/hydro/model/task.ts @@ -28,20 +28,19 @@ export function del(_id: ObjectID) { export async function getFirst(query: any) { const q = { ...query }; q.executeAfter = q.executeAfter || { $lt: new Date().getTime() }; - const res = await coll.find(q).sort('_id', 1).limit(1).toArray(); - if (res.length) { - await coll.deleteOne({ _id: res[0]._id }); - if (res[0].interval) { + const res = await coll.findOneAndDelete(q); + if (res.value) { + if (res.value.interval) { await coll.insertOne({ - ...res[0], executeAfter: moment().add(...res[0].interval).toDate(), + ...res.value, executeAfter: moment().add(...res.value.interval).toDate(), }); } - return res[0]; + return res.value; } return null; } -export async function consume(query, cb: Function) { +export async function consume(query: any, cb: Function) { let isRunning = false; const interval = setInterval(async () => { if (isRunning) return; diff --git a/package.json b/package.json index d0ddd6ea9..2d36f0e10 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,7 @@ "superagent": "^5.2.2", "superagent-proxy": "^2.0.0", "systeminformation": "^4.26.5", - "yargs": "^15.4.0" + "yargs-parser": "^18.1.3" }, "devDependencies": { "@types/adm-zip": "^0.4.33", @@ -45,7 +45,7 @@ "@types/lodash": "^4.14.157", "@types/markdown-it": "^10.0.1", "@types/mongodb": "^3.5.25", - "@types/node": "^14.0.21", + "@types/node": "^14.0.22", "@types/nodemailer": "^6.4.0", "@types/nunjucks": "^3.1.3", "@types/prismjs": "^1.16.1", @@ -55,21 +55,21 @@ "@types/yargs": "^15.0.5", "@typescript-eslint/eslint-plugin": "^3.6.0", "@typescript-eslint/parser": "^3.6.0", + "cache-loader": "^4.1.0", "eslint": "^7.4.0", "eslint-config-airbnb-base": "^14.2.0", "eslint-import-resolver-typescript": "^2.0.0", "eslint-plugin-import": "^2.20.2", "friendly-errors-webpack-plugin": "^1.7.0", "snyk": "^1.354.0", - "ts-node": "^8.10.2", - "tsc": "^1.20150623.0", + "ts-loader": "^8.0.0", "typescript": "^3.9.6", "webpack": "^4.42.1" }, "scripts": { - "build": "tsc && node build/development.js", - "build:development": "tsc && node build/development.js", - "build:production": "tsc && node build/production.js", + "build": "node build --development", + "build:development": "node build --development", + "build:production": "node build --production", "build:all": "cd ui && yarn && yarn build:production && cd .. && yarn && yarn build:production", "start": "ts-node hydro/loader.ts", "pkg": "pkg .", @@ -86,4 +86,4 @@ ] }, "snyk": true -} +} \ No newline at end of file diff --git a/templates/components/comments_discussion.html b/templates/components/comments_discussion.html index 1c1fe87fa..fcefbe302 100644 --- a/templates/components/comments_discussion.html +++ b/templates/components/comments_discussion.html @@ -31,12 +31,12 @@ {% if handler.user.hasPerm(reply_post_perm) %} {% endif %} -{% if doc.owner == handler.state.user._id or handler.user.hasPerm(reply_edit_perm) %} +{% if doc.owner == handler.user._id or handler.user.hasPerm(reply_edit_perm) %} {% endif %} -{% if doc.owner == handler.state.user._id or handler.user.hasPerm(reply_delete_perm) %} +{% if doc.owner == handler.user._id or handler.user.hasPerm(reply_delete_perm) %} @@ -75,7 +75,7 @@
  • - +
    @@ -96,7 +96,7 @@
      - {{ reply(true, udoc) }} + {{ reply(true, handler.user) }}
    diff --git a/templates/components/comments_solution.html b/templates/components/comments_solution.html index 06bc895b7..e1e49238e 100644 --- a/templates/components/comments_solution.html +++ b/templates/components/comments_solution.html @@ -41,7 +41,7 @@
    - {{ user.render_inline(udoc) }} + {{ user.render_inline(handler.user) }}
    @@ -67,7 +67,7 @@
    - {{ user.render_inline(udoc, badge=false) }} + {{ user.render_inline(handler.user, badge=false) }}
    @@ -115,22 +115,22 @@
    {% if handler.user.hasPerm(reply_post_perm) %} {% endif %} {% if doc.owner == handler.state.user._id or handler.user.hasPerm(comment_edit_perm) %} {% endif %} {% if doc.owner == handler.state.user._id or handler.user.hasPerm(comment_delete_perm) %} {% endif %}
    -
    +
    {{ doc['content']|markdown|safe }}
    @@ -160,7 +160,7 @@ {% endif %}
    -
    +
    {{ rdoc['content']|markdown|safe }}
    diff --git a/templates/partials/problem_sidebar.html b/templates/partials/problem_sidebar.html index 08f3fbd01..8bc871602 100644 --- a/templates/partials/problem_sidebar.html +++ b/templates/partials/problem_sidebar.html @@ -1,11 +1,15 @@ {% if tdoc %} {% if tdoc.docType == 60 %} {% include "partials/problem_sidebar_homework.html" %} + {% if not owner_udoc %} {% set owner_udoc = udoc %} + {% endif %} {% include "partials/homework_sidebar.html" %} {% else %} {% include "partials/problem_sidebar_contest.html" %} + {% if not owner_udoc %} {% set owner_udoc = udoc %} + {% endif %} {% include "partials/contest_sidebar.html" %} {% endif %} {% else %} diff --git a/ui/build/config/webpack.js b/ui/build/config/webpack.js index 8ac2eb04a..220624b8f 100644 --- a/ui/build/config/webpack.js +++ b/ui/build/config/webpack.js @@ -27,7 +27,7 @@ export default function (env = {}) { } function babelLoader() { - let cacheDirectory = root('.cache/babel'); + let cacheDirectory = root('../.cache/babel'); try { fs.ensureDirSync(cacheDirectory); } catch (ignored) { @@ -173,7 +173,7 @@ export default function (env = {}) { patterns: [ { from: root('static') }, { from: root('node_modules/emojify.js/dist/images/basic'), to: 'img/emoji/' }, - ] + ], }), // Options are provided by LoaderOptionsPlugin until webpack#3136 is fixed diff --git a/yarn.lock b/yarn.lock index a2a42768e..13b2a0fa1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -23,14 +23,6 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/runtime-corejs3@^7.8.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.10.4.tgz#f29fc1990307c4c57b10dbd6ce667b27159d9e0d" - integrity sha512-BFlgP2SoLO9HJX9WBwN67gHWMBhDX/eDz64Jajd6mR/UAUzqrNMm99d4qHnVaKscAElZoFiPv+JpR/Siud5lXw== - dependencies: - core-js-pure "^3.0.0" - regenerator-runtime "^0.13.4" - "@hydrooj/markdown-it-katex@^2.1.1": version "2.1.1" resolved "https://registry.yarnpkg.com/@hydrooj/markdown-it-katex/-/markdown-it-katex-2.1.1.tgz#0b656483b912593e2a927360592462770e329f25" @@ -435,7 +427,7 @@ resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-3.12.5.tgz#136d5e6a57a931e1cce6f9d8126aa98a9c92a6bb" integrity sha512-JCcp6J0GV66Y4ZMDAQCXot4xprYB+Zfd3meK9+INSJeVZwJmHAW30BBEEkPzXswMXuiyReUGOP3GxrADc9wPww== -"@types/json-schema@^7.0.3": +"@types/json-schema@^7.0.3", "@types/json-schema@^7.0.4": version "7.0.5" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.5.tgz#dcce4430e64b443ba8945f0290fb564ad5bac6dd" integrity sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ== @@ -557,10 +549,10 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-13.13.12.tgz#9c72e865380a7dc99999ea0ef20fc9635b503d20" integrity sha512-zWz/8NEPxoXNT9YyF2osqyA9WjssZukYpgI4UYZpOjcyqwIUqWGkcCionaEb9Ki+FULyPyvNFpg/329Kd2/pbw== -"@types/node@^14.0.21": - version "14.0.21" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.0.21.tgz#c84005e3f43b7e19a7374d47d5c411039da59231" - integrity sha512-kmfWRnh81BrOfQ2Bn3xXCkoB6PLNsJlHhliYvkPa5UL6nmMHkANm358zVpO7TW6CDe9i267pkS/Id65OKL8+Ug== +"@types/node@^14.0.22": + version "14.0.22" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.0.22.tgz#23ea4d88189cec7d58f9e6b66f786b215eb61bdc" + integrity sha512-emeGcJvdiZ4Z3ohbmw93E/64jRzUHAItSHt8nF7M4TGgQTiWqFVGB8KNpLGFmUHmHLvjvBgFwVlqNcq+VuGv9g== "@types/node@^6.14.4", "@types/node@^6.14.7": version "6.14.10" @@ -1033,7 +1025,7 @@ ajv@^6.1.0, ajv@^6.10.2: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^6.10.0: +ajv@^6.10.0, ajv@^6.12.2: version "6.12.3" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.3.tgz#18c5af38a111ddeb4f2697bd78d68abc1cabd706" integrity sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA== @@ -1092,7 +1084,7 @@ ansi-styles@^3.2.0, ansi-styles@^3.2.1: dependencies: color-convert "^1.9.0" -ansi-styles@^4.0.0, ansi-styles@^4.1.0: +ansi-styles@^4.1.0: version "4.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359" integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA== @@ -1141,11 +1133,6 @@ archy@^1.0.0: resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" integrity sha1-+cjBN1fMHde8N5rHeyxipcKGjEA= -arg@^4.1.0: - version "4.1.3" - resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" - integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== - argparse@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" @@ -1478,6 +1465,11 @@ buffer-from@^1.0.0: resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== +buffer-json@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/buffer-json/-/buffer-json-2.0.0.tgz#f73e13b1e42f196fe2fd67d001c7d7107edd7c23" + integrity sha512-+jjPFVqyfF1esi9fvfUs3NqM0pH1ziZ36VP4hmA/y/Ssfo/5w5xHKfTw9BwQjoJ1w/oVtpLomqwUHKdefGyuHw== + buffer-xor@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" @@ -1554,6 +1546,18 @@ cache-content-type@^1.0.0: mime-types "^2.1.18" ylru "^1.2.0" +cache-loader@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/cache-loader/-/cache-loader-4.1.0.tgz#9948cae353aec0a1fcb1eafda2300816ec85387e" + integrity sha512-ftOayxve0PwKzBF/GLsZNC9fJBXl8lkZE3TOsjkboHfVHVkL39iUEs1FO07A33mizmci5Dudt38UZrrYXDtbhw== + dependencies: + buffer-json "^2.0.0" + find-cache-dir "^3.0.0" + loader-utils "^1.2.3" + mkdirp "^0.5.1" + neo-async "^2.6.1" + schema-utils "^2.0.0" + cacheable-lookup@^5.0.3: version "5.0.3" resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-5.0.3.tgz#049fdc59dffdd4fc285e8f4f82936591bd59fec3" @@ -1611,7 +1615,7 @@ chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" -chalk@^2.0.0, chalk@^2.4.2: +chalk@^2.0.0, chalk@^2.3.0, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -1755,15 +1759,6 @@ cliui@^3.0.3: strip-ansi "^3.0.1" wrap-ansi "^2.0.0" -cliui@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" - integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^6.2.0" - clone-response@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" @@ -1946,11 +1941,6 @@ copy-descriptor@^0.1.0: resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= -core-js-pure@^3.0.0: - version "3.6.5" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.6.5.tgz#c79e75f5e38dbc85a662d91eea52b8256d53b813" - integrity sha512-lacdXOimsiD0QyNf9BC/mxivNJ/ybBGJXQFKzRekp1WTHoVUWsUHEn+2T8GJAzzIhyOuXA+gOxCVN3l+5PLPUA== - core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" @@ -2072,13 +2062,6 @@ decamelize@^1.1.1, decamelize@^1.2.0: resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= -decamelize@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-3.2.0.tgz#84b8e8f4f8c579f938e35e2cc7024907e0090851" - integrity sha512-4TgkVUsmmu7oCSyGBm5FvfMoACuoh9EOidm7V5/J2X2djAwwt57qb3F2KMP2ITqODTCSwb+YRV+0Zqrv18k/hw== - dependencies: - xregexp "^4.2.4" - decode-uri-component@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" @@ -2357,7 +2340,7 @@ end-of-stream@~1.1.0: dependencies: once "~1.3.0" -enhanced-resolve@^4.1.0: +enhanced-resolve@^4.0.0, enhanced-resolve@^4.1.0: version "4.2.0" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.2.0.tgz#5d43bda4a0fd447cb0ebbe71bef8deff8805ad0d" integrity sha512-S7eiFb/erugyd1rLb6mQ3Vuq+EXHv5cpCkNqqIkYkBgN2QdFnyCZzFBleqwGEx4lgNGYij81BWnCrFNK7vxvjQ== @@ -2829,6 +2812,15 @@ find-cache-dir@^2.1.0: make-dir "^2.0.0" pkg-dir "^3.0.0" +find-cache-dir@^3.0.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.1.tgz#89b33fad4a4670daa94f855f7fbe31d6d84fe880" + integrity sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ== + dependencies: + commondir "^1.0.1" + make-dir "^3.0.2" + pkg-dir "^4.1.0" + find-up@^2.0.0, find-up@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" @@ -2843,7 +2835,7 @@ find-up@^3.0.0: dependencies: locate-path "^3.0.0" -find-up@^4.1.0: +find-up@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== @@ -2984,11 +2976,6 @@ functional-red-black-tree@^1.0.1: resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= -get-caller-file@^2.0.1: - version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - get-stream@^4.0.0, get-stream@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" @@ -3969,7 +3956,7 @@ loader-runner@^2.4.0: resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== -loader-utils@^1.2.3: +loader-utils@^1.0.2, loader-utils@^1.2.3: version "1.4.0" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA== @@ -4191,18 +4178,13 @@ make-dir@^2.0.0: pify "^4.0.1" semver "^5.6.0" -make-dir@^3.0.0: +make-dir@^3.0.0, make-dir@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== dependencies: semver "^6.0.0" -make-error@^1.1.1: - version "1.3.6" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" - integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== - map-cache@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" @@ -4325,7 +4307,7 @@ micromatch@^3.1.10, micromatch@^3.1.4: snapdragon "^0.8.1" to-regex "^3.0.2" -micromatch@^4.0.2: +micromatch@^4.0.0, micromatch@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259" integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q== @@ -5101,6 +5083,13 @@ pkg-dir@^3.0.0: dependencies: find-up "^3.0.0" +pkg-dir@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + pluralize@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" @@ -5388,11 +5377,6 @@ readdirp@~3.4.0: dependencies: picomatch "^2.2.1" -regenerator-runtime@^0.13.4: - version "0.13.5" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz#d878a1d094b4306d10b9096484b33ebd55e26697" - integrity sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA== - regex-not@^1.0.0, regex-not@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" @@ -5435,16 +5419,6 @@ repeat-string@^1.6.1: resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= - -require-main-filename@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" - integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== - require_optional@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/require_optional/-/require_optional-1.0.1.tgz#4cf35a4247f64ca3df8c2ef208cc494b1ca8fc2e" @@ -5608,6 +5582,15 @@ schema-utils@^1.0.0: ajv-errors "^1.0.0" ajv-keywords "^3.1.0" +schema-utils@^2.0.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.0.tgz#17151f76d8eae67fbbf77960c33c676ad9f4efc7" + integrity sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A== + dependencies: + "@types/json-schema" "^7.0.4" + ajv "^6.12.2" + ajv-keywords "^3.4.1" + secure-keys@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/secure-keys/-/secure-keys-1.0.0.tgz#f0c82d98a3b139a8776a8808050b824431087fca" @@ -5647,11 +5630,6 @@ serialize-javascript@^3.1.0: dependencies: randombytes "^2.1.0" -set-blocking@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= - set-immediate-shim@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" @@ -6109,7 +6087,7 @@ source-map-resolve@^0.5.0: source-map-url "^0.4.0" urix "^0.1.0" -source-map-support@^0.5.11, source-map-support@^0.5.17, source-map-support@^0.5.19, source-map-support@^0.5.7, source-map-support@~0.5.12: +source-map-support@^0.5.11, source-map-support@^0.5.19, source-map-support@^0.5.7, source-map-support@~0.5.12: version "0.5.19" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== @@ -6307,7 +6285,7 @@ string-width@^3.0.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" -string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0: +string-width@^4.0.0, string-width@^4.1.0: version "4.2.0" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== @@ -6676,21 +6654,16 @@ 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-node@^8.10.2: - version "8.10.2" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-8.10.2.tgz#eee03764633b1234ddd37f8db9ec10b75ec7fb8d" - integrity sha512-ISJJGgkIpDdBhWVu3jufsWpK3Rzo7bdiIXJjQc0ynKxVOVcg2oIrf2H2cejminGrptVc6q6/uynAHNCuWGbpVA== +ts-loader@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-8.0.0.tgz#faf4b1617dcc4a24c2925d92c5b19e9c6621064d" + integrity sha512-giEW167rtK1V6eX/DnXEtOgcawwoIp6hqznqYNNSmraUZOq36zMhwBq12JMlYhxf50BC58bscsTSKKtE42zAuw== dependencies: - arg "^4.1.0" - diff "^4.0.1" - make-error "^1.1.1" - source-map-support "^0.5.17" - yn "3.1.1" - -tsc@^1.20150623.0: - version "1.20150623.0" - resolved "https://registry.yarnpkg.com/tsc/-/tsc-1.20150623.0.tgz#4ebc3c774e169148cbc768a7342533f082c7a6e5" - integrity sha1-Trw8d04WkUjLx2inNCUz8ILHpuU= + chalk "^2.3.0" + enhanced-resolve "^4.0.0" + loader-utils "^1.0.2" + micromatch "^4.0.0" + semver "^6.0.0" tsconfig-paths@^3.9.0: version "3.9.0" @@ -7031,11 +7004,6 @@ websocket-extensions@>=0.1.1: resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== -which-module@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= - which@^1.2.9: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" @@ -7098,15 +7066,6 @@ wrap-ansi@^5.1.0: string-width "^3.0.0" strip-ansi "^5.0.0" -wrap-ansi@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" - integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" @@ -7152,13 +7111,6 @@ xregexp@2.0.0: resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-2.0.0.tgz#52a63e56ca0b84a7f3a5f3d61872f126ad7a5943" integrity sha1-UqY+VsoLhKfzpfPWGHLxJq16WUM= -xregexp@^4.2.4: - version "4.3.0" - resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-4.3.0.tgz#7e92e73d9174a99a59743f67a4ce879a04b5ae50" - integrity sha512-7jXDIFXh5yJ/orPn4SXjuVrWWoi4Cr8jfV1eHv9CixKSbU+jY4mxfrBwAuDvupPNKpMUY+FeIqsVw/JLT9+B8g== - dependencies: - "@babel/runtime-corejs3" "^7.8.3" - xtend@^4.0.0, xtend@~4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" @@ -7189,7 +7141,7 @@ yaml@^1.9.2: resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.0.tgz#3b593add944876077d4d683fee01081bd9fff31e" integrity sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg== -yargs-parser@^18.1.2: +yargs-parser@^18.1.3: version "18.1.3" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== @@ -7197,23 +7149,6 @@ yargs-parser@^18.1.2: camelcase "^5.0.0" decamelize "^1.2.0" -yargs@^15.4.0: - version "15.4.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.0.tgz#53949fb768309bac1843de9b17b80051e9805ec2" - integrity sha512-D3fRFnZwLWp8jVAAhPZBsmeIHY8tTsb8ItV9KaAaopmC6wde2u6Yw29JBIZHXw14kgkRnYmDgmQU4FVMDlIsWw== - dependencies: - cliui "^6.0.0" - decamelize "^3.2.0" - find-up "^4.1.0" - get-caller-file "^2.0.1" - require-directory "^2.1.1" - require-main-filename "^2.0.0" - set-blocking "^2.0.0" - string-width "^4.2.0" - which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^18.1.2" - yargs@^3.19.0: version "3.32.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.32.0.tgz#03088e9ebf9e756b69751611d2a5ef591482c995" @@ -7231,8 +7166,3 @@ ylru@^1.2.0: version "1.2.1" resolved "https://registry.yarnpkg.com/ylru/-/ylru-1.2.1.tgz#f576b63341547989c1de7ba288760923b27fe84f" integrity sha512-faQrqNMzcPCHGVC2aaOINk13K+aaBDUPjGWl0teOXywElLjyVAB6Oe2jj62jHYtwsU49jXhScYbvPENK+6zAvQ== - -yn@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" - integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==