mirror of
https://gitcode.com/gh_mirrors/hy/Hydro.git
synced 2026-10-17 09:36:08 +08:00
简化模块加载
deprecated hydro-build
This commit is contained in:
1 parent
8aef05a375
commit
8f6968bbbd
41 files changed
+1361
-1957
No files matched your search
@@ -15,8 +15,8 @@ jobs:
|
||||
- run: cd ui && yarn && yarn build:production && cd ..
|
||||
- uses: actions/upload-artifact@v1
|
||||
with:
|
||||
name: .uibuild
|
||||
path: .uibuild
|
||||
name: uibuild
|
||||
path: public
|
||||
- run: |
|
||||
yarn
|
||||
yarn build:production
|
||||
@@ -26,12 +26,8 @@ jobs:
|
||||
path: .build/app.js
|
||||
- uses: actions/upload-artifact@v1
|
||||
with:
|
||||
name: install.js
|
||||
path: .build/install.js
|
||||
- uses: actions/upload-artifact@v1
|
||||
with:
|
||||
name: module
|
||||
path: .build/module
|
||||
name: builtin.hydro
|
||||
path: .build/builtin.hydro
|
||||
- uses: elgohr/Publish-Docker-Github-Action@master
|
||||
with:
|
||||
name: hydrooj/hydro:alpine
|
||||
|
||||
+1
-1
@@ -3,7 +3,7 @@ config.yaml
|
||||
config.json
|
||||
.build/
|
||||
*.build
|
||||
.uibuild/
|
||||
public/
|
||||
dist/
|
||||
.cache/
|
||||
*.cache
|
||||
|
||||
+1
-1
@@ -4,7 +4,7 @@ docker-compose.yml
|
||||
Dockerfile
|
||||
.vscode
|
||||
.github
|
||||
.uibuild
|
||||
public/
|
||||
templates
|
||||
ui
|
||||
locales
|
||||
|
||||
@@ -1,108 +0,0 @@
|
||||
/* eslint-disable import/no-dynamic-require */
|
||||
/* eslint-disable import/no-extraneous-dependencies */
|
||||
/* eslint-disable no-await-in-loop */
|
||||
const fs = require('fs');
|
||||
const zlib = require('zlib');
|
||||
const webpack = require('webpack');
|
||||
const yaml = require('js-yaml');
|
||||
const FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin');
|
||||
const { root, exist } = require('./utils');
|
||||
const template = require('./template');
|
||||
|
||||
const prepare = ['model', 'lib', 'handler', 'service', 'script'];
|
||||
|
||||
const build = async (type) => {
|
||||
const modules = fs.readdirSync(root('module'));
|
||||
const failed = [];
|
||||
const config = {
|
||||
mode: type,
|
||||
entry: {},
|
||||
output: {
|
||||
filename: 'module/[name].js',
|
||||
path: root('.build'),
|
||||
},
|
||||
target: 'node',
|
||||
module: {},
|
||||
plugins: [
|
||||
new webpack.ProgressPlugin(),
|
||||
new FriendlyErrorsPlugin({
|
||||
clearConsole: false,
|
||||
}),
|
||||
],
|
||||
};
|
||||
for (const i of modules) {
|
||||
if (!i.startsWith('.')) {
|
||||
try {
|
||||
if (exist(`module/${i}/build.js`)) {
|
||||
const builder = require(root(`module/${i}/build.js`));
|
||||
if (builder.prebuild) await builder.prebuild();
|
||||
}
|
||||
for (const j of prepare) {
|
||||
if (exist(`module/${i}/${j}.js`)) {
|
||||
config.entry[`${i}/${j}`] = root(`module/${i}/${j}.js`);
|
||||
}
|
||||
}
|
||||
} catch (e) {
|
||||
console.error(`Module build fail: ${i}`);
|
||||
console.error(e);
|
||||
failed.push(i);
|
||||
}
|
||||
}
|
||||
}
|
||||
const compiler = webpack(config);
|
||||
await new Promise((resolve, reject) => {
|
||||
compiler.run((err, stats) => {
|
||||
if (err) {
|
||||
console.error(err.stack || err);
|
||||
if (err.details) console.error(err.details);
|
||||
reject();
|
||||
}
|
||||
if (stats.hasErrors()) process.exitCode = 1;
|
||||
resolve();
|
||||
});
|
||||
});
|
||||
for (const i of modules) {
|
||||
if (!i.startsWith('.') && !failed.includes(i)) {
|
||||
try {
|
||||
const current = {};
|
||||
for (const j of prepare) {
|
||||
if (exist(`module/${i}/${j}.js`)) {
|
||||
current[j] = fs.readFileSync(root(`.build/module/${i}/${j}.js`)).toString();
|
||||
}
|
||||
}
|
||||
if (exist(`module/${i}/locale`)) {
|
||||
const locales = fs.readdirSync(root(`module/${i}/locale`));
|
||||
const lang = {};
|
||||
for (const j of locales) {
|
||||
const content = fs.readFileSync(root(`module/${i}/locale/${j}`)).toString();
|
||||
lang[j.split('.')[0]] = yaml.safeLoad(content);
|
||||
}
|
||||
current.locale = lang;
|
||||
}
|
||||
if (exist(`module/${i}/template`)) {
|
||||
current.template = template(`module/${i}/template`);
|
||||
}
|
||||
if (exist(`module/${i}/file`)) {
|
||||
const files = fs.readdirSync(root(`module/${i}/file`));
|
||||
current.file = {};
|
||||
for (const file of files) {
|
||||
current.file[file] = fs.readFileSync(root(`module/${i}/file/${file}`)).toString('base64');
|
||||
}
|
||||
}
|
||||
const m = require(root(`module/${i}/hydro.json`));
|
||||
current.description = m.description || '';
|
||||
current.requirements = m.requirements || [];
|
||||
current.version = m.version || 'unknown';
|
||||
current.id = m.id;
|
||||
if (m.os) current.os = m.os;
|
||||
const data = zlib.gzipSync(Buffer.from(yaml.safeDump(current)), { level: -1 });
|
||||
fs.writeFileSync(root(`.build/module/${i}.hydro`), data);
|
||||
} catch (e) {
|
||||
console.error(`Module build fail: ${i}`);
|
||||
console.error(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
module.exports = build;
|
||||
+5
-76
@@ -1,88 +1,17 @@
|
||||
/* eslint-disable no-await-in-loop */
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
const zlib = require('zlib');
|
||||
const yaml = require('js-yaml');
|
||||
const fs = require('fs-extra');
|
||||
const argv = require('yargs-parser')(process.argv.slice(2));
|
||||
const { root, ignoreFailure, rmdir } = require('./utils');
|
||||
const template = require('./template');
|
||||
const hack = require('./hack');
|
||||
const wikiBuild = require('./wiki');
|
||||
|
||||
const fsp = fs.promises;
|
||||
|
||||
function getFiles(folder) {
|
||||
const res = [];
|
||||
const files = fs.readdirSync(root(folder));
|
||||
for (const filename of files) {
|
||||
res.push(filename);
|
||||
if (fs.statSync(root(path.join(folder, filename))).isDirectory()) {
|
||||
res.push(...(getFiles(path.join(folder, filename)).map((i) => path.join(filename, i))));
|
||||
}
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
async function build(type) {
|
||||
if (!['development', 'production'].includes(type)) throw new Error(`Unknown type: ${type}`);
|
||||
ignoreFailure(fs.mkdirSync, root('.build'));
|
||||
ignoreFailure(fs.mkdirSync, root('.build/module'));
|
||||
|
||||
for (const task in hack) {
|
||||
hack[task]();
|
||||
}
|
||||
|
||||
const langs = fs.readdirSync(root('locales'));
|
||||
const locale = {};
|
||||
for (const i of langs) {
|
||||
const content = fs.readFileSync(root(`locales/${i}`)).toString();
|
||||
locale[i.split('.')[0]] = yaml.safeLoad(content);
|
||||
}
|
||||
const builtin = {
|
||||
id: 'builtin',
|
||||
locale,
|
||||
template: template('templates'),
|
||||
public: {},
|
||||
};
|
||||
const wiki = wikiBuild();
|
||||
builtin.lib = `Object.assign(global.Hydro.wiki,${JSON.stringify(wiki)})`;
|
||||
const files = getFiles('.uibuild');
|
||||
for (const f of files) {
|
||||
if (fs.statSync(root(`.uibuild/${f}`)).isDirectory()) {
|
||||
builtin.public[f] = null;
|
||||
} else {
|
||||
builtin.public[f] = fs.readFileSync(root(`.uibuild/${f}`)).toString('base64');
|
||||
}
|
||||
}
|
||||
const data = zlib.gzipSync(Buffer.from(yaml.safeDump(builtin)), { level: -1 });
|
||||
fs.writeFileSync(root('.build/module/builtin.hydro'), data);
|
||||
console.log('Build::Module');
|
||||
await require('./buildModule')(type);
|
||||
fs.ensureDirSync(path.resolve(__dirname, '..', '.build'));
|
||||
for (const task in hack) hack[task]();
|
||||
console.log('Build::Main');
|
||||
await require('./webpack')(type);
|
||||
const t = fs.readdirSync(root('.build/module'));
|
||||
for (const f of t) {
|
||||
if (fs.statSync(root(`.build/module/${f}`)).isDirectory()) {
|
||||
rmdir(root(`.build/module/${f}`));
|
||||
}
|
||||
}
|
||||
const modules = await fsp.readdir(root('.build/module'));
|
||||
const j = {};
|
||||
for (const m of modules) {
|
||||
try {
|
||||
const d = await fsp.readFile(root(`.build/module/${m}`));
|
||||
j[m] = d.toString('base64');
|
||||
} catch (e) {
|
||||
console.error(`Module pack failed: ${m}`);
|
||||
}
|
||||
}
|
||||
const f = fs.readFileSync(root('.build/app.js')).toString();
|
||||
const installer = fs.readFileSync(root('tool/install.js')).toString();
|
||||
const hydro = {};
|
||||
hydro.app = Buffer.from(f).toString('base64');
|
||||
hydro.modules = j;
|
||||
const d = zlib.gzipSync(Buffer.from(JSON.stringify(hydro)), { level: -1 }).toString('base64');
|
||||
fs.writeFileSync(root('.build/install.js'), `global.Hydro="${d}"; ${installer}`);
|
||||
console.log('Build::Resources');
|
||||
require('./resource')(type);
|
||||
}
|
||||
|
||||
build(argv.development ? 'development' : 'production').catch((e) => {
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
const AdmZip = require('adm-zip');
|
||||
|
||||
function build() {
|
||||
const zip = new AdmZip();
|
||||
zip.addLocalFolder('public', 'public');
|
||||
zip.addLocalFolder('locales', 'locales');
|
||||
zip.addLocalFolder('templates', 'templates');
|
||||
zip.addLocalFolder('wiki', 'wiki');
|
||||
zip.addLocalFile('package.json');
|
||||
zip.writeZip('.build/builtin.hydro');
|
||||
}
|
||||
|
||||
module.exports = build;
|
||||
@@ -1,30 +0,0 @@
|
||||
const fs = require('fs');
|
||||
const { root } = require('./utils');
|
||||
|
||||
function getFiles(folder) {
|
||||
const files = [];
|
||||
const f = fs.readdirSync(root(folder));
|
||||
for (const i of f) {
|
||||
if (!i.startsWith('.')) {
|
||||
if (fs.statSync(root(`${folder}/${i}`)).isDirectory()) {
|
||||
const g = getFiles(`${folder}/${i}`);
|
||||
for (const j of g) files.push(`${i}/${j}`);
|
||||
} else files.push(i);
|
||||
}
|
||||
}
|
||||
return files;
|
||||
}
|
||||
|
||||
const build = (dirOrObject) => {
|
||||
let templates = {};
|
||||
if (typeof dirOrObject === 'string') {
|
||||
const files = getFiles(dirOrObject);
|
||||
for (const i of files) {
|
||||
const template = fs.readFileSync(root(`${dirOrObject}/${i}`)).toString();
|
||||
templates[i] = template;
|
||||
}
|
||||
} else templates = dirOrObject;
|
||||
return templates;
|
||||
};
|
||||
|
||||
module.exports = build;
|
||||
@@ -1,28 +0,0 @@
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
|
||||
exports.root = (name) => path.resolve(__dirname, '..', name);
|
||||
exports.exist = (name) => {
|
||||
try {
|
||||
fs.statSync(exports.root(name));
|
||||
} catch (e) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
};
|
||||
exports.rmdir = function rmdir(p, recursive = true) {
|
||||
if (!fs.existsSync(p)) return;
|
||||
if (recursive) {
|
||||
fs.readdirSync(p).forEach((file) => {
|
||||
const curPath = `${p}/${file}`;
|
||||
if (fs.statSync(curPath).isDirectory()) rmdir(curPath);
|
||||
else fs.unlinkSync(curPath);
|
||||
});
|
||||
}
|
||||
fs.rmdirSync(p);
|
||||
};
|
||||
exports.ignoreFailure = function ignoreFailure(func, ...params) {
|
||||
try {
|
||||
func(...params);
|
||||
} catch (e) { } // eslint-disable-line no-empty
|
||||
};
|
||||
+2
-3
@@ -2,17 +2,16 @@
|
||||
const path = require('path');
|
||||
const webpack = require('webpack');
|
||||
const FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin');
|
||||
const { root } = require('./utils');
|
||||
|
||||
const build = async (type) => {
|
||||
const config = {
|
||||
mode: type,
|
||||
entry: {
|
||||
app: root('hydro/loader.ts'),
|
||||
app: path.resolve(__dirname, '..', 'hydro', 'loader.ts'),
|
||||
},
|
||||
output: {
|
||||
filename: '[name].js',
|
||||
path: root('.build'),
|
||||
path: path.resolve(__dirname, '..', '.build'),
|
||||
},
|
||||
target: 'node',
|
||||
module: {
|
||||
|
||||
@@ -1,31 +0,0 @@
|
||||
const fs = require('fs');
|
||||
const { root } = require('./utils');
|
||||
|
||||
module.exports = () => {
|
||||
const categories = fs.readdirSync(root('wiki'));
|
||||
const r = {};
|
||||
for (const category of categories) {
|
||||
const pages = fs.readdirSync(root(`wiki/${category}`));
|
||||
const res = {};
|
||||
for (const page of pages) {
|
||||
const c = fs.readFileSync(root(`wiki/${category}/${page}`)).toString().split('\n');
|
||||
const pagename = page.split('.')[0];
|
||||
res[pagename] = [];
|
||||
let content = null;
|
||||
for (let i = 0; i < c.length; i++) {
|
||||
const line = c[i];
|
||||
if (line.startsWith('# ')) {
|
||||
if (content) res[pagename].push(content);
|
||||
content = {};
|
||||
const t = line.split('# ')[1].split('|');
|
||||
[content.title, content.id] = t.map((q) => q.trim());
|
||||
content.content = '';
|
||||
} else {
|
||||
content.content = `${content.content}${line}\n`;
|
||||
}
|
||||
}
|
||||
}
|
||||
r[category] = res;
|
||||
}
|
||||
return r;
|
||||
};
|
||||
+79
-17
@@ -2,6 +2,7 @@
|
||||
/* eslint-disable no-eval */
|
||||
import os from 'os';
|
||||
import fs from 'fs';
|
||||
import path from 'path';
|
||||
import yaml from 'js-yaml';
|
||||
|
||||
export const builtinLib = [
|
||||
@@ -29,9 +30,22 @@ export const builtinScript = [
|
||||
'blacklist', 'setSuperadmin', 'deleteUser',
|
||||
];
|
||||
|
||||
function getFiles(folder, base = '') {
|
||||
const files = [];
|
||||
const f = fs.readdirSync(folder);
|
||||
for (const i of f) {
|
||||
if (!i.startsWith('.')) {
|
||||
if (fs.statSync(path.join(folder, i)).isDirectory()) {
|
||||
files.push(...getFiles(path.join(folder, i), path.join(base, i)));
|
||||
} else files.push(path.join(base, i));
|
||||
}
|
||||
}
|
||||
return files;
|
||||
}
|
||||
|
||||
export async function handler(pending, fail) {
|
||||
for (const i of pending) {
|
||||
const p = `${os.tmpdir()}/hydro/tmp/${i}/handler.js`;
|
||||
const p = path.resolve(i, 'handler.js');
|
||||
if (fs.existsSync(p) && !fail.includes(i)) {
|
||||
try {
|
||||
console.log(`Handler init: ${i}`);
|
||||
@@ -48,10 +62,17 @@ export async function handler(pending, fail) {
|
||||
|
||||
export async function locale(pending, fail) {
|
||||
for (const i of pending) {
|
||||
const p = `${os.tmpdir()}/hydro/tmp/${i}/locale.json`;
|
||||
if (fs.existsSync(p) && !fail.includes(i)) {
|
||||
let p = path.resolve(i, 'locales');
|
||||
if (!fs.existsSync(p)) p = path.resolve(i, 'locale');
|
||||
if (fs.existsSync(p) && fs.statSync(p).isDirectory() && !fail.includes(i)) {
|
||||
try {
|
||||
global.Hydro.lib.i18n(eval('require')(p));
|
||||
const files = fs.readdirSync(p);
|
||||
const locales = {};
|
||||
for (const file of files) {
|
||||
const content = fs.readFileSync(path.resolve(p, file)).toString();
|
||||
locales[file.split('.')[0]] = yaml.safeLoad(content);
|
||||
}
|
||||
global.Hydro.lib.i18n(locales);
|
||||
console.log(`Locale init: ${i}`);
|
||||
} catch (e) {
|
||||
fail.push(i);
|
||||
@@ -61,22 +82,19 @@ export async function locale(pending, fail) {
|
||||
}
|
||||
}
|
||||
|
||||
export async function setting(pending, fail, modelSetting, modelSystem = null) {
|
||||
export async function setting(pending, fail, modelSetting: typeof import('../model/setting')) {
|
||||
const map = {
|
||||
system: modelSetting.SystemSetting,
|
||||
account: modelSetting.AccountSetting,
|
||||
preference: modelSetting.PreferenceSetting,
|
||||
};
|
||||
for (const i of pending) {
|
||||
const p = `${os.tmpdir()}/hydro/tmp/${i}/setting.yaml`;
|
||||
let p = path.resolve(i, 'setting.yaml');
|
||||
if (!fs.existsSync(p)) p = path.resolve(i, 'settings.yaml');
|
||||
if (fs.existsSync(p) && !fail.includes(i)) {
|
||||
try {
|
||||
const cfg: any = yaml.safeLoad(fs.readFileSync(p).toString());
|
||||
for (const key in cfg) {
|
||||
if (cfg[key].default && modelSystem) {
|
||||
const current = await modelSystem.get(`${i}.${key}`);
|
||||
if (!current) await modelSystem.set(`${i}.${key}`, cfg[key].default);
|
||||
}
|
||||
map[cfg[key].category || 'system'](
|
||||
modelSetting.Setting(
|
||||
i, `${i}.${key}`, cfg[key].range, cfg[key].default,
|
||||
@@ -93,10 +111,14 @@ export async function setting(pending, fail, modelSetting, modelSystem = null) {
|
||||
|
||||
export async function template(pending, fail) {
|
||||
for (const i of pending) {
|
||||
const p = `${os.tmpdir()}/hydro/tmp/${i}/template.json`;
|
||||
if (fs.existsSync(p) && !fail.includes(i)) {
|
||||
let p = path.resolve(i, 'templates');
|
||||
if (!fs.existsSync(p)) p = path.resolve(i, 'template');
|
||||
if (fs.existsSync(p) && fs.statSync(p).isDirectory() && !fail.includes(i)) {
|
||||
try {
|
||||
Object.assign(global.Hydro.template, eval('require')(p));
|
||||
const files = getFiles(p);
|
||||
for (const file of files) {
|
||||
global.Hydro.template[file] = fs.readFileSync(path.resolve(p, file)).toString();
|
||||
}
|
||||
console.log(`Template init: ${i}`);
|
||||
} catch (e) {
|
||||
fail.push(i);
|
||||
@@ -108,7 +130,7 @@ export async function template(pending, fail) {
|
||||
|
||||
export async function model(pending, fail) {
|
||||
for (const i of pending) {
|
||||
const p = `${os.tmpdir()}/hydro/tmp/${i}/model.js`;
|
||||
const p = path.resolve(i, 'model.js');
|
||||
if (fs.existsSync(p) && !fail.includes(i)) {
|
||||
try {
|
||||
console.log(`Model init: ${i}`);
|
||||
@@ -125,7 +147,7 @@ export async function model(pending, fail) {
|
||||
|
||||
export async function lib(pending, fail) {
|
||||
for (const i of pending) {
|
||||
const p = `${os.tmpdir()}/hydro/tmp/${i}/lib.js`;
|
||||
const p = path.resolve(i, 'lib.js');
|
||||
if (fs.existsSync(p) && !fail.includes(i)) {
|
||||
try {
|
||||
console.log(`Lib init: ${i}`);
|
||||
@@ -143,7 +165,7 @@ export async function lib(pending, fail) {
|
||||
|
||||
export async function service(pending, fail) {
|
||||
for (const i of pending) {
|
||||
const p = `${os.tmpdir()}/hydro/tmp/${i}/service.js`;
|
||||
const p = path.resolve(i, 'service.js');
|
||||
if (fs.existsSync(p) && !fail.includes(i)) {
|
||||
try {
|
||||
console.log(`Service init: ${i}`);
|
||||
@@ -161,7 +183,7 @@ export async function service(pending, fail) {
|
||||
|
||||
export async function script(pending, fail, active) {
|
||||
for (const i of pending) {
|
||||
const p = `${os.tmpdir()}/hydro/tmp/${i}/script.js`;
|
||||
const p = path.resolve(i, 'script.js');
|
||||
if (fs.existsSync(p) && !fail.includes(i)) {
|
||||
try {
|
||||
console.time(`Script init: ${i}`);
|
||||
@@ -176,3 +198,43 @@ export async function script(pending, fail, active) {
|
||||
active.push(i);
|
||||
}
|
||||
}
|
||||
|
||||
export async function wiki(pending, fail) {
|
||||
for (const i of pending) {
|
||||
const p = path.resolve(i, 'wiki');
|
||||
if (fs.existsSync(p) && fs.statSync(p).isDirectory() && !fail.includes(i)) {
|
||||
try {
|
||||
const r = {};
|
||||
const categories = fs.readdirSync(p);
|
||||
for (const category of categories) {
|
||||
if (!fs.statSync(p).isDirectory()) return;
|
||||
const pages = fs.readdirSync(path.join(p, category));
|
||||
const res = {};
|
||||
for (const page of pages) {
|
||||
const c = fs.readFileSync(path.join(p, category, page)).toString().split('\n');
|
||||
const pagename = page.split('.')[0];
|
||||
res[pagename] = [];
|
||||
let content = null;
|
||||
for (let j = 0; j < c.length; j++) {
|
||||
const line = c[j];
|
||||
if (line.startsWith('# ')) {
|
||||
if (content) res[pagename].push(content);
|
||||
content = {};
|
||||
const t = line.split('# ')[1].split('|');
|
||||
[content.title, content.id] = t.map((q) => q.trim());
|
||||
content.content = '';
|
||||
} else {
|
||||
content.content = `${content.content}${line}\n`;
|
||||
}
|
||||
}
|
||||
}
|
||||
r[category] = res;
|
||||
}
|
||||
console.log(`Wiki init: ${i}`);
|
||||
} catch (e) {
|
||||
fail.push(i);
|
||||
console.error(`Wiki Load Fail: ${i}`);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -12,10 +12,9 @@ export async function load(call) {
|
||||
require('../utils');
|
||||
require('../error');
|
||||
try {
|
||||
require('../options');
|
||||
require('../options').default();
|
||||
} catch (e) {
|
||||
await call({ entry: 'setup' });
|
||||
require('../options');
|
||||
await call({ entry: 'setup', newProcess: true });
|
||||
}
|
||||
const bus = require('../service/bus');
|
||||
await new Promise((resolve) => {
|
||||
@@ -49,7 +48,7 @@ export async function load(call) {
|
||||
const ins = require('../script/install');
|
||||
await ins.run({ username: 'Root', password: 'rootroot' });
|
||||
}
|
||||
await setting(pending, fail, modelSetting, modelSystem);
|
||||
await setting(pending, fail, modelSetting);
|
||||
for (const i in global.Hydro.service) {
|
||||
if (global.Hydro.service[i].postInit) {
|
||||
try {
|
||||
|
||||
+53
-49
@@ -8,6 +8,9 @@ import Router from 'koa-router';
|
||||
import cache from 'koa-static-cache';
|
||||
import nunjucks from 'nunjucks';
|
||||
import mongodb from 'mongodb';
|
||||
import parse from 'yargs-parser';
|
||||
|
||||
const argv = parse(process.argv.slice(2));
|
||||
|
||||
class Loader {
|
||||
getSource(name: string) { // eslint-disable-line class-methods-use-this
|
||||
@@ -94,7 +97,7 @@ function render(name) {
|
||||
});
|
||||
}
|
||||
|
||||
export async function load() {
|
||||
export function load() {
|
||||
const app = new Koa();
|
||||
const server = http.createServer(app.callback());
|
||||
const router = new Router();
|
||||
@@ -107,55 +110,56 @@ export async function load() {
|
||||
ctx.body = await render('setup.html');
|
||||
ctx.response.type = 'text/html';
|
||||
});
|
||||
const p = new Promise((resolve) => {
|
||||
router.post('/', async (ctx) => {
|
||||
const {
|
||||
const listenPort = argv.port || 8888;
|
||||
router.post('/', async (ctx) => {
|
||||
const {
|
||||
host, port, name, username, password,
|
||||
} = ctx.request.body;
|
||||
let mongourl = 'mongodb://';
|
||||
if (username) mongourl += `${username}:${password}@`;
|
||||
mongourl += `${host}:${port}/${name}`;
|
||||
try {
|
||||
const Database = await mongodb.MongoClient.connect(mongourl, {
|
||||
useNewUrlParser: true, useUnifiedTopology: true,
|
||||
});
|
||||
const db = Database.db(name);
|
||||
await Promise.all([
|
||||
db.collection('system').updateOne(
|
||||
{ _id: 'server.host' },
|
||||
{ $set: { value: ctx.request.host } },
|
||||
{ upsert: true },
|
||||
),
|
||||
db.collection('system').updateOne(
|
||||
{ _id: 'server.hostname' },
|
||||
{ $set: { value: ctx.request.hostname } },
|
||||
{ upsert: true },
|
||||
),
|
||||
db.collection('system').updateOne(
|
||||
{ _id: 'server.url' },
|
||||
{ $set: { value: ctx.request.href } },
|
||||
{ upsert: true },
|
||||
),
|
||||
db.collection('system').updateOne(
|
||||
{ _id: 'server.port' },
|
||||
{ $set: { value: listenPort } },
|
||||
{ upsert: true },
|
||||
),
|
||||
]);
|
||||
fs.writeFileSync(path.resolve(process.cwd(), 'config.json'), JSON.stringify({
|
||||
host, port, name, username, password,
|
||||
} = ctx.request.body;
|
||||
let mongourl = 'mongodb://';
|
||||
if (username) mongourl += `${username}:${password}@`;
|
||||
mongourl += `${host}:${port}/${name}`;
|
||||
try {
|
||||
const Database = await mongodb.MongoClient.connect(mongourl, {
|
||||
useNewUrlParser: true, useUnifiedTopology: true,
|
||||
});
|
||||
const db = Database.db(name);
|
||||
await Promise.all([
|
||||
db.collection('system').updateOne(
|
||||
{ _id: 'server.host' },
|
||||
{ $set: { value: ctx.request.host } },
|
||||
{ upsert: true },
|
||||
),
|
||||
db.collection('system').updateOne(
|
||||
{ _id: 'server.hostname' },
|
||||
{ $set: { value: ctx.request.hostname } },
|
||||
{ upsert: true },
|
||||
),
|
||||
db.collection('system').updateOne(
|
||||
{ _id: 'server.url' },
|
||||
{ $set: { value: ctx.request.href } },
|
||||
{ upsert: true },
|
||||
),
|
||||
]);
|
||||
fs.writeFileSync(path.resolve(process.cwd(), 'config.json'), JSON.stringify({
|
||||
host, port, name, username, password,
|
||||
}));
|
||||
ctx.redirect('/');
|
||||
resolve();
|
||||
} catch (e) {
|
||||
ctx.body = `Error connecting to database: ${e.message}\n${e.stack}`;
|
||||
}
|
||||
});
|
||||
}));
|
||||
ctx.body = `<h1>This page will reload in 3 secs.</h1>
|
||||
<script>
|
||||
setTimeout(function (){
|
||||
window.location.href = '/';
|
||||
}, 3000);
|
||||
</script>`;
|
||||
setTimeout(() => process.exit(0), 500);
|
||||
} catch (e) {
|
||||
ctx.body = `Error connecting to database: ${e.message}\n${e.stack}`;
|
||||
}
|
||||
});
|
||||
app.use(router.routes()).use(router.allowedMethods());
|
||||
server.listen(8888);
|
||||
console.log('Server listening at: 8888');
|
||||
await p;
|
||||
await new Promise((resolve, reject) => {
|
||||
server.close((err) => {
|
||||
if (err) reject(err);
|
||||
else resolve();
|
||||
});
|
||||
});
|
||||
return 'Done! Restarting...';
|
||||
server.listen(listenPort);
|
||||
console.log('Server listening at:', listenPort);
|
||||
}
|
||||
+53
-108
@@ -1,123 +1,68 @@
|
||||
import fs from 'fs';
|
||||
/* eslint-disable no-continue */
|
||||
import os from 'os';
|
||||
import path from 'path';
|
||||
import zlib from 'zlib';
|
||||
import yaml from 'js-yaml';
|
||||
import AdmZip from 'adm-zip';
|
||||
import fs from 'fs-extra';
|
||||
|
||||
function ensureDir(dir) {
|
||||
if (!fs.existsSync(dir)) {
|
||||
fs.mkdirSync(dir);
|
||||
} else if (!fs.statSync(dir).isDirectory()) {
|
||||
fs.unlinkSync(dir);
|
||||
fs.mkdirSync(dir);
|
||||
}
|
||||
}
|
||||
const moduleRoots = Array.from(new Set([
|
||||
path.resolve(process.cwd(), 'node_modules', '@hydrooj'),
|
||||
path.resolve(process.cwd(), 'modules'),
|
||||
path.resolve(process.cwd(), 'module'),
|
||||
path.resolve(process.cwd(), '.build'),
|
||||
process.cwd(),
|
||||
path.resolve(__dirname, 'node_modules', '@hydrooj'),
|
||||
path.resolve(__dirname, 'modules'),
|
||||
path.resolve(__dirname, 'module'),
|
||||
path.resolve(__dirname, '.build'),
|
||||
__dirname,
|
||||
path.resolve(os.homedir(), '.hydro', 'module'),
|
||||
]));
|
||||
|
||||
function root(name) {
|
||||
return path.resolve(process.cwd(), name);
|
||||
}
|
||||
|
||||
const moduleRoots = [
|
||||
root('.build/module'),
|
||||
root('module'),
|
||||
root(path.resolve(os.homedir(), '.hydro', 'module')),
|
||||
root('.'),
|
||||
];
|
||||
let moduleRoot;
|
||||
for (const i of moduleRoots) {
|
||||
if (fs.existsSync(i) && fs.statSync(i).isDirectory()) {
|
||||
moduleRoot = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
const moduleTemp = path.resolve(os.tmpdir(), 'hydro', 'module');
|
||||
const publicTemp = path.resolve(os.tmpdir(), 'hydro', 'public');
|
||||
const tmp = path.resolve(os.tmpdir(), 'hydro', '__');
|
||||
|
||||
export async function load() {
|
||||
process.on('unhandledRejection', (e) => {
|
||||
console.error(e);
|
||||
process.exit(1);
|
||||
});
|
||||
ensureDir(path.resolve(os.tmpdir(), 'hydro'));
|
||||
ensureDir(path.resolve(os.tmpdir(), 'hydro', 'tmp'));
|
||||
ensureDir(path.resolve(os.tmpdir(), 'hydro', 'public'));
|
||||
const files = fs.readdirSync(moduleRoot);
|
||||
const t = ['service', 'lib', 'model', 'handler', 'script'];
|
||||
for (const file of files) {
|
||||
if (file.endsWith('.hydro')) {
|
||||
try {
|
||||
const f = fs.readFileSync(root(`${moduleRoot}/${file}`));
|
||||
const s = fs.statSync(root(`${moduleRoot}/${file}`));
|
||||
const m: any = yaml.safeLoad(zlib.gunzipSync(f).toString());
|
||||
const { id } = m;
|
||||
if (m.os) {
|
||||
if (!m.os.includes(os.platform().toLowerCase())) {
|
||||
console.error(`Module load fail: ${id} ${file.split('.')[0]} Unsupported OS`);
|
||||
// eslint-disable-next-line no-continue
|
||||
continue;
|
||||
}
|
||||
}
|
||||
ensureDir(`${os.tmpdir()}/hydro/tmp/${id}`);
|
||||
if (m.locale) {
|
||||
fs.writeFileSync(
|
||||
`${os.tmpdir()}/hydro/tmp/${id}/locale.json`,
|
||||
JSON.stringify(m.locale),
|
||||
);
|
||||
}
|
||||
if (m.setting) {
|
||||
fs.writeFileSync(
|
||||
`${os.tmpdir()}/hydro/tmp/${id}/setting.yaml`,
|
||||
m.setting,
|
||||
);
|
||||
}
|
||||
if (m.template) {
|
||||
fs.writeFileSync(
|
||||
`${os.tmpdir()}/hydro/tmp/${id}/template.json`,
|
||||
JSON.stringify(m.template),
|
||||
);
|
||||
}
|
||||
for (const i of t) {
|
||||
if (m[i]) {
|
||||
fs.writeFileSync(
|
||||
`${os.tmpdir()}/hydro/tmp/${id}/${i}.js`,
|
||||
m[i],
|
||||
);
|
||||
}
|
||||
}
|
||||
if (m.file) {
|
||||
ensureDir(path.resolve(os.tmpdir(), 'hydro', m.id));
|
||||
for (const n in m.file) {
|
||||
if (m.file[n] === null) {
|
||||
ensureDir(path.resolve(os.tmpdir(), 'hydro', m.id, n));
|
||||
} else {
|
||||
const e = path.resolve(os.tmpdir(), 'hydro', m.id, n);
|
||||
fs.writeFileSync(e, Buffer.from(m.file[n], 'base64'), { mode: 755 });
|
||||
fs.ensureDirSync(moduleTemp);
|
||||
fs.ensureDirSync(publicTemp);
|
||||
for (const moduleRoot of moduleRoots) {
|
||||
if (fs.existsSync(moduleRoot)) {
|
||||
const files = fs.readdirSync(moduleRoot);
|
||||
for (const file of files) {
|
||||
try {
|
||||
// This fixs a mistake.
|
||||
// Markdown-it-katex is not a hydro module but a dependency.
|
||||
if (file === 'markdown-it-katex') continue;
|
||||
const modulePath = path.join(moduleRoot, file);
|
||||
const packagejson = path.join(modulePath, 'package.json');
|
||||
if (fs.statSync(modulePath).isFile() && file.endsWith('.hydro')) {
|
||||
// Is *.hydro module
|
||||
const zip = new AdmZip(modulePath);
|
||||
const targetPath = path.resolve(moduleTemp, file.split('.')[0]);
|
||||
zip.extractAllTo(targetPath, true);
|
||||
const content = fs.readdirSync(targetPath);
|
||||
const ipath = path.join(targetPath, content[0]);
|
||||
if (content.length === 1 && fs.statSync(ipath).isDirectory()) {
|
||||
fs.moveSync(ipath, tmp);
|
||||
fs.rmdirSync(targetPath);
|
||||
fs.moveSync(tmp, targetPath);
|
||||
}
|
||||
}
|
||||
const publicPath = path.resolve(moduleTemp, file.split('.')[0], 'public');
|
||||
if (fs.existsSync(publicPath)) fs.copySync(publicPath, publicTemp);
|
||||
} else if (fs.existsSync(packagejson)) {
|
||||
// Is a npm package
|
||||
const q = fs.readFileSync(packagejson).toString();
|
||||
if (!JSON.parse(q).name.startsWith('@hydrooj/')) continue;
|
||||
const publicPath = path.resolve(modulePath, 'public');
|
||||
if (fs.existsSync(publicPath)) fs.copySync(publicPath, publicTemp);
|
||||
} else continue;
|
||||
} catch (e) {
|
||||
console.error('Module extract fail:', file, e);
|
||||
}
|
||||
if (m.public) {
|
||||
ensureDir(path.resolve(os.tmpdir(), 'hydro', 'public'));
|
||||
for (const n in m.public) {
|
||||
if (m.public[n] === null) {
|
||||
ensureDir(path.resolve(os.tmpdir(), 'hydro', 'public', n));
|
||||
} else {
|
||||
const e = path.resolve(os.tmpdir(), 'hydro', 'public', n);
|
||||
fs.writeFileSync(e, Buffer.from(m.public[n], 'base64'), { mode: 755 });
|
||||
}
|
||||
}
|
||||
}
|
||||
fs.writeFileSync(
|
||||
root(`${os.tmpdir()}/hydro/tmp/${id}/hydro.json`),
|
||||
JSON.stringify({
|
||||
size: s.size,
|
||||
version: m.version,
|
||||
id: m.id,
|
||||
name: m.name,
|
||||
description: m.description,
|
||||
}),
|
||||
);
|
||||
} catch (e) {
|
||||
if (e.code === 'Z_DATA_ERROR') {
|
||||
console.error(`Module Load Fail: ${file} (File Corrupted)`);
|
||||
} else console.error(`Module Load Fail: ${file} ${e}`);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -92,11 +92,6 @@ class SystemModuleHandler extends SystemHandler {
|
||||
await hpm.install(url);
|
||||
this.back();
|
||||
}
|
||||
|
||||
async postDelete({ id }) {
|
||||
await hpm.del(id);
|
||||
this.back();
|
||||
}
|
||||
}
|
||||
|
||||
class SystemScriptHandler extends SystemHandler {
|
||||
|
||||
+31
-42
@@ -7,32 +7,21 @@ import path from 'path';
|
||||
import download from './download';
|
||||
import { folderSize } from '../utils';
|
||||
|
||||
function root(name: string) {
|
||||
return path.resolve(process.cwd(), name);
|
||||
}
|
||||
|
||||
const moduleRoots = [
|
||||
root('.build/module'),
|
||||
root('module'),
|
||||
root(path.resolve(os.homedir(), '.hydro', 'module')),
|
||||
root('.'),
|
||||
];
|
||||
|
||||
let moduleRoot: string;
|
||||
for (const i of moduleRoots) {
|
||||
if (fs.existsSync(i) && fs.statSync(i).isDirectory()) {
|
||||
moduleRoot = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
const moduleRoots = Array.from(new Set([
|
||||
path.resolve(process.cwd(), 'node_modules', '@hydrooj'),
|
||||
path.resolve(__dirname, 'node_modules', '@hydrooj'),
|
||||
path.resolve(os.tmpdir(), 'hydro', 'module'),
|
||||
]));
|
||||
|
||||
export async function getInstalled() {
|
||||
const modules = [];
|
||||
const files = fs.readdirSync(`${os.tmpdir()}/hydro/tmp`);
|
||||
for (const file of files) {
|
||||
const info = `${os.tmpdir()}/hydro/tmp/${file}/hydro.json`;
|
||||
if (fs.existsSync(info)) {
|
||||
modules.push(file);
|
||||
for (const moduleRoot of moduleRoots) {
|
||||
if (fs.existsSync(moduleRoot)) {
|
||||
const files = fs.readdirSync(moduleRoot);
|
||||
for (const file of files) {
|
||||
const info = path.resolve(moduleRoot, file, 'package.json');
|
||||
if (fs.existsSync(info)) modules.push(path.resolve(moduleRoot, file));
|
||||
}
|
||||
}
|
||||
}
|
||||
return modules;
|
||||
@@ -40,31 +29,31 @@ export async function getInstalled() {
|
||||
|
||||
export async function getDetail() {
|
||||
const modules = [];
|
||||
const files = fs.readdirSync(`${os.tmpdir()}/hydro/tmp`);
|
||||
for (const file of files) {
|
||||
const info = `${os.tmpdir()}/hydro/tmp/${file}/hydro.json`;
|
||||
if (fs.existsSync(info)) {
|
||||
const i = JSON.parse(fs.readFileSync(info).toString());
|
||||
const size = folderSize(`${os.tmpdir()}/hydro/tmp/${file}`);
|
||||
modules.push({
|
||||
id: i.id,
|
||||
version: i.version,
|
||||
description: i.description,
|
||||
size,
|
||||
});
|
||||
for (const moduleRoot of moduleRoots) {
|
||||
if (fs.existsSync(moduleRoot)) {
|
||||
const files = fs.readdirSync(moduleRoot);
|
||||
for (const file of files) {
|
||||
const info = path.resolve(moduleRoot, file, 'package.json');
|
||||
if (fs.existsSync(info)) {
|
||||
const i = JSON.parse(fs.readFileSync(info).toString());
|
||||
const size = folderSize(path.resolve(moduleRoot, file));
|
||||
modules.push({
|
||||
id: i.name,
|
||||
version: i.version,
|
||||
description: i.description,
|
||||
size,
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return modules;
|
||||
}
|
||||
|
||||
export async function del(id: string) {
|
||||
fs.unlinkSync(root(`${moduleRoot}/${id}.hydro`));
|
||||
}
|
||||
|
||||
export function install(url: string) {
|
||||
return download(url, root(`${moduleRoot}/${String.random(16)}.hydro`));
|
||||
export function install(url: string, name: string = '') {
|
||||
return download(url, path.resolve(process.cwd(), `${name || String.random(16)}.hydro`));
|
||||
}
|
||||
|
||||
global.Hydro.lib.hpm = {
|
||||
getInstalled, getDetail, del, install,
|
||||
getInstalled, getDetail, install,
|
||||
};
|
||||
+3
-1
@@ -42,7 +42,9 @@ async function terminate() {
|
||||
}
|
||||
|
||||
async function fork(args: string[] = []) {
|
||||
cluster.setupMaster({ args });
|
||||
const _args = process.argv.slice(2);
|
||||
_args.push(...args);
|
||||
cluster.setupMaster({ args: _args });
|
||||
return cluster.fork();
|
||||
}
|
||||
|
||||
|
||||
@@ -154,7 +154,7 @@ export const PERMS = [
|
||||
];
|
||||
|
||||
let PERM_ALL = 0n;
|
||||
for (const p in PERM) if (PERM[p]) PERM_ALL += PERM[p];
|
||||
for (const p in PERM) if (PERM[p]) PERM_ALL |= PERM[p];
|
||||
PERM.PERM_ALL = PERM_ALL;
|
||||
|
||||
export const PERMS_BY_FAMILY = {};
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
import { FindOneAndUpdateOption } from 'mongodb';
|
||||
import { Dictionary } from 'lodash';
|
||||
import * as db from '../service/db';
|
||||
|
||||
const coll = db.collection('system');
|
||||
|
||||
+7
-13
@@ -1,17 +1,11 @@
|
||||
import fs from 'fs';
|
||||
import os from 'os';
|
||||
import path from 'path';
|
||||
import { defaults } from 'lodash';
|
||||
|
||||
let f = path.resolve(process.cwd(), 'config.json');
|
||||
if (!fs.existsSync(f)) f = path.resolve(os.homedir(), '.config', 'hydro', 'config.json');
|
||||
if (!fs.existsSync(f)) f = path.resolve('/config/config.json');
|
||||
const t = JSON.parse(fs.readFileSync(f).toString());
|
||||
|
||||
export default defaults(t, {
|
||||
name: 'hydro',
|
||||
host: '127.0.0.1',
|
||||
port: 27017,
|
||||
username: '',
|
||||
password: '',
|
||||
});
|
||||
export default function load() {
|
||||
let f = path.resolve(process.cwd(), 'config.json');
|
||||
if (!fs.existsSync(f)) f = path.resolve(__dirname, 'config.json');
|
||||
if (!fs.existsSync(f)) f = path.resolve(os.homedir(), '.config', 'hydro', 'config.json');
|
||||
if (!fs.existsSync(f)) f = path.resolve('/config/config.json');
|
||||
return JSON.parse(fs.readFileSync(f).toString());
|
||||
}
|
||||
+5
-3
@@ -2,16 +2,18 @@ import mongodb from 'mongodb';
|
||||
import * as bus from './bus';
|
||||
import options from '../options';
|
||||
|
||||
const opts = options();
|
||||
|
||||
let mongourl = 'mongodb://';
|
||||
if (options.username) mongourl += `${options.username}:${options.password}@`;
|
||||
mongourl += `${options.host}:${options.port}/${options.name}`;
|
||||
if (opts.username) mongourl += `${opts.username}:${opts.password}@`;
|
||||
mongourl += `${opts.host}:${opts.port}/${opts.name}`;
|
||||
|
||||
// eslint-disable-next-line import/no-mutable-exports
|
||||
export let db: mongodb.Db = null;
|
||||
|
||||
mongodb.MongoClient.connect(mongourl, { useNewUrlParser: true, useUnifiedTopology: true })
|
||||
.then((Client) => {
|
||||
db = Client.db(options.name);
|
||||
db = Client.db(opts.name);
|
||||
bus.publish('system_database_connected', null);
|
||||
});
|
||||
|
||||
|
||||
@@ -54,6 +54,7 @@ Accepted: 已通过
|
||||
Access Control: 访问控制
|
||||
Action: 动作
|
||||
Active Sessions: 活动会话
|
||||
Add module: 添加模块
|
||||
Add new data: 添加新数据
|
||||
Add User: 添加用户
|
||||
Add: 添加
|
||||
@@ -151,6 +152,7 @@ Copy QQ Number: 复制QQ号
|
||||
Copy WeChat Account: 复制微信号
|
||||
Copy: 复制
|
||||
Copyright Complaint: 版权申诉
|
||||
CPU Info: CPU信息
|
||||
Create a contest: 创建一个比赛
|
||||
Create a Discussion: 创建一个讨论
|
||||
Create a problem: 创建一个题目
|
||||
@@ -177,6 +179,7 @@ Current Email: 当前电子邮件
|
||||
Current Location: 当前位置
|
||||
Current password doesn't match.: 当前密码输入错误。
|
||||
Current Password: 当前密码
|
||||
Current Status: 当前状态
|
||||
currently offline: 目前离线
|
||||
Data of Problem {0} not found.: 题目 {0} 的数据缺失。
|
||||
Data of problem {1} not found.: 题目 {1} 的数据未找到。
|
||||
@@ -358,6 +361,7 @@ Inline codes: 行内代码
|
||||
Inline formulas: 行内公式
|
||||
Insert Code: 插入代码
|
||||
Insert Image: 插入图像
|
||||
Installed Modules: 已安装的模块
|
||||
Instead of copying the test data directly, the test data of the copied problems will be linked to the test data of the source problems (called the source test data). Thus, the copied problems can observe the changes in the source test data. The permissions of the test data of the copied problems follow the source test data, e.g., you still might not download them but the judges can. By uploading some new test data, the link will be broken and the new test data will be used.: 虽然测试数据不会被复制,但是系统会将题目的测试数据链接到原题。因此在原题的数据被改动的时候,复制后的题目的数据也会同时改动。链接后的测试数据的权限以原题为准,比如您可能依旧无法下载数据,但是评测机可以。在题目设置页面中可以通过上传新的测试数据的方式,这个数据链接会被删除,以后将使用您的新测试数据。
|
||||
Introduce must not exceed 500 characters and it will be shown in the list view.: 简介不能超过 500 个字符,将显示在列表页面中。
|
||||
Introduce: 简介
|
||||
@@ -365,6 +369,7 @@ Invalid password for user {0}.: 用户 {0} 的密码错误。
|
||||
Invalid: 无效
|
||||
Invitation Code: 邀请码
|
||||
IO: 输入输出
|
||||
Is rated: 计入排名
|
||||
It works!: 它成了!
|
||||
Italic: 斜体
|
||||
Join: 加入
|
||||
@@ -411,6 +416,7 @@ Manager: 管理
|
||||
Mark Green: 标绿
|
||||
Mark Yellow: 标黄
|
||||
Memory Cost: 内存占用
|
||||
Memory Info: 内存信息
|
||||
Memory: 内存
|
||||
Message {0} not found.: 消息 {0} 不存在。
|
||||
Messages: 消息
|
||||
@@ -445,6 +451,7 @@ No solutions so far...: 目前还没有题解...
|
||||
No Submissions: 没有递交
|
||||
No user is allowed to join this domain: 没有用户可以自助加入此域
|
||||
no_translation_warn: ''
|
||||
None: 无
|
||||
Not Attended: 未参加
|
||||
Not available: 不可用
|
||||
Not Claimed: 未认领
|
||||
@@ -471,6 +478,7 @@ Ops: 运维
|
||||
Or, with automatically filled invitation code: 或者,这是可以自动填写邀请码的
|
||||
Ordered List: 有序列表
|
||||
Original Score: 原始分数
|
||||
OS Info: 系统信息
|
||||
Owner: 所有者
|
||||
page.problem_detail.sidebar.show_category: 点击显示
|
||||
page.training_detail.invalid_when_not_enrolled: 未参加训练计划时您不能查看题目详情。
|
||||
@@ -478,6 +486,7 @@ pager_first: « 第一页
|
||||
pager_last: 末页 »
|
||||
pager_next: 下一页 ›
|
||||
pager_previous: ‹ 前一页
|
||||
Params: 参数
|
||||
Partic.: 参赛人数
|
||||
Password reset mail has been sent to your email.: 密码重置邮件已发送到您的电子邮箱。
|
||||
Password: 密码
|
||||
@@ -580,6 +589,7 @@ required: 必填
|
||||
Reset Password or Find Username: 重置密码或找回用户名
|
||||
Reset Password: 重置密码
|
||||
Reset: 重置
|
||||
Restart: 重新启动
|
||||
Role Assignment: 角色分配
|
||||
Role has been updated to {0} for selected users.: 所选用户角色已更新为 {0}。
|
||||
Role has been updated to {0}.: 角色已更新为 {0}。
|
||||
@@ -752,6 +762,7 @@ Users: 用户
|
||||
Using your Hydro universal account: 使用您的 Hydro 通用账户
|
||||
Valid for registered users who are not members of the domain: 对域外注册用户有效
|
||||
Valid for visitors: 对未登录的游客有效
|
||||
Version: 版本
|
||||
View contest scoreboard: 查看比赛成绩表
|
||||
View Contest: 查看比赛
|
||||
View contests: 查看比赛
|
||||
|
||||
@@ -1,53 +0,0 @@
|
||||
const { Route, Handler } = global.Hydro.service.server;
|
||||
const { PRIV: { PRIV_USER_PROFILE } } = global.Hydro.model.builtin;
|
||||
const { pastebin } = global.Hydro.model;
|
||||
const { nav } = global.Hydro.lib;
|
||||
|
||||
class PasteMainHandler extends Handler {
|
||||
async get() {
|
||||
this.response.redirect = this.url('paste_create');
|
||||
}
|
||||
}
|
||||
|
||||
class PasteShowHandler extends Handler {
|
||||
async get({ docId }) {
|
||||
const doc = await pastebin.get(docId);
|
||||
const path = [
|
||||
['Hydro', 'homepage'],
|
||||
['paste_show', null],
|
||||
[doc.title, null, true],
|
||||
];
|
||||
this.response.body = { path, doc };
|
||||
this.response.template = 'paste_show.html';
|
||||
}
|
||||
}
|
||||
|
||||
class PasteCreateHandler extends Handler {
|
||||
async get() {
|
||||
const path = [
|
||||
['Hydro', 'homepage'],
|
||||
['paste_create', null],
|
||||
];
|
||||
this.response.body = { path };
|
||||
this.response.template = 'paste_create.html';
|
||||
}
|
||||
|
||||
async post({
|
||||
language, expire, password, title, content,
|
||||
}) {
|
||||
const docId = await pastebin.add({
|
||||
language, expire, password, owner: this.user._id, title, content,
|
||||
});
|
||||
this.response.body = { docId };
|
||||
this.response.redirect = `/paste/${docId}`;
|
||||
}
|
||||
}
|
||||
|
||||
async function apply() {
|
||||
Route('pastebin', '/paste', PasteMainHandler);
|
||||
Route('paste_create', '/paste/create', PasteCreateHandler, PRIV_USER_PROFILE);
|
||||
Route('paste_show', '/paste/:docId', PasteShowHandler);
|
||||
nav('pastebin', null, 'pastebin', PRIV_USER_PROFILE);
|
||||
}
|
||||
|
||||
global.Hydro.handler.pastebin = module.exports = apply;
|
||||
@@ -1,5 +0,0 @@
|
||||
{
|
||||
"id": "module-pastebin",
|
||||
"version": "1.0.0",
|
||||
"description": "Provide pastebin service."
|
||||
}
|
||||
@@ -1,2 +0,0 @@
|
||||
paste_create: Create a paste
|
||||
paste_show: Read a paste
|
||||
@@ -1,4 +0,0 @@
|
||||
pastebin: 剪贴板
|
||||
paste_create: 创建新内容
|
||||
paste_show: 查看内容
|
||||
Provide pastebin service.: 提供云剪贴板服务。
|
||||
@@ -1,27 +0,0 @@
|
||||
const { DocumentNotFoundError } = global.Hydro.error;
|
||||
const { document } = global.Hydro.model;
|
||||
|
||||
document.TYPE_PASTE = 101;
|
||||
|
||||
function add({
|
||||
owner, language, expire, password, title, content,
|
||||
}) {
|
||||
return document.add(
|
||||
'system', content, owner, document.TYPE_PASTE, null, null, null,
|
||||
{
|
||||
language, expire, title, password,
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
async function get(_id) {
|
||||
const doc = await document.get('system', document.TYPE_PASTE, _id);
|
||||
if (!doc) throw new DocumentNotFoundError(_id);
|
||||
return doc;
|
||||
}
|
||||
|
||||
function del(_id) {
|
||||
return document.deleteOne('system', document.TYPE_PASTE, _id);
|
||||
}
|
||||
|
||||
global.Hydro.model.pastebin = module.exports = { add, get, del };
|
||||
@@ -1,54 +0,0 @@
|
||||
{% set page_name = "paste_create" %}
|
||||
{% extends "layout/basic.html" %}
|
||||
{% block content %}
|
||||
<div class="row">
|
||||
<div class="medium-9 columns">
|
||||
<div class="section">
|
||||
<div class="section__body">
|
||||
<form method="post">
|
||||
<div class="row">
|
||||
<div class="medium-7 columns">
|
||||
<label>
|
||||
{{ _('Title') }}
|
||||
<input name="title" placeholder="{{ _('title') }}" class="textbox" autofocus>
|
||||
</label>
|
||||
</div>
|
||||
<div class="medium-3 columns">
|
||||
<label>
|
||||
{{ _('Language') }}
|
||||
<br>
|
||||
<label>
|
||||
<input name="language" placeholder="{{ _('Language of the content') }}" class="textbox">
|
||||
</label>
|
||||
</label>
|
||||
</div>
|
||||
<div class="medium-2 columns">
|
||||
<label>
|
||||
<br>
|
||||
<label class="checkbox">
|
||||
<input type="checkbox" name="private" value="on">{{ _('Private') }}
|
||||
</label>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row"><div class="columns">
|
||||
<label>
|
||||
{{ _('Content') }}
|
||||
<textarea name="content" class="textbox" data-markdown style="height: 500px"></textarea>
|
||||
</label>
|
||||
</div></div>
|
||||
<div class="row"><div class="columns">
|
||||
<input type="hidden" name="csrfToken" value="{{ handler.csrfToken }}">
|
||||
<button type="submit" class="rounded primary button">
|
||||
{{ _('Create') }}
|
||||
</button>
|
||||
</div></div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="medium-3 columns">
|
||||
{% include 'components/md_hint.html' %}
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
@@ -1,48 +0,0 @@
|
||||
{% set page_name = "paste_create" %}
|
||||
{% extends "layout/basic.html" %}
|
||||
{% block content %}
|
||||
<div class="row">
|
||||
<div class="medium-9 columns">
|
||||
<div class="section">
|
||||
<div class="section__body">
|
||||
<form method="post">
|
||||
<div class="row">
|
||||
<div class="medium-7 columns">
|
||||
<label>
|
||||
{{ _('Title') }}
|
||||
<input name="title" value="{{ doc.title }}" class="textbox" autofocus>
|
||||
</label>
|
||||
</div>
|
||||
<div class="medium-3 columns">
|
||||
<label>
|
||||
{{ _('Language') }}
|
||||
<br>
|
||||
<label>
|
||||
<input name="language" value="{{ doc.language }}" class="textbox">
|
||||
</label>
|
||||
</label>
|
||||
</div>
|
||||
<div class="medium-2 columns">
|
||||
<label>
|
||||
<br>
|
||||
<label class="checkbox">
|
||||
<input type="checkbox" name="private" value="on">{{ _('Private') }}
|
||||
</label>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row"><div class="columns">
|
||||
<label>
|
||||
{{ _('Content') }}
|
||||
<textarea name="content" class="textbox" style="height: 500px">{{ doc.content }}</textarea>
|
||||
</label>
|
||||
</div></div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="medium-3 columns">
|
||||
{% include 'components/md_hint.html' %}
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
+13
-3
@@ -1,16 +1,20 @@
|
||||
{
|
||||
"name": "hydrooj",
|
||||
"version": "2.7.5",
|
||||
"version": "2.8.0",
|
||||
"main": "hydro/loader.ts",
|
||||
"repository": "https://github.com/hydro-dev/Hydro.git",
|
||||
"author": "masnn",
|
||||
"license": "GPL-3.0-only",
|
||||
"engines": {
|
||||
"node": ">=10.10"
|
||||
},
|
||||
"dependencies": {
|
||||
"@hydrooj/markdown-it-katex": "^2.1.1",
|
||||
"@types/lru-cache": "^5.1.0",
|
||||
"adm-zip": "^0.4.16",
|
||||
"ansi_up": "^4.0.4",
|
||||
"detect-browser": "^5.1.1",
|
||||
"fs-extra": "^9.0.1",
|
||||
"js-yaml": "^3.13.1",
|
||||
"koa": "^2.13.0",
|
||||
"koa-body": "^4.2.0",
|
||||
@@ -41,6 +45,7 @@
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/adm-zip": "^0.4.33",
|
||||
"@types/fs-extra": "^9.0.1",
|
||||
"@types/koa": "^2.11.3",
|
||||
"@types/koa-morgan": "^1.0.4",
|
||||
"@types/koa-router": "^7.4.1",
|
||||
@@ -73,7 +78,7 @@
|
||||
"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",
|
||||
"build:all": "cd ui && yarn && yarn build:production && cd .. && yarn --ignore-optional && yarn build:production",
|
||||
"start": "ts-node hydro/loader.ts",
|
||||
"pkg": "pkg .",
|
||||
"lint": "eslint build hydro module tool --ext ts,js --fix",
|
||||
@@ -88,5 +93,10 @@
|
||||
".build/module/**"
|
||||
]
|
||||
},
|
||||
"snyk": true
|
||||
"snyk": true,
|
||||
"optionalDependencies": {
|
||||
"@hydrooj/geoip": "^1.1.1",
|
||||
"@hydrooj/migrate-vijos": "^1.1.0",
|
||||
"@hydrooj/pastebin": "^1.0.0"
|
||||
}
|
||||
}
|
||||
@@ -27,7 +27,7 @@
|
||||
columns:4,
|
||||
label:'Rated',
|
||||
name:'rated',
|
||||
placeholder:_('rated'),
|
||||
placeholder:_('Is rated'),
|
||||
value:tdoc.rated|default(true),
|
||||
row:false
|
||||
}) }}
|
||||
|
||||
@@ -67,7 +67,7 @@
|
||||
{% endfor %}
|
||||
</select>
|
||||
<button type="submit" class="button hasjs--hide">
|
||||
{{ _('Go') }}
|
||||
{{ _('Search') }}
|
||||
</button>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
<div class="section__header">
|
||||
<h1 class="section__title">{{ _('Installed Modules') }}</h1>
|
||||
<div class="section__tools">
|
||||
<button class="primary rounded button" name="add_module"><span class="icon icon-add"></span> {{ _('Add module') }}</button>
|
||||
<button class="primary rounded button" name="add_module"><span class="icon icon-add"></span> {{ _('Add Module') }}</button>
|
||||
<a class="tool-button" href="{{ url('wiki', page='help', anchor='module') }}"><span class="icon icon-help"></span> {{ _("What's module?") }}</a>
|
||||
</div>
|
||||
</div>
|
||||
@@ -30,7 +30,6 @@
|
||||
<col class="col--desc">
|
||||
<col class="col--size">
|
||||
<col class="col--version">
|
||||
<col class="col--action">
|
||||
</colgroup>
|
||||
<thead>
|
||||
<tr>
|
||||
@@ -38,7 +37,6 @@
|
||||
<th class="col--desc">{{ _('Description') }}</th>
|
||||
<th class="col--size">{{ _('Size') }}</th>
|
||||
<th class="col--version">{{ _('Version') }}</th>
|
||||
<th class="col--action">{{ _('Action') }}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@@ -48,15 +46,6 @@
|
||||
<td class="col--desc">{{ _(module.description|default(_('None'))) }}</td>
|
||||
<td class="col--size">{{ size(module.size) if module.size else '?' }}</td>
|
||||
<td class="col--version">{{ module.version|default('?') }}</td>
|
||||
<td class="col--action">
|
||||
<form method="post">
|
||||
<input type="hidden" name="operation" value="delete">
|
||||
<input type="hidden" name="id" value="{{ module.filename }}">
|
||||
<input type="hidden" name="csrfToken" value="{{ handler.csrfToken }}">
|
||||
<input type="hidden" name="csrfToken" value="{{ handler.csrfToken }}">
|
||||
<input type="submit" class="typo-a" value="{{ _('Delete') }}">
|
||||
</form>
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
<p><b>{{ _('Current dataset comes from') }} <a href="{{ pdoc.data.split('from:')[1] }}" target="_blank">{{ pdoc.data.split('from:')[1] }}</a></b></p>
|
||||
{% else %}
|
||||
<p>{{ _('Current dataset: {0}').format((pdoc['data'] or _('(None)')).toString()) }}</p>
|
||||
<p>{{ _('MD5: {0}').format(md5 or _('(None)')) }}</p>
|
||||
<p>{{ _('MD5') }}: {{ md5|default(_('(None)'))) }}</p>
|
||||
{% endif %}
|
||||
<p>{{ _('New dataset') }}:
|
||||
<input type="hidden" name="csrfToken" value="{{ handler.csrfToken }}">
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
|
||||
function fix(file) {
|
||||
let content = fs.readFileSync(file).toString();
|
||||
content = content.replace(/https:\/\/registry.yarnpkg.com\//gmi, 'https://registry.npm.taobao.org/');
|
||||
fs.writeFileSync(file, content);
|
||||
}
|
||||
|
||||
fix(path.resolve(__dirname, '..', 'yarn.lock'));
|
||||
fix(path.resolve(__dirname, '..', 'ui', 'yarn.lock'));
|
||||
+27
-14
@@ -2,7 +2,12 @@ const fs = require('fs');
|
||||
const path = require('path');
|
||||
const yaml = require('js-yaml');
|
||||
|
||||
const name = process.argv[2];
|
||||
|
||||
const IGNORE_CHECK = ['en'];
|
||||
const IGNORE_MISSING = [
|
||||
'?', 'AC', 'Gravatar', 'ID', 'MD5', 'URL',
|
||||
];
|
||||
const RE_TEXT = /_\(['"]([\s\S])*?['"]\)/gmi;
|
||||
const TEMPLATE_ROOT = path.resolve(__dirname, '..', 'templates');
|
||||
const LOCALE_ROOT = path.resolve(__dirname, '..', 'locales');
|
||||
@@ -36,26 +41,34 @@ function scan(folder, relative = '') {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
scan(TEMPLATE_ROOT);
|
||||
|
||||
const result = {};
|
||||
|
||||
const locales = fs.readdirSync(LOCALE_ROOT);
|
||||
for (const locale of locales) {
|
||||
if (!IGNORE_CHECK.includes(locale.split('.')[0])) {
|
||||
const p = path.join(LOCALE_ROOT, locale);
|
||||
const f = fs.readFileSync(p).toString();
|
||||
const l = yaml.safeLoad(f);
|
||||
for (const str in texts) {
|
||||
if (!l[str]) {
|
||||
if (result[str]) result[str].locale.push(locale);
|
||||
else result[str] = { str, source: texts[str], locale: [locale] };
|
||||
if (!name) {
|
||||
for (const locale of locales) {
|
||||
if (!IGNORE_CHECK.includes(locale.split('.')[0])) {
|
||||
const p = path.join(LOCALE_ROOT, locale);
|
||||
const f = fs.readFileSync(p).toString();
|
||||
const l = yaml.safeLoad(f);
|
||||
for (const str in texts) {
|
||||
if (!l[str]) {
|
||||
if (result[str]) result[str].locale.push(locale);
|
||||
else result[str] = { source: texts[str], locale: [locale] };
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
const p = path.join(LOCALE_ROOT, name);
|
||||
const f = fs.readFileSync(p).toString();
|
||||
const l = yaml.safeLoad(f);
|
||||
for (const str in texts) {
|
||||
if (!l[str]) {
|
||||
result[str] = texts[str];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (const str of IGNORE_MISSING) delete result[str];
|
||||
console.log(`${Object.keys(result).length} translations missing.`);
|
||||
fs.writeFileSync(path.join(__dirname, '..', '__result.json'), JSON.stringify(result, null, 2));
|
||||
console.log(`result wrote to ${path.resolve(__dirname, '..', '__result.json')}`);
|
||||
console.log(`Result wrote to ${path.resolve(__dirname, '..', '__result.json')}`);
|
||||
@@ -85,7 +85,7 @@ export default function (env = {}) {
|
||||
vj4: './Entry.js',
|
||||
},
|
||||
output: {
|
||||
path: root('../.uibuild'),
|
||||
path: root('../public'),
|
||||
publicPath: '/', // overwrite in entry.js
|
||||
hashFunction: 'sha1',
|
||||
hashDigest: 'hex',
|
||||
|
||||
+23
-23
@@ -5,38 +5,38 @@
|
||||
"private": true,
|
||||
"license": "AGPL-1.0",
|
||||
"devDependencies": {
|
||||
"@babel/cli": "^7.10.3",
|
||||
"@babel/core": "^7.10.3",
|
||||
"@babel/plugin-proposal-class-properties": "^7.10.1",
|
||||
"@babel/plugin-proposal-decorators": "^7.10.3",
|
||||
"@babel/plugin-proposal-export-namespace-from": "^7.10.1",
|
||||
"@babel/plugin-proposal-function-sent": "^7.10.1",
|
||||
"@babel/plugin-proposal-json-strings": "^7.10.1",
|
||||
"@babel/plugin-proposal-numeric-separator": "^7.10.1",
|
||||
"@babel/plugin-proposal-throw-expressions": "^7.10.1",
|
||||
"@babel/cli": "^7.10.5",
|
||||
"@babel/core": "^7.10.5",
|
||||
"@babel/plugin-proposal-class-properties": "^7.10.4",
|
||||
"@babel/plugin-proposal-decorators": "^7.10.5",
|
||||
"@babel/plugin-proposal-export-namespace-from": "^7.10.4",
|
||||
"@babel/plugin-proposal-function-sent": "^7.10.4",
|
||||
"@babel/plugin-proposal-json-strings": "^7.10.4",
|
||||
"@babel/plugin-proposal-numeric-separator": "^7.10.4",
|
||||
"@babel/plugin-proposal-throw-expressions": "^7.10.4",
|
||||
"@babel/plugin-syntax-dynamic-import": "^7.0.0",
|
||||
"@babel/plugin-syntax-import-meta": "^7.10.1",
|
||||
"@babel/plugin-transform-runtime": "^7.10.3",
|
||||
"@babel/preset-env": "^7.10.3",
|
||||
"@babel/preset-react": "^7.10.1",
|
||||
"@babel/register": "^7.10.3",
|
||||
"autoprefixer": "^9.8.4",
|
||||
"@babel/plugin-syntax-import-meta": "^7.10.4",
|
||||
"@babel/plugin-transform-runtime": "^7.10.5",
|
||||
"@babel/preset-env": "^7.10.4",
|
||||
"@babel/preset-react": "^7.10.4",
|
||||
"@babel/register": "^7.10.5",
|
||||
"autoprefixer": "^9.8.5",
|
||||
"babel-eslint": "^10.0.1",
|
||||
"babel-loader": "^8.0.6",
|
||||
"babel-plugin-lodash": "^3.3.4",
|
||||
"babel-plugin-prismjs": "^2.0.1",
|
||||
"chalk": "^4.1.0",
|
||||
"copy-webpack-plugin": "^6.0.2",
|
||||
"copy-webpack-plugin": "^6.0.3",
|
||||
"css-loader": "^3.6.0",
|
||||
"del": "^5.1.0",
|
||||
"eslint": "^7.2.0",
|
||||
"eslint": "^7.4.0",
|
||||
"eslint-config-airbnb": "^18.2.0",
|
||||
"eslint-import-resolver-webpack": "^0.12.2",
|
||||
"eslint-loader": "^4.0.2",
|
||||
"eslint-plugin-babel": "^5.3.0",
|
||||
"eslint-plugin-import": "^2.21.2",
|
||||
"eslint-plugin-babel": "^5.3.1",
|
||||
"eslint-plugin-import": "^2.22.0",
|
||||
"eslint-plugin-jsx-a11y": "^6.3.1",
|
||||
"eslint-plugin-react": "^7.20.0",
|
||||
"eslint-plugin-react": "^7.20.3",
|
||||
"file-loader": "^6.0.0",
|
||||
"friendly-errors-webpack-plugin": "^1.7.0",
|
||||
"fs-extra": "^9.0.1",
|
||||
@@ -60,10 +60,10 @@
|
||||
"uglifyjs-webpack-plugin": "^2.2.0",
|
||||
"vinyl-buffer": "^1.0.1",
|
||||
"webpack": "^4.43.0",
|
||||
"yargs": "^15.3.1"
|
||||
"yargs": "^15.4.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"@babel/runtime-corejs2": "^7.10.3",
|
||||
"@babel/runtime-corejs2": "^7.10.5",
|
||||
"base-64": "^0.1.0",
|
||||
"classnames": "^2.2.6",
|
||||
"clipboard": "^2.0.4",
|
||||
@@ -76,7 +76,7 @@
|
||||
"jquery.easing": "^1.4.1",
|
||||
"jquery.transit": "^0.9.12",
|
||||
"katex": "^0.11.1",
|
||||
"lodash": "^4.17.13",
|
||||
"lodash": "^4.17.19",
|
||||
"mini-css-extract-plugin": "^0.9.0",
|
||||
"moment": "^2.27.0",
|
||||
"monaco-editor": "^0.20.0",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
.page--manage_module
|
||||
.col--id
|
||||
width: 70px
|
||||
width: 100px
|
||||
line-height: 1
|
||||
|
||||
.col--desc
|
||||
@@ -13,9 +13,6 @@
|
||||
.col--version
|
||||
width: 40px
|
||||
|
||||
.col--action
|
||||
width: rem(75px)
|
||||
|
||||
+mobile()
|
||||
.col--desc, .col--version
|
||||
display: none
|
||||
+747
-1008
File diff suppressed because it is too large.
Load diff
@@ -2,6 +2,13 @@
|
||||
# yarn lockfile v1
|
||||
|
||||
|
||||
"@arcanis/slice-ansi@^1.0.2":
|
||||
version "1.0.2"
|
||||
resolved "https://registry.yarnpkg.com/@arcanis/slice-ansi/-/slice-ansi-1.0.2.tgz#35331e41a1062e3c53c01ad2ec1555c5c1959d8f"
|
||||
integrity sha512-lDL63z0W/L/WTgqrwVOuNyMAsTv+pvjybd21z9SWdStmQoXT59E/iVWwat3gYjcdTNBf6oHAMoyFm8dtjpXEYw==
|
||||
dependencies:
|
||||
grapheme-splitter "^1.0.4"
|
||||
|
||||
"@babel/code-frame@^7.0.0":
|
||||
version "7.10.4"
|
||||
resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a"
|
||||
@@ -23,6 +30,13 @@
|
||||
chalk "^2.0.0"
|
||||
js-tokens "^4.0.0"
|
||||
|
||||
"@hydrooj/geoip@^1.1.1":
|
||||
version "1.1.2"
|
||||
resolved "https://registry.yarnpkg.com/@hydrooj/geoip/-/geoip-1.1.2.tgz#1dfa02ce06c2aa2690bbce6aea089731eb91d137"
|
||||
integrity sha512-a8OefZxUd+AUlv4w1RweVXqtcb7gxNaTk0oce5/WWDN1CogFbDUK790BPHRvfB3wiSWLm1h0GyjJOFQL9hypwA==
|
||||
dependencies:
|
||||
maxmind "^4.1.3"
|
||||
|
||||
"@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"
|
||||
@@ -30,6 +44,16 @@
|
||||
dependencies:
|
||||
katex "^0.11.1"
|
||||
|
||||
"@hydrooj/migrate-vijos@^1.1.0":
|
||||
version "1.1.0"
|
||||
resolved "https://registry.yarnpkg.com/@hydrooj/migrate-vijos/-/migrate-vijos-1.1.0.tgz#1929ec44accd47be58ff792eda69f4576883e807"
|
||||
integrity sha512-3OqrNyMFQjkIx7LQDzHF0Z/HUzYqWaGPJnRO7JkhblCnZ4wBEhXRzC0ZI4Yil1s/w9+E+POb+5HrzwYPrnV7mw==
|
||||
|
||||
"@hydrooj/pastebin@^1.0.0":
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/@hydrooj/pastebin/-/pastebin-1.0.0.tgz#5b3b86097451dfd056bea84d51b9b7c28b00c895"
|
||||
integrity sha512-AFDgqNTR/luBA1zIlP+4tBbcGC35Nq74nzaHtJ/ZCqZL2RZfpP4p90wH3U3Gi0+YD45VXIvDVEVCgruQ4naFvA==
|
||||
|
||||
"@nodelib/fs.scandir@2.1.3":
|
||||
version "2.1.3"
|
||||
resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz#3a582bdb53804c6ba6d146579c46e52130cf4a3b"
|
||||
@@ -56,10 +80,10 @@
|
||||
resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea"
|
||||
integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==
|
||||
|
||||
"@sindresorhus/is@^2.1.1":
|
||||
version "2.1.1"
|
||||
resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-2.1.1.tgz#ceff6a28a5b4867c2dd4a1ba513de278ccbe8bb1"
|
||||
integrity sha512-/aPsuoj/1Dw/kzhkgz+ES6TxG0zfTMGLwuK2ZG00k/iJzYHTLCE8mVU8EPqEOp/lmxPoq1C1C9RYToRKb2KEfg==
|
||||
"@sindresorhus/is@^3.0.0":
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-3.0.0.tgz#78fabc5e295adb6e1ef57eaafe4cc5d7aa35b183"
|
||||
integrity sha512-kqA5I6Yun7PBHk8WN9BBP1c7FfN2SrD05GuVSEYPqDb4nerv7HqYfgBfMIKmT/EuejURkJKLZuLyGKGs6WEG9w==
|
||||
|
||||
"@snyk/cli-interface@1.5.0":
|
||||
version "1.5.0"
|
||||
@@ -158,6 +182,15 @@
|
||||
source-map-support "^0.5.19"
|
||||
tslib "^1.13.0"
|
||||
|
||||
"@snyk/docker-registry-v2-client@^1.13.5":
|
||||
version "1.13.5"
|
||||
resolved "https://registry.yarnpkg.com/@snyk/docker-registry-v2-client/-/docker-registry-v2-client-1.13.5.tgz#8d862f0c53d4a9a25db09cd48b4cd44aa8e385c9"
|
||||
integrity sha512-lgJiC071abCpFVLp47OnykU8MMrhdQe386Wt6QaDmjI0s2DQn/S58NfdLrPU7s6l4zoGT7UwRW9+7paozRgFTA==
|
||||
dependencies:
|
||||
needle "^2.5.0"
|
||||
parse-link-header "^1.0.1"
|
||||
tslib "^1.10.0"
|
||||
|
||||
"@snyk/gemfile@1.2.0":
|
||||
version "1.2.0"
|
||||
resolved "https://registry.yarnpkg.com/@snyk/gemfile/-/gemfile-1.2.0.tgz#919857944973cce74c650e5428aaf11bcd5c0457"
|
||||
@@ -267,6 +300,16 @@
|
||||
source-map-support "^0.5.7"
|
||||
tslib "^2.0.0"
|
||||
|
||||
"@snyk/snyk-docker-pull@^3.1.3":
|
||||
version "3.2.0"
|
||||
resolved "https://registry.yarnpkg.com/@snyk/snyk-docker-pull/-/snyk-docker-pull-3.2.0.tgz#07c47b8be2d899d51d720099a73a0d89effe5d99"
|
||||
integrity sha512-uWKtjh29I/d0mfmfBN7w6RwwNBQxQVKrauF5ND/gqb0PVsKV22GIpkI+viWjI7KNKso6/B0tMmsv7TX2tsNcLQ==
|
||||
dependencies:
|
||||
"@snyk/docker-registry-v2-client" "^1.13.5"
|
||||
child-process "^1.0.2"
|
||||
tar-stream "^2.1.2"
|
||||
tmp "^0.1.0"
|
||||
|
||||
"@szmarczak/http-timer@^1.1.2":
|
||||
version "1.1.2"
|
||||
resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421"
|
||||
@@ -382,9 +425,9 @@
|
||||
"@types/range-parser" "*"
|
||||
|
||||
"@types/express@*":
|
||||
version "4.17.6"
|
||||
resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.6.tgz#6bce49e49570507b86ea1b07b806f04697fac45e"
|
||||
integrity sha512-n/mr9tZI83kd4azlPG5y997C/M4DNABK9yErhFM6hKdym4kkmd9j0vtsJyjFIwfRBxtrxZtAfGZCNRIBMFLK5w==
|
||||
version "4.17.7"
|
||||
resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.7.tgz#42045be6475636d9801369cd4418ef65cdb0dd59"
|
||||
integrity sha512-dCOT5lcmV/uC2J9k0rPafATeeyz+99xTt54ReX11/LObZgfzJqZNcW27zGhYyX+9iSEGXGt5qLPwRSvBZcLvtQ==
|
||||
dependencies:
|
||||
"@types/body-parser" "*"
|
||||
"@types/express-serve-static-core" "*"
|
||||
@@ -399,10 +442,17 @@
|
||||
"@types/events" "*"
|
||||
"@types/node" "*"
|
||||
|
||||
"@types/fs-extra@^9.0.1":
|
||||
version "9.0.1"
|
||||
resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-9.0.1.tgz#91c8fc4c51f6d5dbe44c2ca9ab09310bd00c7918"
|
||||
integrity sha512-B42Sxuaz09MhC3DDeW5kubRcQ5by4iuVQ0cRRWM2lggLzAa/KVom0Aft/208NgMvNQQZ86s5rVcqDdn/SH0/mg==
|
||||
dependencies:
|
||||
"@types/node" "*"
|
||||
|
||||
"@types/glob@^7.1.1":
|
||||
version "7.1.2"
|
||||
resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.2.tgz#06ca26521353a545d94a0adc74f38a59d232c987"
|
||||
integrity sha512-VgNIkxK+j7Nz5P7jvUZlRvhuPSmsEfS03b0alKcq5V/STUKAa3Plemsn5mrQUO7am6OErJ4rhGEGJbACclrtRA==
|
||||
version "7.1.3"
|
||||
resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.3.tgz#e6ba80f36b7daad2c685acd9266382e68985c183"
|
||||
integrity sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==
|
||||
dependencies:
|
||||
"@types/minimatch" "*"
|
||||
"@types/node" "*"
|
||||
@@ -544,20 +594,15 @@
|
||||
dependencies:
|
||||
"@types/node" "*"
|
||||
|
||||
"@types/node@*":
|
||||
version "14.0.14"
|
||||
resolved "https://registry.yarnpkg.com/@types/node/-/node-14.0.14.tgz#24a0b5959f16ac141aeb0c5b3cd7a15b7c64cbce"
|
||||
integrity sha512-syUgf67ZQpaJj01/tRTknkMNoBBLWJOBODF0Zm4NrXmiSuxjymFrxnTu1QVYRubhVkRcZLYZG8STTwJRdVm/WQ==
|
||||
"@types/node@*", "@types/node@^14.0.22":
|
||||
version "14.0.23"
|
||||
resolved "https://registry.yarnpkg.com/@types/node/-/node-14.0.23.tgz#676fa0883450ed9da0bb24156213636290892806"
|
||||
integrity sha512-Z4U8yDAl5TFkmYsZdFPdjeMa57NOvnaf1tljHzhouaPEp7LCj2JKkejpI1ODviIAQuW4CcQmxkQ77rnLsOOoKw==
|
||||
|
||||
"@types/node@^13.7.0":
|
||||
version "13.13.12"
|
||||
resolved "https://registry.yarnpkg.com/@types/node/-/node-13.13.12.tgz#9c72e865380a7dc99999ea0ef20fc9635b503d20"
|
||||
integrity sha512-zWz/8NEPxoXNT9YyF2osqyA9WjssZukYpgI4UYZpOjcyqwIUqWGkcCionaEb9Ki+FULyPyvNFpg/329Kd2/pbw==
|
||||
|
||||
"@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==
|
||||
version "13.13.14"
|
||||
resolved "https://registry.yarnpkg.com/@types/node/-/node-13.13.14.tgz#20cd7d2a98f0c3b08d379f4ea9e6b315d2019529"
|
||||
integrity sha512-Az3QsOt1U/K1pbCQ0TXGELTuTkPLOiFIQf3ILzbOyo0FqgV9SxRnxbxM5QlAveERZMHpZY+7u3Jz2tKyl+yg6g==
|
||||
|
||||
"@types/node@^6.14.4", "@types/node@^6.14.7":
|
||||
version "6.14.10"
|
||||
@@ -653,51 +698,51 @@
|
||||
"@types/yargs-parser" "*"
|
||||
|
||||
"@typescript-eslint/eslint-plugin@^3.6.0":
|
||||
version "3.6.0"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-3.6.0.tgz#ba2b6cae478b8fca3f2e58ff1313e4198eea2d8a"
|
||||
integrity sha512-ubHlHVt1lsPQB/CZdEov9XuOFhNG9YRC//kuiS1cMQI6Bs1SsqKrEmZnpgRwthGR09/kEDtr9MywlqXyyYd8GA==
|
||||
version "3.6.1"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-3.6.1.tgz#5ced8fd2087fbb83a76973dea4a0d39d9cb4a642"
|
||||
integrity sha512-06lfjo76naNeOMDl+mWG9Fh/a0UHKLGhin+mGaIw72FUMbMGBkdi/FEJmgEDzh4eE73KIYzHWvOCYJ0ak7nrJQ==
|
||||
dependencies:
|
||||
"@typescript-eslint/experimental-utils" "3.6.0"
|
||||
"@typescript-eslint/experimental-utils" "3.6.1"
|
||||
debug "^4.1.1"
|
||||
functional-red-black-tree "^1.0.1"
|
||||
regexpp "^3.0.0"
|
||||
semver "^7.3.2"
|
||||
tsutils "^3.17.1"
|
||||
|
||||
"@typescript-eslint/experimental-utils@3.6.0":
|
||||
version "3.6.0"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-3.6.0.tgz#0138152d66e3e53a6340f606793fb257bf2d76a1"
|
||||
integrity sha512-4Vdf2hvYMUnTdkCNZu+yYlFtL2v+N2R7JOynIOkFbPjf9o9wQvRwRkzUdWlFd2YiiUwJLbuuLnl5civNg5ykOQ==
|
||||
"@typescript-eslint/experimental-utils@3.6.1":
|
||||
version "3.6.1"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-3.6.1.tgz#b5a2738ebbceb3fa90c5b07d50bb1225403c4a54"
|
||||
integrity sha512-oS+hihzQE5M84ewXrTlVx7eTgc52eu+sVmG7ayLfOhyZmJ8Unvf3osyFQNADHP26yoThFfbxcibbO0d2FjnYhg==
|
||||
dependencies:
|
||||
"@types/json-schema" "^7.0.3"
|
||||
"@typescript-eslint/types" "3.6.0"
|
||||
"@typescript-eslint/typescript-estree" "3.6.0"
|
||||
"@typescript-eslint/types" "3.6.1"
|
||||
"@typescript-eslint/typescript-estree" "3.6.1"
|
||||
eslint-scope "^5.0.0"
|
||||
eslint-utils "^2.0.0"
|
||||
|
||||
"@typescript-eslint/parser@^3.6.0":
|
||||
version "3.6.0"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-3.6.0.tgz#79b5232e1a2d06f1fc745942b690cd87aca7b60e"
|
||||
integrity sha512-taghDxuLhbDAD1U5Fk8vF+MnR0yiFE9Z3v2/bYScFb0N1I9SK8eKHkdJl1DAD48OGFDMFTeOTX0z7g0W6SYUXw==
|
||||
version "3.6.1"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-3.6.1.tgz#216e8adf4ee9c629f77c985476a2ea07fb80e1dc"
|
||||
integrity sha512-SLihQU8RMe77YJ/jGTqOt0lMq7k3hlPVfp7v/cxMnXA9T0bQYoMDfTsNgHXpwSJM1Iq2aAJ8WqekxUwGv5F67Q==
|
||||
dependencies:
|
||||
"@types/eslint-visitor-keys" "^1.0.0"
|
||||
"@typescript-eslint/experimental-utils" "3.6.0"
|
||||
"@typescript-eslint/types" "3.6.0"
|
||||
"@typescript-eslint/typescript-estree" "3.6.0"
|
||||
"@typescript-eslint/experimental-utils" "3.6.1"
|
||||
"@typescript-eslint/types" "3.6.1"
|
||||
"@typescript-eslint/typescript-estree" "3.6.1"
|
||||
eslint-visitor-keys "^1.1.0"
|
||||
|
||||
"@typescript-eslint/types@3.6.0":
|
||||
version "3.6.0"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-3.6.0.tgz#4bd6eee55d2f9d35a4b36c4804be1880bf68f7bc"
|
||||
integrity sha512-JwVj74ohUSt0ZPG+LZ7hb95fW8DFOqBuR6gE7qzq55KDI3BepqsCtHfBIoa0+Xi1AI7fq5nCu2VQL8z4eYftqg==
|
||||
"@typescript-eslint/types@3.6.1":
|
||||
version "3.6.1"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-3.6.1.tgz#87600fe79a1874235d3cc1cf5c7e1a12eea69eee"
|
||||
integrity sha512-NPxd5yXG63gx57WDTW1rp0cF3XlNuuFFB5G+Kc48zZ+51ZnQn9yjDEsjTPQ+aWM+V+Z0I4kuTFKjKvgcT1F7xQ==
|
||||
|
||||
"@typescript-eslint/typescript-estree@3.6.0":
|
||||
version "3.6.0"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-3.6.0.tgz#9b4cab43f1192b64ff51530815b8919f166ce177"
|
||||
integrity sha512-G57NDSABHjvob7zVV09ehWyD1K6/YUKjz5+AufObFyjNO4DVmKejj47MHjVHHlZZKgmpJD2yyH9lfCXHrPITFg==
|
||||
"@typescript-eslint/typescript-estree@3.6.1":
|
||||
version "3.6.1"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-3.6.1.tgz#a5c91fcc5497cce7922ff86bc37d5e5891dcdefa"
|
||||
integrity sha512-G4XRe/ZbCZkL1fy09DPN3U0mR6SayIv1zSeBNquRFRk7CnVLgkC2ZPj8llEMJg5Y8dJ3T76SvTGtceytniaztQ==
|
||||
dependencies:
|
||||
"@typescript-eslint/types" "3.6.0"
|
||||
"@typescript-eslint/visitor-keys" "3.6.0"
|
||||
"@typescript-eslint/types" "3.6.1"
|
||||
"@typescript-eslint/visitor-keys" "3.6.1"
|
||||
debug "^4.1.1"
|
||||
glob "^7.1.6"
|
||||
is-glob "^4.0.1"
|
||||
@@ -705,10 +750,10 @@
|
||||
semver "^7.3.2"
|
||||
tsutils "^3.17.1"
|
||||
|
||||
"@typescript-eslint/visitor-keys@3.6.0":
|
||||
version "3.6.0"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-3.6.0.tgz#44185eb0cc47651034faa95c5e2e8b314ecebb26"
|
||||
integrity sha512-p1izllL2Ubwunite0ITjubuMQRBGgjdVYwyG7lXPX8GbrA6qF0uwSRz9MnXZaHMxID4948gX0Ez8v9tUDi/KfQ==
|
||||
"@typescript-eslint/visitor-keys@3.6.1":
|
||||
version "3.6.1"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-3.6.1.tgz#5c57a7772f4dd623cfeacc219303e7d46f963b37"
|
||||
integrity sha512-qC8Olwz5ZyMTZrh4Wl3K4U6tfms0R/mzU4/5W3XeUZptVraGVmbptJbn6h2Ey6Rb3hOs3zWoAUebZk8t47KGiQ==
|
||||
dependencies:
|
||||
eslint-visitor-keys "^1.1.0"
|
||||
|
||||
@@ -867,25 +912,26 @@
|
||||
resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d"
|
||||
integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==
|
||||
|
||||
"@yarnpkg/core@^2.0.0-rc.26":
|
||||
version "2.0.0-rc.30"
|
||||
resolved "https://registry.yarnpkg.com/@yarnpkg/core/-/core-2.0.0-rc.30.tgz#fd304711299630c8eee791081e56eeb1e0411fd2"
|
||||
integrity sha512-EMtSAi10ObT2d12YzT6bHyxEZ2p3CYgTtStQ5sZmTD4+iYKoOCBQX0z21PjWEzjeUnUCJnqZ/GAORIVkAUF0Fw==
|
||||
"@yarnpkg/core@^2.0.0-rc.29":
|
||||
version "2.1.1"
|
||||
resolved "https://registry.yarnpkg.com/@yarnpkg/core/-/core-2.1.1.tgz#637786eb2acd09b48db7af59f2287934a0a5afd7"
|
||||
integrity sha512-qeBxz8nHjKAbGTP2ZcXBnXGfM7+cN0A73mIai/24uru1ayvCIgfjWL1uIj/MM+m+K5lJX0Dcn94ZBHWits9JWQ==
|
||||
dependencies:
|
||||
"@yarnpkg/fslib" "^2.0.0-rc.22"
|
||||
"@yarnpkg/json-proxy" "^2.0.0-rc.9"
|
||||
"@yarnpkg/libzip" "^2.0.0-rc.13"
|
||||
"@yarnpkg/parsers" "^2.0.0-rc.13"
|
||||
"@yarnpkg/pnp" "^2.0.0-rc.23"
|
||||
"@yarnpkg/shell" "^2.0.0-rc.13"
|
||||
"@arcanis/slice-ansi" "^1.0.2"
|
||||
"@yarnpkg/fslib" "^2.1.0"
|
||||
"@yarnpkg/json-proxy" "^2.1.0"
|
||||
"@yarnpkg/libzip" "^2.1.0"
|
||||
"@yarnpkg/parsers" "^2.1.0"
|
||||
"@yarnpkg/pnp" "^2.1.0"
|
||||
"@yarnpkg/shell" "^2.1.0"
|
||||
camelcase "^5.3.1"
|
||||
chalk "^3.0.0"
|
||||
clipanion "^2.4.1"
|
||||
ci-info "^2.0.0"
|
||||
clipanion "^2.4.2"
|
||||
cross-spawn "7.0.3"
|
||||
diff "^4.0.1"
|
||||
globby "^10.0.1"
|
||||
got "^11.1.3"
|
||||
is-ci "^2.0.0"
|
||||
json-file-plus "^3.3.1"
|
||||
logic-solver "^2.0.1"
|
||||
micromatch "^4.0.2"
|
||||
@@ -899,26 +945,26 @@
|
||||
tslib "^1.13.0"
|
||||
tunnel "^0.0.6"
|
||||
|
||||
"@yarnpkg/fslib@^2.0.0-rc.22":
|
||||
version "2.0.0-rc.22"
|
||||
resolved "https://registry.yarnpkg.com/@yarnpkg/fslib/-/fslib-2.0.0-rc.22.tgz#517650b9fa0ab1463087f592104e15e1d60b3ea7"
|
||||
integrity sha512-O6sF4ceVtY7oXcoL98qb9/Xj7bzZBYDmMLAWvbS/85atB+3//l47hfelQuvMa/p4lt1s+ZLjGehxPAbTmcGbSA==
|
||||
"@yarnpkg/fslib@^2.1.0":
|
||||
version "2.1.0"
|
||||
resolved "https://registry.yarnpkg.com/@yarnpkg/fslib/-/fslib-2.1.0.tgz#c7039ec369a8fde06932cbddb3d3e473d789c458"
|
||||
integrity sha512-E+f8w5yQZnTf1soyTWy7qdf+GmHsY+A0yEN4Di44/Txk6XRIMruyc1ShDi93mOI6ilnXxD87rNms18zJ8WnspA==
|
||||
dependencies:
|
||||
"@yarnpkg/libzip" "^2.0.0-rc.13"
|
||||
"@yarnpkg/libzip" "^2.1.0"
|
||||
tslib "^1.13.0"
|
||||
|
||||
"@yarnpkg/json-proxy@^2.0.0-rc.9":
|
||||
version "2.0.0-rc.9"
|
||||
resolved "https://registry.yarnpkg.com/@yarnpkg/json-proxy/-/json-proxy-2.0.0-rc.9.tgz#c4c2a2f0bdaa4f99912dbda07d71d6abd6a25eb7"
|
||||
integrity sha512-ndaNE2DtoSZDMD/mDNYWIMKV+bJsrUzFeqDlFrHN7A1b3XXgsxD3B/HxL5O5eZYttVNHj+tG0MjYCqmC8s0KdA==
|
||||
"@yarnpkg/json-proxy@^2.1.0":
|
||||
version "2.1.0"
|
||||
resolved "https://registry.yarnpkg.com/@yarnpkg/json-proxy/-/json-proxy-2.1.0.tgz#362a161678cd7dda74b47b4fc848a2f1730d16cd"
|
||||
integrity sha512-rOgCg2DkyviLgr80mUMTt9vzdf5RGOujQB26yPiXjlz4WNePLBshKlTNG9rKSoKQSOYEQcw6cUmosfOKDatrCw==
|
||||
dependencies:
|
||||
"@yarnpkg/fslib" "^2.0.0-rc.22"
|
||||
"@yarnpkg/fslib" "^2.1.0"
|
||||
tslib "^1.13.0"
|
||||
|
||||
"@yarnpkg/libzip@^2.0.0-rc.13":
|
||||
version "2.0.0-rc.13"
|
||||
resolved "https://registry.yarnpkg.com/@yarnpkg/libzip/-/libzip-2.0.0-rc.13.tgz#e4e936a122b87e9be4b60805a32734b458a39421"
|
||||
integrity sha512-DKAG6nhFHepKzoxsKSrNUiM4LWelx/APUU0YE/x+PRXHEcuGjL7Z4t/deRX1FxcICFZyshIQ4kZUNaTt3pXHNg==
|
||||
"@yarnpkg/libzip@^2.1.0":
|
||||
version "2.1.0"
|
||||
resolved "https://registry.yarnpkg.com/@yarnpkg/libzip/-/libzip-2.1.0.tgz#f45d861a853555a063f90a85142199e7cf181b71"
|
||||
integrity sha512-39c7KuSWcYUqVxlBLZwfqdD/D6lS+jplNVWd6uAnk8EpnacaYGJRegvkqWyfw5c8KHukNMeEGF5JHrXPZYBM0w==
|
||||
dependencies:
|
||||
"@types/emscripten" "^1.38.0"
|
||||
tslib "^1.13.0"
|
||||
@@ -928,31 +974,31 @@
|
||||
resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31"
|
||||
integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==
|
||||
|
||||
"@yarnpkg/parsers@^2.0.0-rc.13":
|
||||
version "2.0.0-rc.13"
|
||||
resolved "https://registry.yarnpkg.com/@yarnpkg/parsers/-/parsers-2.0.0-rc.13.tgz#b1e7d5a2171362a83a2f2b4cefcefd988e7c6518"
|
||||
integrity sha512-R6dJTiy6Bx33uH3kDXJ3MfjG6vWBman+L+3Ycdz5DQeTRyD+ABUtssgsM2gKnJ8KgOOV0BWoX5cpS5yWCa/tbg==
|
||||
"@yarnpkg/parsers@^2.1.0":
|
||||
version "2.1.0"
|
||||
resolved "https://registry.yarnpkg.com/@yarnpkg/parsers/-/parsers-2.1.0.tgz#52615acdb54803d6404d6fb8f15fa124936bff1f"
|
||||
integrity sha512-75OYQ6PMs1C3zm+W+T1xhLyVDX78zXQGEVHpWd4o/QwpAbhneB3/5FXVGRzI3gjPPWWSb/pKOPB1S6p0xmQD2Q==
|
||||
dependencies:
|
||||
js-yaml "^3.10.0"
|
||||
tslib "^1.13.0"
|
||||
|
||||
"@yarnpkg/pnp@^2.0.0-rc.23":
|
||||
version "2.0.0-rc.23"
|
||||
resolved "https://registry.yarnpkg.com/@yarnpkg/pnp/-/pnp-2.0.0-rc.23.tgz#645a93c5dae4a78c71a9a09877daf4497e523f18"
|
||||
integrity sha512-ROBvzkQ+7nGq4GWaPgKS7S7p2OFmChnoPy/I6wsBfCo2KAWyEW+xsSLrx9Tr4bzm4XVg44gAWLmx6ncR2V4fcw==
|
||||
"@yarnpkg/pnp@^2.1.0":
|
||||
version "2.1.0"
|
||||
resolved "https://registry.yarnpkg.com/@yarnpkg/pnp/-/pnp-2.1.0.tgz#0eba881ccd4675594198e7f1e327fe11a845291b"
|
||||
integrity sha512-b8NlB71EFifv1jDX47nFaRXrykROxHcS7YuGb2dQ+Gp9gqJ0thIaZ3yB9+qWF8acdWtNcMpjCug4xkfAAR5Odw==
|
||||
dependencies:
|
||||
"@types/node" "^13.7.0"
|
||||
"@yarnpkg/fslib" "^2.0.0-rc.22"
|
||||
"@yarnpkg/fslib" "^2.1.0"
|
||||
tslib "^1.13.0"
|
||||
|
||||
"@yarnpkg/shell@^2.0.0-rc.13":
|
||||
version "2.0.0-rc.13"
|
||||
resolved "https://registry.yarnpkg.com/@yarnpkg/shell/-/shell-2.0.0-rc.13.tgz#61312707d2a8f3c73692ac674c2937c9d4c3cbfe"
|
||||
integrity sha512-W00zIxLDVOH5QgGWT61FhD80nW2Doy9Mc+vTwodlv1Suh/AqUnmtkn5k4O+JV+Ky6Qhn+NQsHdq/OV8Hd0CzQA==
|
||||
"@yarnpkg/shell@^2.1.0":
|
||||
version "2.1.0"
|
||||
resolved "https://registry.yarnpkg.com/@yarnpkg/shell/-/shell-2.1.0.tgz#e0855e59d4df663d8fe9044950a7fd390110cd4b"
|
||||
integrity sha512-9i9ZWqeKHGV0DOfdxTVq5zl73Li8Fg947v57uLBEaytNF+HywkDfouNkg/6HfgBrpI0WH8OJ9Pz/uDaE5cpctw==
|
||||
dependencies:
|
||||
"@yarnpkg/fslib" "^2.0.0-rc.22"
|
||||
"@yarnpkg/parsers" "^2.0.0-rc.13"
|
||||
clipanion "^2.4.1"
|
||||
"@yarnpkg/fslib" "^2.1.0"
|
||||
"@yarnpkg/parsers" "^2.1.0"
|
||||
clipanion "^2.4.2"
|
||||
cross-spawn "7.0.3"
|
||||
fast-glob "^3.2.2"
|
||||
stream-buffers "^3.0.2"
|
||||
@@ -1016,21 +1062,11 @@ ajv-errors@^1.0.0:
|
||||
integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==
|
||||
|
||||
ajv-keywords@^3.1.0, ajv-keywords@^3.4.1:
|
||||
version "3.5.0"
|
||||
resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.0.tgz#5c894537098785926d71e696114a53ce768ed773"
|
||||
integrity sha512-eyoaac3btgU8eJlvh01En8OCKzRqlLe2G5jDsCr3RiE2uLGMEEB1aaGwVVpwR8M95956tGH6R+9edC++OvzaVw==
|
||||
version "3.5.1"
|
||||
resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.1.tgz#b83ca89c5d42d69031f424cad49aada0236c6957"
|
||||
integrity sha512-KWcq3xN8fDjSB+IMoh2VaXVhRI0BBGxoYp3rx7Pkb6z0cFjYR9Q9l4yZqqals0/zsioCmocC5H6UvsGD4MoIBA==
|
||||
|
||||
ajv@^6.1.0, ajv@^6.10.2:
|
||||
version "6.12.2"
|
||||
resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.2.tgz#c629c5eced17baf314437918d2da88c99d5958cd"
|
||||
integrity sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==
|
||||
dependencies:
|
||||
fast-deep-equal "^3.1.1"
|
||||
fast-json-stable-stringify "^2.0.0"
|
||||
json-schema-traverse "^0.4.1"
|
||||
uri-js "^4.2.2"
|
||||
|
||||
ajv@^6.10.0, ajv@^6.12.2:
|
||||
ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, 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==
|
||||
@@ -1246,6 +1282,11 @@ asynckit@^0.4.0:
|
||||
resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
|
||||
integrity sha1-x57Zf380y48robyXkLzDZkdLS3k=
|
||||
|
||||
at-least-node@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2"
|
||||
integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==
|
||||
|
||||
atob@^2.1.2:
|
||||
version "2.1.2"
|
||||
resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9"
|
||||
@@ -1650,6 +1691,11 @@ chardet@^0.7.0:
|
||||
resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e"
|
||||
integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==
|
||||
|
||||
child-process@^1.0.2:
|
||||
version "1.0.2"
|
||||
resolved "https://registry.yarnpkg.com/child-process/-/child-process-1.0.2.tgz#98974dc7ed1ee4c6229f8e305fa7313a6885a7f2"
|
||||
integrity sha1-mJdNx+0e5MYin44wX6cxOmiFp/I=
|
||||
|
||||
chokidar@^2.1.8:
|
||||
version "2.1.8"
|
||||
resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917"
|
||||
@@ -1741,7 +1787,7 @@ cli-width@^2.0.0:
|
||||
resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48"
|
||||
integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==
|
||||
|
||||
clipanion@^2.4.1:
|
||||
clipanion@^2.4.2:
|
||||
version "2.4.2"
|
||||
resolved "https://registry.yarnpkg.com/clipanion/-/clipanion-2.4.2.tgz#2dfd52f7eb3cd472752c35d868dd4eb47cb98145"
|
||||
integrity sha512-kBCYtQKI4/R/zjierdwoDAsNUSvoh4pX2tseYxgLYQcKIpdPsHZrFWiQOfbe2Scd/btsqJEc4q6g55q0p5DZAw==
|
||||
@@ -2346,9 +2392,9 @@ end-of-stream@~1.1.0:
|
||||
once "~1.3.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==
|
||||
version "4.3.0"
|
||||
resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz#3b806f3bfafc1ec7de69551ef93cca46c1704126"
|
||||
integrity sha512-3e87LvavsdxyoCfGusJnrZ5G8SLPOFeHSNpZI/ATL9a5leXo2k0w6MKnbqhdBad9qTobSfB20Ld7UmgoNbAZkQ==
|
||||
dependencies:
|
||||
graceful-fs "^4.1.2"
|
||||
memory-fs "^0.5.0"
|
||||
@@ -2923,6 +2969,16 @@ fs-constants@^1.0.0:
|
||||
resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad"
|
||||
integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==
|
||||
|
||||
fs-extra@^9.0.1:
|
||||
version "9.0.1"
|
||||
resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.0.1.tgz#910da0062437ba4c39fedd863f1675ccfefcb9fc"
|
||||
integrity sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==
|
||||
dependencies:
|
||||
at-least-node "^1.0.0"
|
||||
graceful-fs "^4.2.0"
|
||||
jsonfile "^6.0.1"
|
||||
universalify "^1.0.0"
|
||||
|
||||
fs-minipass@^1.2.5:
|
||||
version "1.2.7"
|
||||
resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7"
|
||||
@@ -3085,19 +3141,18 @@ good-listener@^1.2.2:
|
||||
delegate "^3.1.2"
|
||||
|
||||
got@^11.1.3:
|
||||
version "11.3.0"
|
||||
resolved "https://registry.yarnpkg.com/got/-/got-11.3.0.tgz#25e8da8b0125b3b984613a6b719e678dd2e20406"
|
||||
integrity sha512-yi/kiZY2tNMtt5IfbfX8UL3hAZWb2gZruxYZ72AY28pU5p0TZjZdl0uRsuaFbnC0JopdUi3I+Mh1F3dPQ9Dh0Q==
|
||||
version "11.5.0"
|
||||
resolved "https://registry.yarnpkg.com/got/-/got-11.5.0.tgz#55dd61050f666679f46c49c877e1b2e064a7a523"
|
||||
integrity sha512-vOZEcEaK0b6x11uniY0HcblZObKPRO75Jvz53VKuqGSaKCM/zEt0sj2LGYVdqDYJzO3wYdG+FPQQ1hsgoXy7vQ==
|
||||
dependencies:
|
||||
"@sindresorhus/is" "^2.1.1"
|
||||
"@sindresorhus/is" "^3.0.0"
|
||||
"@szmarczak/http-timer" "^4.0.5"
|
||||
"@types/cacheable-request" "^6.0.1"
|
||||
"@types/responselike" "^1.0.0"
|
||||
cacheable-lookup "^5.0.3"
|
||||
cacheable-request "^7.0.1"
|
||||
decompress-response "^6.0.0"
|
||||
get-stream "^5.1.0"
|
||||
http2-wrapper "^1.0.0-beta.4.5"
|
||||
http2-wrapper "^1.0.0-beta.4.8"
|
||||
lowercase-keys "^2.0.0"
|
||||
p-cancelable "^2.0.0"
|
||||
responselike "^2.0.0"
|
||||
@@ -3119,11 +3174,16 @@ got@^9.6.0:
|
||||
to-readable-stream "^1.0.0"
|
||||
url-parse-lax "^3.0.0"
|
||||
|
||||
graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2:
|
||||
graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0:
|
||||
version "4.2.4"
|
||||
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb"
|
||||
integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==
|
||||
|
||||
grapheme-splitter@^1.0.4:
|
||||
version "1.0.4"
|
||||
resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e"
|
||||
integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==
|
||||
|
||||
gunzip-maybe@^1.4.2:
|
||||
version "1.4.2"
|
||||
resolved "https://registry.yarnpkg.com/gunzip-maybe/-/gunzip-maybe-1.4.2.tgz#b913564ae3be0eda6f3de36464837a9cd94b98ac"
|
||||
@@ -3233,11 +3293,11 @@ hosted-git-info@^2.1.4, hosted-git-info@^2.7.1:
|
||||
integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==
|
||||
|
||||
hosted-git-info@^3.0.4:
|
||||
version "3.0.4"
|
||||
resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-3.0.4.tgz#be4973eb1fd2737b11c9c7c19380739bb249f60d"
|
||||
integrity sha512-4oT62d2jwSDBbLLFLZE+1vPuQ1h8p9wjrJ8Mqx5TjsyWmBMV5B13eJqn8pvluqubLf3cJPTfiYCIwNwDNmzScQ==
|
||||
version "3.0.5"
|
||||
resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-3.0.5.tgz#bea87905ef7317442e8df3087faa3c842397df03"
|
||||
integrity sha512-i4dpK6xj9BIpVOTboXIlKG9+8HMKggcrMX7WA24xZtKwX0TPelq/rbaS5rCKeNX8sJXZJGdSxpnEGtta+wismQ==
|
||||
dependencies:
|
||||
lru-cache "^5.1.1"
|
||||
lru-cache "^6.0.0"
|
||||
|
||||
http-assert@^1.3.0:
|
||||
version "1.4.1"
|
||||
@@ -3287,12 +3347,12 @@ http-proxy-agent@^2.1.0:
|
||||
agent-base "4"
|
||||
debug "3.1.0"
|
||||
|
||||
http2-wrapper@^1.0.0-beta.4.5:
|
||||
version "1.0.0-beta.4.6"
|
||||
resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-1.0.0-beta.4.6.tgz#9438f0fceb946c8cbd365076c228a4d3bd4d0143"
|
||||
integrity sha512-9oB4BiGDTI1FmIBlOF9OJ5hwJvcBEmPCqk/hy314Uhy2uq5TjekUZM8w8SPLLlUEM+mxNhXdPAXfrJN2Zbb/GQ==
|
||||
http2-wrapper@^1.0.0-beta.4.8:
|
||||
version "1.0.0-beta.5.2"
|
||||
resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-1.0.0-beta.5.2.tgz#8b923deb90144aea65cf834b016a340fc98556f3"
|
||||
integrity sha512-xYz9goEyBnC8XwXDTuC/MZ6t+MrKVQZOk4s7+PaDkwIsQd8IwqvM+0M6bA/2lvG8GHXcPdf+MejTUeO2LCPCeQ==
|
||||
dependencies:
|
||||
quick-lru "^5.0.0"
|
||||
quick-lru "^5.1.1"
|
||||
resolve-alpn "^1.0.0"
|
||||
|
||||
https-browserify@^1.0.0:
|
||||
@@ -3742,6 +3802,15 @@ json5@^1.0.1:
|
||||
dependencies:
|
||||
minimist "^1.2.0"
|
||||
|
||||
jsonfile@^6.0.1:
|
||||
version "6.0.1"
|
||||
resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.0.1.tgz#98966cba214378c8c84b82e085907b40bf614179"
|
||||
integrity sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==
|
||||
dependencies:
|
||||
universalify "^1.0.0"
|
||||
optionalDependencies:
|
||||
graceful-fs "^4.1.6"
|
||||
|
||||
jszip@3.3.0:
|
||||
version "3.3.0"
|
||||
resolved "https://registry.yarnpkg.com/jszip/-/jszip-3.3.0.tgz#29d72c21a54990fa885b11fc843db320640d5271"
|
||||
@@ -4028,6 +4097,11 @@ lodash.filter@^4.6.0:
|
||||
resolved "https://registry.yarnpkg.com/lodash.filter/-/lodash.filter-4.6.0.tgz#668b1d4981603ae1cc5a6fa760143e480b4c4ace"
|
||||
integrity sha1-ZosdSYFgOuHMWm+nYBQ+SAtMSs4=
|
||||
|
||||
lodash.flatmap@^4.5.0:
|
||||
version "4.5.0"
|
||||
resolved "https://registry.yarnpkg.com/lodash.flatmap/-/lodash.flatmap-4.5.0.tgz#ef8cbf408f6e48268663345305c6acc0b778702e"
|
||||
integrity sha1-74y/QI9uSCaGYzRTBcaswLd4cC4=
|
||||
|
||||
lodash.flatten@^4.4.0:
|
||||
version "4.4.0"
|
||||
resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f"
|
||||
@@ -4128,12 +4202,7 @@ lodash.values@^4.3.0:
|
||||
resolved "https://registry.yarnpkg.com/lodash.values/-/lodash.values-4.3.0.tgz#a3a6c2b0ebecc5c2cba1c17e6e620fe81b53d347"
|
||||
integrity sha1-o6bCsOvsxcLLocF+bmIP6BtT00c=
|
||||
|
||||
lodash@^4.17.14, lodash@^4.17.15:
|
||||
version "4.17.15"
|
||||
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548"
|
||||
integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==
|
||||
|
||||
lodash@^4.17.19:
|
||||
lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19:
|
||||
version "4.17.19"
|
||||
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b"
|
||||
integrity sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==
|
||||
@@ -4250,6 +4319,13 @@ markdown-it@^11.0.0:
|
||||
mdurl "^1.0.1"
|
||||
uc.micro "^1.0.5"
|
||||
|
||||
maxmind@^4.1.3:
|
||||
version "4.1.3"
|
||||
resolved "https://registry.yarnpkg.com/maxmind/-/maxmind-4.1.3.tgz#ed1060f45085b7ae2dc95cf5c1672f593d7fa076"
|
||||
integrity sha512-6foBs2wNAfZ7Hu3Ag3nFiIs0gVlHtP1UioHHOuYBi2fH24Ngc5XujUi2GLk0r2HJLjRAaYgaSSTnRoIPs/RWNw==
|
||||
dependencies:
|
||||
tiny-lru "7.0.6"
|
||||
|
||||
md5.js@^1.3.4:
|
||||
version "1.3.5"
|
||||
resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f"
|
||||
@@ -4559,9 +4635,9 @@ negotiator@0.6.2:
|
||||
integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==
|
||||
|
||||
neo-async@^2.5.0, neo-async@^2.6.1:
|
||||
version "2.6.1"
|
||||
resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c"
|
||||
integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==
|
||||
version "2.6.2"
|
||||
resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f"
|
||||
integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==
|
||||
|
||||
netmask@^1.0.6:
|
||||
version "1.0.6"
|
||||
@@ -4977,6 +5053,13 @@ parse-json@^2.2.0:
|
||||
dependencies:
|
||||
error-ex "^1.2.0"
|
||||
|
||||
parse-link-header@^1.0.1:
|
||||
version "1.0.1"
|
||||
resolved "https://registry.yarnpkg.com/parse-link-header/-/parse-link-header-1.0.1.tgz#bedfe0d2118aeb84be75e7b025419ec8a61140a7"
|
||||
integrity sha1-vt/g0hGK64S+deewJUGeyKYRQKc=
|
||||
dependencies:
|
||||
xtend "~4.0.1"
|
||||
|
||||
parseurl@^1.3.2:
|
||||
version "1.3.3"
|
||||
resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4"
|
||||
@@ -5284,7 +5367,7 @@ querystring@0.2.0:
|
||||
resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620"
|
||||
integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=
|
||||
|
||||
quick-lru@^5.0.0:
|
||||
quick-lru@^5.1.1:
|
||||
version "5.1.1"
|
||||
resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932"
|
||||
integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==
|
||||
@@ -5403,9 +5486,9 @@ regexpp@^3.0.0, regexpp@^3.1.0:
|
||||
integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==
|
||||
|
||||
registry-auth-token@^4.0.0:
|
||||
version "4.1.1"
|
||||
resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.1.1.tgz#40a33be1e82539460f94328b0f7f0f84c16d9479"
|
||||
integrity sha512-9bKS7nTl9+/A1s7tnPeGrUpRcVY+LUh7bfFgzpndALdPfXQBfQV77rQVtqgUV3ti4vc/Ik81Ex8UJDWDQ12zQA==
|
||||
version "4.2.0"
|
||||
resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.2.0.tgz#1d37dffda72bbecd0f581e4715540213a65eb7da"
|
||||
integrity sha512-P+lWzPrsgfN+UEpDS3U8AQKg/UjZX6mQSJueZj3EK+vNESoqBSpBUD3gmu4sF9lOsjXWjF11dQKUqemf3veq1w==
|
||||
dependencies:
|
||||
rc "^1.2.8"
|
||||
|
||||
@@ -5783,12 +5866,13 @@ snyk-config@^3.0.0:
|
||||
lodash.merge "^4.6.2"
|
||||
nconf "^0.10.0"
|
||||
|
||||
snyk-docker-plugin@3.12.3:
|
||||
version "3.12.3"
|
||||
resolved "https://registry.yarnpkg.com/snyk-docker-plugin/-/snyk-docker-plugin-3.12.3.tgz#3b451139ac3b59c896d3c2703113da7c975f650f"
|
||||
integrity sha512-Ysv7ZDvXFt6K11f1m6wJaqYS3yM7c8YhzOIPoEmrYZW+4tL+Al5DiyKaAQBudbfYEA7xa6S6qGqE3QRitHZ5nQ==
|
||||
snyk-docker-plugin@3.13.1:
|
||||
version "3.13.1"
|
||||
resolved "https://registry.yarnpkg.com/snyk-docker-plugin/-/snyk-docker-plugin-3.13.1.tgz#d7befe89dce13a597ce0528595b9a9e0981348f4"
|
||||
integrity sha512-4GEZ8Rx+1K33i0SuMRO03T+n8jAosLae4iuo1TZu9ugkxdQzbBStzVFz2N6x1s0GI/psWQNOWSLKfzFJYMOctw==
|
||||
dependencies:
|
||||
"@snyk/rpm-parser" "^2.0.0"
|
||||
"@snyk/snyk-docker-pull" "^3.1.3"
|
||||
debug "^4.1.1"
|
||||
docker-modem "2.1.3"
|
||||
dockerfile-ast "0.0.19"
|
||||
@@ -5797,6 +5881,7 @@ snyk-docker-plugin@3.12.3:
|
||||
semver "^6.1.0"
|
||||
snyk-nodejs-lockfile-parser "1.22.0"
|
||||
tar-stream "^2.1.0"
|
||||
tmp "^0.2.1"
|
||||
tslib "^1"
|
||||
|
||||
snyk-go-parser@1.4.1:
|
||||
@@ -5884,16 +5969,17 @@ snyk-nodejs-lockfile-parser@1.22.0:
|
||||
tslib "^1.9.3"
|
||||
uuid "^3.3.2"
|
||||
|
||||
snyk-nodejs-lockfile-parser@1.25.0:
|
||||
version "1.25.0"
|
||||
resolved "https://registry.yarnpkg.com/snyk-nodejs-lockfile-parser/-/snyk-nodejs-lockfile-parser-1.25.0.tgz#f11717987fc319fb57b6862646299bc63397be23"
|
||||
integrity sha512-eikMzCCxwViIh885TMRgr5X1DjDYJI7eK+F9bqtpL/UuPealpnefUoH/LGicPtUSRknMcZvI4nzM0QSNMJ3+5w==
|
||||
snyk-nodejs-lockfile-parser@1.26.3:
|
||||
version "1.26.3"
|
||||
resolved "https://registry.yarnpkg.com/snyk-nodejs-lockfile-parser/-/snyk-nodejs-lockfile-parser-1.26.3.tgz#3c530b1ead4f419a12bc0811dbbe820d6ff51342"
|
||||
integrity sha512-mBQ6vhnXAeyMxlnl9amjJWpA+/3qqXwM8Sj/P+9uH2TByOFLxdGzMNQFcl3q/H2yUdcs/epVdXJp09A2dK2glA==
|
||||
dependencies:
|
||||
"@snyk/graphlib" "2.1.9-patch"
|
||||
"@yarnpkg/core" "^2.0.0-rc.26"
|
||||
"@yarnpkg/core" "^2.0.0-rc.29"
|
||||
"@yarnpkg/lockfile" "^1.1.0"
|
||||
event-loop-spinner "^2.0.0"
|
||||
lodash.clonedeep "^4.5.0"
|
||||
lodash.flatmap "^4.5.0"
|
||||
lodash.isempty "^4.4.0"
|
||||
lodash.set "^4.3.2"
|
||||
lodash.topairs "^4.3.0"
|
||||
@@ -6016,9 +6102,9 @@ snyk-try-require@1.3.1, snyk-try-require@^1.1.1, snyk-try-require@^1.3.1:
|
||||
then-fs "^2.0.0"
|
||||
|
||||
snyk@^1.354.0:
|
||||
version "1.359.0"
|
||||
resolved "https://registry.yarnpkg.com/snyk/-/snyk-1.359.0.tgz#88a936e7b898ad1def4bba2dfe30dc53a760c4d8"
|
||||
integrity sha512-FkEtEUbuENZyhscXybO9Dej66P7sKwmEOnVZCCXRT7GDGclsTMaLUfedGmj1xvYic4fj5MRqBPS+khS7yOErcg==
|
||||
version "1.362.0"
|
||||
resolved "https://registry.yarnpkg.com/snyk/-/snyk-1.362.0.tgz#d735297b83e49254c5d5d968dd1e32ed39659242"
|
||||
integrity sha512-NT6OH1aPjDv9MvXriB0GVok7hmmWmo/TrTrUOKQsmKJi6ILqEAmDFk2EhaSHP2Niz5lrrFkSetYUmHAlWela6w==
|
||||
dependencies:
|
||||
"@snyk/cli-interface" "2.8.0"
|
||||
"@snyk/dep-graph" "1.18.3"
|
||||
@@ -6043,12 +6129,12 @@ snyk@^1.354.0:
|
||||
proxy-from-env "^1.0.0"
|
||||
semver "^6.0.0"
|
||||
snyk-config "3.1.0"
|
||||
snyk-docker-plugin "3.12.3"
|
||||
snyk-docker-plugin "3.13.1"
|
||||
snyk-go-plugin "1.14.2"
|
||||
snyk-gradle-plugin "3.5.1"
|
||||
snyk-module "3.1.0"
|
||||
snyk-mvn-plugin "2.17.1"
|
||||
snyk-nodejs-lockfile-parser "1.25.0"
|
||||
snyk-nodejs-lockfile-parser "1.26.3"
|
||||
snyk-nuget-plugin "1.18.1"
|
||||
snyk-php-plugin "1.9.0"
|
||||
snyk-policy "1.14.1"
|
||||
@@ -6387,9 +6473,9 @@ strip-eof@^1.0.0:
|
||||
integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=
|
||||
|
||||
strip-json-comments@^3.1.0:
|
||||
version "3.1.0"
|
||||
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.0.tgz#7638d31422129ecf4457440009fba03f9f9ac180"
|
||||
integrity sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w==
|
||||
version "3.1.1"
|
||||
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
|
||||
integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
|
||||
|
||||
strip-json-comments@~2.0.1:
|
||||
version "2.0.1"
|
||||
@@ -6460,10 +6546,10 @@ tapable@^1.0.0, tapable@^1.1.3:
|
||||
resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2"
|
||||
integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==
|
||||
|
||||
tar-stream@^2.1.0:
|
||||
version "2.1.2"
|
||||
resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.1.2.tgz#6d5ef1a7e5783a95ff70b69b97455a5968dc1325"
|
||||
integrity sha512-UaF6FoJ32WqALZGOIAApXx+OdxhekNMChu6axLJR85zMMjXKWFGjbIRe+J6P4UnRGg9rAwWvbTT0oI7hD/Un7Q==
|
||||
tar-stream@^2.1.0, tar-stream@^2.1.2:
|
||||
version "2.1.3"
|
||||
resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.1.3.tgz#1e2022559221b7866161660f118255e20fa79e41"
|
||||
integrity sha512-Z9yri56Dih8IaK8gncVPx4Wqt86NDmQTSh49XLZgjWpGZL9GK9HKParS2scqHCC4w6X9Gh2jwaU45V47XTKwVA==
|
||||
dependencies:
|
||||
bl "^4.0.1"
|
||||
end-of-stream "^1.4.1"
|
||||
@@ -6595,6 +6681,11 @@ tiny-glob@^0.2.6:
|
||||
globalyzer "^0.1.0"
|
||||
globrex "^0.1.1"
|
||||
|
||||
tiny-lru@7.0.6:
|
||||
version "7.0.6"
|
||||
resolved "https://registry.yarnpkg.com/tiny-lru/-/tiny-lru-7.0.6.tgz#b0c3cdede1e5882aa2d1ae21cb2ceccf2a331f24"
|
||||
integrity sha512-zNYO0Kvgn5rXzWpL0y3RS09sMK67eGaQj9805jlK9G6pSadfriTczzLHFXa/xcW4mIRfmlB9HyQ/+SgL0V1uow==
|
||||
|
||||
tmp@0.0.33, tmp@^0.0.33:
|
||||
version "0.0.33"
|
||||
resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9"
|
||||
@@ -6609,7 +6700,7 @@ tmp@0.1.0, tmp@^0.1.0:
|
||||
dependencies:
|
||||
rimraf "^2.6.3"
|
||||
|
||||
tmp@0.2.1:
|
||||
tmp@0.2.1, tmp@^0.2.1:
|
||||
version "0.2.1"
|
||||
resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14"
|
||||
integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==
|
||||
@@ -6674,9 +6765,9 @@ tree-kill@^1.2.2:
|
||||
integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==
|
||||
|
||||
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==
|
||||
version "8.0.1"
|
||||
resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-8.0.1.tgz#9670dcbce2a8c8506d01a37fee042350d02c8c21"
|
||||
integrity sha512-I9Nmly0ufJoZRMuAT9d5ijsC2B7oSPvUnOJt/GhgoATlPGYfa17VicDKPcqwUCrHpOkCxr/ybLYwbnS4cOxmvQ==
|
||||
dependencies:
|
||||
chalk "^2.3.0"
|
||||
enhanced-resolve "^4.0.0"
|
||||
@@ -6821,6 +6912,11 @@ unique-string@^2.0.0:
|
||||
dependencies:
|
||||
crypto-random-string "^2.0.0"
|
||||
|
||||
universalify@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/universalify/-/universalify-1.0.0.tgz#b61a1da173e8435b2fe3c67d29b9adf8594bd16d"
|
||||
integrity sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==
|
||||
|
||||
unpipe@1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
|
||||
|
||||
Reference in new issue
Block a user