build: add railway build config (#3311)

This commit is contained in:
野声 2024-01-29 11:02:04 +08:00 committed by GitHub
parent 977e9d5dda
commit 24f07ae208
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
36 changed files with 640 additions and 1220 deletions

View File

@ -13,6 +13,7 @@ tools/cli-engine/src/browser/worker-host.js
**/scripts/**
packages/*/lib/**
packages/**/dist/**
packages/**/dist-node/**
packages/components/src/icon/iconfont
packages/core-browser/src/style/octicons

View File

@ -52,6 +52,7 @@ jobs:
run: |
yarn run init
yarn run bundle:lite
yarn run bundle:prod
- name: Lint
run: |
@ -81,6 +82,7 @@ jobs:
yarn install --immutable
yarn run init
yarn run bundle:lite
yarn run bundle:prod
- name: Lint
run: |

1
.gitignore vendored
View File

@ -67,6 +67,7 @@ jspm_packages/
.yarn-integrity
dist
dist-node
lib
.vscode/*

14
nixpacks.toml Normal file
View File

@ -0,0 +1,14 @@
providers = ["..."]
[variables]
NODE_ENV = 'production'
[phases.setup]
nixPkgs = ["...", "libsecret"]
aptPkgs = ["...", "build-essential", "libsecret-1-dev"]
[phases.build]
cmds = ['yarn build:all', 'yarn bundle:prod', 'yarn download-extension']
[start]
cmd = 'node packages/startup/dist-node/server/server.js'

View File

@ -13,11 +13,12 @@
"build:components": "cd packages/components && yarn run build:dist",
"start:lite": "cross-env NODE_ENV=development ts-node ./scripts/start --script=start:lite",
"bundle:lite": "ts-node ./scripts/start --script=bundle:lite",
"bundle:prod": "ts-node ./scripts/start --script=bundle:prod",
"start:pty-service": "KTLOG_SHOW_DEBUG=1 npx ts-node packages/terminal-next/src/node/pty.proxy.remote.exec.ts",
"create": "ts-node ./scripts/create",
"add:node": "ts-node ./scripts/add-node",
"add:browser": "ts-node ./scripts/add-browser",
"build": "yarn run compile && echo 'use `compile` instead'",
"build": "yarn run compile",
"build:all": "yarn run build && yarn run build:worker-host && yarn run build:ext-host && yarn run build:components",
"compile": "cross-env NODE_ENV=production ts-node ./scripts/build",
"build:worker-host": "cd packages/extension && yarn run compile:worker",
@ -92,7 +93,7 @@
"@types/node-fetch": "^2.6.1",
"@types/react": "^18.0.0",
"@types/react-dom": "^18.0.0",
"@types/react-is": "^16.7.1",
"@types/react-is": "^18.2.4",
"@types/socket.io-client": "^1.4.32",
"@types/temp": "^0.9.1",
"@types/ws": "^8.5.10",
@ -111,7 +112,6 @@
"eslint-plugin-import": "^2.25.4",
"eslint-plugin-unused-imports": "^2.0.0",
"git-rev-sync": "^3.0.1",
"got": "^12.1.0",
"handlebars": "^4.7.3",
"is-git-clean": "^1.1.0",
"jest": "^29.7.0",
@ -143,8 +143,6 @@
"tools/cli-engine"
],
"resolutions": {
"@types/react": "^18.0.0",
"@types/react-dom": "^18.0.0",
"classnames": "2.3.1",
"node-gyp": "9.3.1"
},

View File

@ -19,6 +19,9 @@ module.exports = {
optimization: {
minimizer: [new OptimizeCSSAssetsPlugin({})],
},
cache: {
type: 'filesystem',
},
plugins: [
new MiniCssExtractPlugin({
filename: 'index.css',
@ -53,18 +56,6 @@ module.exports = {
{
test: /\.tsx?$/,
use: [
{
loader: 'cache-loader',
options: {
cacheDirectory: path.resolve(__dirname, '../../../.cache'),
},
},
{
loader: 'thread-loader',
options: {
workers: require('os').cpus().length - 1,
},
},
{
loader: 'ts-loader',
options: {

View File

@ -32,14 +32,12 @@
"lodash": "^4.17.21",
"mobx": "^5.9.4",
"mobx-react-lite": "^1.3.1",
"onigasm": "2.2.2",
"rc-menu": "^9.3.2",
"react": "^18.0.0",
"react-autosize-textarea": "^7.0.0",
"react-ctxmenu-trigger": "^1.0.0",
"react-custom-scrollbars": "^4.2.1",
"react-is": "^16.8.6",
"react-sticky": "^6.0.3",
"react-is": "^18.2.0",
"react-window": "^1.8.5",
"resize-observer-polyfill": "1.5.1",
"strip-json-comments": "3.0.1",

View File

@ -2,7 +2,7 @@ import http from 'http';
import path from 'path';
import Koa from 'koa';
import superagent from 'superagent';
import fetch from 'node-fetch';
import { IServerApp, AppConfig } from '@opensumi/ide-core-node';
import { createNodeInjector } from '@opensumi/ide-dev-tool/src/injector-helper';
@ -38,24 +38,18 @@ describe('template test', () => {
});
it('can get png if path in whitelist', async () => {
const res = await superagent.get(`http://0.0.0.0:50118/assets${path.join(resPath, 'icon.png')}`);
const res = await fetch(`http://0.0.0.0:50118/assets${path.join(resPath, 'icon.png')}`);
expect(res.status === 200);
});
it('response 403 if not in whitelist', async () => {
try {
await superagent.get('http://0.0.0.0:50118/assets/test');
} catch (err) {
expect(err.status === 403);
}
const res = await fetch('http://0.0.0.0:50118/assets/test');
expect(res.status === 403);
});
it('response 403 if not allowed mime', async () => {
try {
await superagent.get(`http://0.0.0.0:50118/assets${path.join(resPath, 'icon.exe')}`);
} catch (err) {
expect(err.status === 403);
}
const res = await fetch(`http://0.0.0.0:50118/assets${path.join(resPath, 'icon.exe')}`);
expect(res.status === 403);
});
afterAll(() => {

View File

@ -25,7 +25,6 @@
"devDependencies": {
"@opensumi/ide-core-browser": "workspace:*",
"@opensumi/ide-dev-tool": "workspace:*",
"@types/koa-mount": "^4.0.1",
"superagent": "^5.1.0"
"@types/koa-mount": "^4.0.1"
}
}

View File

@ -15,11 +15,9 @@
"@opensumi/ide-core-common": "workspace:*",
"@opensumi/ide-core-node": "workspace:*",
"@opensumi/ide-extension": "workspace:*",
"compressing": "^1.6.2",
"compressing": "^1.10.0",
"fs-extra": "^10.1.0",
"node-fetch": "^2.6.7",
"request": "2.*.*",
"requestretry": "^7.0.0"
"node-fetch": "^2.6.7"
},
"devDependencies": {
"@opensumi/ide-components": "workspace:*",
@ -29,8 +27,6 @@
"@opensumi/ide-markdown": "workspace:*",
"@opensumi/ide-overlay": "workspace:*",
"@opensumi/ide-theme": "workspace:*",
"@types/node-fetch": "^2.6.1",
"@types/requestretry": "^1.12.7",
"@types/uuid": "^8.3.4"
"@types/node-fetch": "^2.6.1"
}
}

View File

@ -1,10 +1,11 @@
import assert from 'assert';
import os from 'os';
import path from 'path';
import { pipeline } from 'stream';
import compressing from 'compressing';
import fs from 'fs-extra';
import requestretry from 'requestretry';
import nodeFetch, { RequestInit } from 'node-fetch';
import { Injectable, Autowired, INJECTOR_TOKEN, Injector } from '@opensumi/di';
import { uuid } from '@opensumi/ide-core-common';
@ -138,29 +139,38 @@ export class VSXExtensionService implements IVSXExtensionBackService {
const vsixFileName = id + '.vsix';
const downloadPath = path.join(extensionDir, vsixFileName);
return new Promise((resolve, reject) => {
requestretry(
url,
{
method: 'GET',
maxAttempts: 5,
retryDelay: 2000,
headers: this.getMarketplace().downloadHeaders,
retryStrategy: requestretry.RetryStrategies.HTTPOrNetworkError,
},
(err, response) => {
if (err) {
reject(err);
} else if (response && response.statusCode === 404) {
reject();
} else if (response && response.statusCode !== 200) {
reject(new Error(response.statusMessage));
}
},
)
.pipe(fs.createWriteStream(downloadPath))
.on('error', reject)
.on('close', () => resolve({ downloadPath }));
const res = await nodeFetchRetry(
url,
{
method: 'GET',
headers: this.getMarketplace().downloadHeaders,
},
{
maxAttempts: 5,
retryDelay: 2000,
},
);
assert(res, `download extension ${id} from ${url} failed`);
if (res.status === 404) {
throw new Error(`extension ${id} not found`);
}
if (res.status !== 200) {
throw new Error(`download extension ${id} from ${url} failed, status: ${res?.status} ${res?.statusText}`);
}
return await new Promise((resolve, reject) => {
const fileStream = fs.createWriteStream(downloadPath);
res.body.pipe(fileStream);
res.body.on('error', (err) => {
reject(err);
});
fileStream.on('finish', function () {
resolve({ downloadPath });
});
});
}
@ -168,3 +178,33 @@ export class VSXExtensionService implements IVSXExtensionBackService {
return await this.getMarketplace().search(param);
}
}
function sleep(ms) {
return new Promise((resolve) => setTimeout(resolve, ms));
}
const nodeFetchRetry = async (
url: string,
fetchOptions: RequestInit,
opts: {
maxAttempts: number;
retryDelay: number;
},
) => {
let retry = (opts && opts.maxAttempts) || 3;
while (retry > 0) {
try {
return nodeFetch(url, fetchOptions);
} catch (e) {
retry = retry - 1;
if (retry === 0) {
throw e;
}
if (opts && opts.retryDelay) {
await sleep(opts.retryDelay);
}
}
}
};

View File

@ -187,7 +187,7 @@ export class ExtensionNodeServiceImpl implements IExtensionNodeService {
if (notExistExtension) {
// 进程未调用启动直接连接
this.logger.error(`${clientId} clientId process connection set error`, extProcessId);
this.logger.error(`${clientId} clientId process connection not exists`);
/**
*
* ProcessCloseExitThreshold

View File

@ -21,7 +21,6 @@
"dependencies": {
"@opensumi/ide-utils": "workspace:*",
"chalk": "^4.1.2",
"got": "^12.1.0",
"mri": "^1.2.0"
},
"devDependencies": {

View File

@ -3,6 +3,7 @@ import { statSync, existsSync } from 'fs';
import { join } from 'path';
import { green, red } from 'chalk';
import fetch from 'node-fetch';
import { ArgvFactory } from '@opensumi/ide-utils/lib/argv';
@ -45,12 +46,10 @@ function openPathOrUrl(pathOrUrl: string): void {
}
const query = `?type=${type}&${type}=${encodeURIComponent(fullPathOrUrl)}&clientId=${CLIENT_ID}`;
import('got').then(({ default: got }) => {
got(`${SUMI_SERVER_HOST}/${OPENER_ROUTE}${query}`).catch((err) => {
// eslint-disable-next-line no-console
console.error(red(`Open ${type} ${fullPathOrUrl} error: \n ${err.message}`));
process.exit(1);
});
fetch(`${SUMI_SERVER_HOST}/${OPENER_ROUTE}${query}`).catch((err) => {
// eslint-disable-next-line no-console
console.error(red(`Open ${type} ${fullPathOrUrl} error: \n ${err.message}`));
process.exit(1);
});
}

View File

@ -10,48 +10,13 @@ setLocale(defaultLanguage);
import '@opensumi/ide-i18n';
import '@opensumi/ide-core-browser/lib/style/index.less';
import { SlotLocation } from '@opensumi/ide-core-browser';
import { ExpressFileServerModule } from '@opensumi/ide-express-file-server/lib/browser';
import { defaultConfig } from '@opensumi/ide-main-layout/lib/browser/default-config';
import { RemoteOpenerModule } from '@opensumi/ide-remote-opener/lib/browser';
import { CommonBrowserModules } from '../../src/browser/common-modules';
import { SampleModule } from '../sample-modules';
import { renderApp } from './render-app';
import { getDefaultClientAppOpts, renderApp } from './render-app';
import '../styles.less';
renderApp({
modules: [...CommonBrowserModules, ExpressFileServerModule, SampleModule, RemoteOpenerModule],
layoutConfig: {
...defaultConfig,
...{
[SlotLocation.top]: {
modules: ['menubar', 'toolbar'],
},
},
...{
[SlotLocation.action]: {
modules: ['@opensumi/ide-toolbar-action'],
},
},
},
useCdnIcon: true,
useExperimentalShadowDom: true,
defaultPreferences: {
'general.language': defaultLanguage,
'general.theme': 'opensumi-dark',
'general.icon': 'vscode-icons',
'application.confirmExit': 'never',
'editor.quickSuggestionsDelay': 100,
},
defaultPanels: {
bottom: '@opensumi/ide-terminal-next',
right: '',
},
// 当 `.sumi` 下不存在配置文件时,默认采用 `.vscode` 下的配置
useVSCodeWorkspaceConfiguration: true,
// 开启 core-browser 对 OpenSumi DevTools 的支持,默认为关闭
devtools: true,
});
renderApp(
getDefaultClientAppOpts({
defaultLanguage,
}),
);

View File

@ -0,0 +1,30 @@
// eslint-disable-next-line import/order
import { LOCALE_TYPES } from '@opensumi/ide-core-common/lib/const';
const defaultLanguage = LOCALE_TYPES.EN_US;
// eslint-disable-next-line import/order
import { setLocale } from '@opensumi/ide-monaco/lib/browser/monaco-localize';
// 请注意,集成方在这里需要自己传一个正确的 locale 进去
// 如果不传则默认会根据 PreferenceScope 的优先级从 LocalStorage 取值
setLocale(defaultLanguage);
import '@opensumi/ide-i18n';
import '@opensumi/ide-core-browser/lib/style/index.less';
import { getDefaultClientAppOpts, renderApp } from '../render-app';
import '../../styles.less';
const hostname = window.location.hostname;
const port = window.location.port;
renderApp(
getDefaultClientAppOpts({
defaultLanguage,
opts: {
webviewEndpoint: '/webview',
extWorkerHost: '/worker-host.js',
wsPath: window.location.protocol === 'https:' ? `wss://${hostname}:${port}` : `ws://${hostname}:${port}`,
},
}),
);

View File

@ -0,0 +1,16 @@
/* eslint-disable no-console */
import path from 'path';
import { startServer } from '@opensumi/ide-dev-tool/src/server';
import { ExpressFileServerModule } from '@opensumi/ide-express-file-server/lib/node';
import { CommonNodeModules } from '../../../src/node/common-modules';
startServer(
{
modules: [...CommonNodeModules, ExpressFileServerModule],
},
{
mountStaticPath: path.join(__dirname, '../../dist'),
},
);

View File

@ -3,12 +3,20 @@ console.time('Render');
import { Injector } from '@opensumi/di';
import { IClientAppOpts } from '@opensumi/ide-core-browser';
import { SlotLocation } from '@opensumi/ide-core-browser';
import { ClientApp } from '@opensumi/ide-core-browser/lib/bootstrap/app';
import { uuid } from '@opensumi/ide-core-common';
import { ExpressFileServerModule } from '@opensumi/ide-express-file-server/lib/browser';
import { defaultConfig } from '@opensumi/ide-main-layout/lib/browser/default-config';
import { RemoteOpenerModule } from '@opensumi/ide-remote-opener/lib/browser';
import { CommonBrowserModules } from '../../src/browser/common-modules';
import { SampleModule } from '../sample-modules';
import { DefaultLayout } from './layout';
const CLIENT_ID = 'W_' + uuid();
export async function renderApp(opts: IClientAppOpts) {
const defaultHost = process.env.HOST || window.location.hostname;
const injector = new Injector();
@ -19,11 +27,13 @@ export async function renderApp(opts: IClientAppOpts) {
opts.injector = injector;
opts.extensionDir = opts.extensionDir || process.env.EXTENSION_DIR;
opts.wsPath = process.env.WS_PATH || `ws://${defaultHost}:8000`;
opts.wsPath = opts.wsPath || process.env.WS_PATH || `ws://${defaultHost}:8000`;
opts.extWorkerHost = opts.extWorkerHost || process.env.EXTENSION_WORKER_HOST;
const anotherHostName = process.env.WEBVIEW_HOST || defaultHost;
opts.webviewEndpoint = `http://${anotherHostName}:8899`;
opts.webviewEndpoint = opts.webviewEndpoint || `http://${anotherHostName}:8899`;
opts.editorBackgroundImage =
'https://img.alicdn.com/imgextra/i2/O1CN01dqjQei1tpbj9z9VPH_!!6000000005951-55-tps-87-78.svg';
opts.layoutComponent = DefaultLayout;
@ -41,3 +51,44 @@ export async function renderApp(opts: IClientAppOpts) {
app.start(document.getElementById('main')!, 'web');
}
export const getDefaultClientAppOpts = ({
defaultLanguage,
opts = {},
}: {
defaultLanguage: string;
opts?: Partial<IClientAppOpts>;
}): IClientAppOpts => ({
modules: [...CommonBrowserModules, ExpressFileServerModule, SampleModule, RemoteOpenerModule],
layoutConfig: {
...defaultConfig,
...{
[SlotLocation.top]: {
modules: ['menubar', 'toolbar'],
},
},
...{
[SlotLocation.action]: {
modules: ['@opensumi/ide-toolbar-action'],
},
},
},
useCdnIcon: true,
useExperimentalShadowDom: true,
defaultPreferences: {
'general.language': defaultLanguage,
'general.theme': 'opensumi-dark',
'general.icon': 'vscode-icons',
'application.confirmExit': 'never',
'editor.quickSuggestionsDelay': 100,
},
defaultPanels: {
bottom: '@opensumi/ide-terminal-next',
right: '',
},
// 当 `.sumi` 下不存在配置文件时,默认采用 `.vscode` 下的配置
useVSCodeWorkspaceConfiguration: true,
// 开启 core-browser 对 OpenSumi DevTools 的支持,默认为关闭
devtools: true,
...opts,
});

View File

@ -1,3 +1,5 @@
import 'tsconfig-paths/register';
import { startServer } from '@opensumi/ide-dev-tool/src/server';
import { ExpressFileServerModule } from '@opensumi/ide-express-file-server/lib/node';
import { OpenerModule } from '@opensumi/ide-remote-opener/lib/node';

View File

@ -24,7 +24,8 @@
"bundle:standard:analysis": "cross-env analysis=1 yarn run bundle:standard",
"bundle:lite": "cross-env NODE_ENV=production webpack --config webpack.lite.config.js",
"bundle:lite:stats": "cross-env NODE_ENV=production webpack --profile --config webpack.lite.config.js --json > stats.json",
"bundle:lite:analysis": "cross-env analysis=1 yarn run bundle:lite"
"bundle:lite:analysis": "cross-env analysis=1 yarn run bundle:lite",
"bundle:prod": "cross-env SKIP_TS_CHECKER=1 NODE_ENV=production webpack --config webpack.prod.config.js"
},
"repository": {
"type": "git",

View File

@ -1,24 +0,0 @@
var express = require('express');
var app = express();
var httpProxy = require('http-proxy');
var proxy = httpProxy.createProxyServer({ target: 'http://localhost:8000', ws: true });
var server = require('http').createServer(app);
// proxy HTTP GET / POST
app.get('/*', function (req, res) {
console.log("proxying GET request", req.url);
proxy.web(req, res, {});
});
app.post('/*/*', function (req, res) {
console.log("proxying POST request", req.url);
proxy.web(req, res, {});
});
// Proxy websockets
server.on('upgrade', function (req, socket, head) {
console.log("proxying upgrade request", req.url);
proxy.ws(req, socket, head);
});
server.listen(8001);

View File

@ -7,7 +7,6 @@ const baseDir = path.join(__dirname, 'entry/web-lite');
const { createWebpackConfig } = require('@opensumi/ide-dev-tool/src/webpack');
module.exports = createWebpackConfig(baseDir, path.join(baseDir, 'app.tsx'), {
mode: process.env.NODE_ENV || 'development',
resolve: {
alias: {
fs: 'browserfs/dist/shims/fs.js',

View File

@ -0,0 +1,39 @@
const path = require('path');
const CopyPlugin = require('copy-webpack-plugin');
const {
createWebpackConfig,
createNodeWebpackConfig,
createWebviewWebpackConfig,
} = require('@opensumi/ide-dev-tool/src/webpack');
const web = createWebpackConfig(__dirname, path.join(__dirname, 'entry/web/prod/app.tsx'), {
plugins: [
new CopyPlugin({
patterns: [
{
from: path.join(__dirname, '../extension/lib/worker-host.js'),
to: path.join(__dirname, './dist/worker-host.js'),
},
],
}),
],
});
const node = createNodeWebpackConfig(
path.join(__dirname, 'entry/web/prod/server.ts'),
path.join(__dirname, 'dist-node/server'),
);
const webview = createWebviewWebpackConfig(
require.resolve('@opensumi/ide-webview/lib/webview-host/web-preload.js'),
__dirname,
'/dist/webview',
);
if (process.env.ONLY_NODE) {
module.exports = [node];
} else {
module.exports = [web, node, webview];
}

View File

@ -1,8 +1,5 @@
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
const path = require('path');
const { createWebpackConfig } = require('@opensumi/ide-dev-tool/src/webpack');
module.exports = createWebpackConfig(__dirname, require('path').join(__dirname, 'entry/web/app.tsx'), {
mode: process.env.NODE_ENV || 'development',
plugins: [process.env.analysis && new BundleAnalyzerPlugin()].filter(Boolean),
});
module.exports = createWebpackConfig(__dirname, path.join(__dirname, 'entry/web/app.tsx'), {});

View File

@ -5,7 +5,6 @@ import { registerColor, transparent, lighten, darken, lessProminent } from '../u
import { badgeBackground, badgeForeground } from './badge';
import { contrastBorder, activeContrastBorder, focusBorder, foreground } from './base';
import { listInactiveSelectionBackground } from './list-tree';
// TODO COLOR 此处vscode内的editor error warning info颜色都有做修改
export const editorErrorBackground = registerColor(
@ -611,11 +610,12 @@ export const editorGutter = registerColor(
'Background color of the editor gutter. The gutter contains the glyph margins and the line numbers.',
),
);
export const overviewRulerCommentingRangeForeground = registerColor(
'editorGutter.commentRangeForeground',
{
dark: listInactiveSelectionBackground,
light: darken(listInactiveSelectionBackground, 0.05),
dark: '#37373D',
light: darken('#E4E6F1', 0.05),
hcDark: Color.white,
hcLight: Color.black,
},

9
railway.toml Normal file
View File

@ -0,0 +1,9 @@
[build]
builder = "NIXPACKS"
nixpacksConfigPath = "nixpacks.toml"
[deploy]
numReplicas = 1
sleepApplication = false
restartPolicyType = "ON_FAILURE"
restartPolicyMaxRetries = 10

View File

@ -13,7 +13,6 @@ const { lessLoader } = require('./webpack-util');
const tsConfigPath = path.join(__dirname, './tsconfig.json');
const dir = path.join(__dirname, '../src/browser');
const distDir = path.join(__dirname, '../lib/browser');
const port = 8080;
const nodeEnv = process.env.NODE_ENV || 'development';
/**
@ -110,7 +109,12 @@ module.exports = {
},
optimization: {
nodeEnv,
minimizer: [new TerserJSPlugin({}), new OptimizeCSSAssetsPlugin({})],
minimizer: [
new TerserJSPlugin({
minify: TerserJSPlugin.esbuildMinify,
}),
new OptimizeCSSAssetsPlugin({}),
],
},
plugins: [
new AssetsPlugin({

View File

@ -37,12 +37,12 @@
"chalk": "^4.0.0",
"ejs": "^3.1.7",
"ip": "^1.1.8",
"koa": "^2.7.0",
"koa": "^2.15.0",
"koa-mount": "^4.0.0",
"mri": "^1.2.0",
"open": "^7.0.3",
"react": "^16.12.0",
"react-dom": "^16.12.0",
"react": "^18.0.0",
"react-dom": "^18.0.0",
"tslib": "^2.5.0"
},
"devDependencies": {
@ -51,9 +51,7 @@
"@types/node": "^18.19.8",
"@types/react": "^18.0.0",
"@types/react-dom": "^18.0.0",
"@types/read-pkg-up": "^6.0.0",
"assets-webpack-plugin": "^7.1.1",
"cache-loader": "^4.1.0",
"copy-webpack-plugin": "^12.0.2",
"cross-env": "^7.0.3",
"css-loader": "^6.9.1",
@ -68,7 +66,6 @@
"shell-path": "^2.1.0",
"style-loader": "^3.3.4",
"terser-webpack-plugin": "^5.3.10",
"thread-loader": "^4.0.2",
"ts-loader": "9.5.1",
"ts-node": "10.9.1",
"tsconfig-paths": "^4.2.0",

View File

@ -14,17 +14,17 @@
"sumi": "./cli/index.js"
},
"dependencies": {
"@types/koa": "^2.13.4",
"@types/koa": "^2.14.0",
"@types/koa-bodyparser": "^4.3.7",
"@types/koa-router": "^7.4.2",
"cache-loader": "^4.1.0",
"copy-webpack-plugin": "^12.0.2",
"css-loader": "^6.9.1",
"fork-ts-checker-webpack-plugin": "^9.0.2",
"html-webpack-plugin": "^5.6.0",
"koa": "^2.13.4",
"koa": "^2.15.0",
"koa-bodyparser": "^4.3.0",
"koa-router": "^10.1.1",
"koa-static": "^5.0.0",
"less": "^3.9.0",
"less-loader": "^12.1.0",
"mini-css-extract-plugin": "^2.7.7",
@ -35,7 +35,6 @@
"optimize-css-assets-webpack-plugin": "^6.0.1",
"react-dom": "^18.0.0",
"style-loader": "^3.3.4",
"thread-loader": "^4.0.2",
"ts-loader": "^9.5.1",
"ts-node": "^10.9.1",
"tsconfig-paths": "^4.2.0",

View File

@ -6,16 +6,16 @@ class LogServiceClass {
console.log('LogServiceClass args', args);
}
debug(...args) {
console.log('LogServiceClass debug', args);
console.log('LogServiceClass debug', ...args);
}
error(...args) {
console.log('LogServiceClass error', args);
console.log('LogServiceClass error', ...args);
}
log(...args) {
console.log('LogServiceClass log', args);
console.log('LogServiceClass log', ...args);
}
warn(...args) {
console.log('LogServiceClass warn', args);
console.log('LogServiceClass warn', ...args);
}
}
exports.default = LogServiceClass;

View File

@ -7,18 +7,18 @@ export default class LogServiceClass {
}
debug(...args) {
console.log('LogServiceClass debug', args);
console.log('LogServiceClass debug', ...args);
}
error(...args) {
console.log('LogServiceClass error', args);
console.log('LogServiceClass error', ...args);
}
log(...args) {
console.log('LogServiceClass log', args);
console.log('LogServiceClass log', ...args);
}
warn(...args) {
console.log('LogServiceClass warn', args);
console.log('LogServiceClass warn', ...args);
}
}

View File

@ -1,10 +1,10 @@
/* eslint-disable no-console */
import 'tsconfig-paths/register';
import http from 'http';
import path from 'path';
import Koa from 'koa';
import KoaRouter from 'koa-router';
import Static from 'koa-static';
import { Injector } from '@opensumi/di';
import { Deferred } from '@opensumi/ide-core-common';
@ -18,7 +18,12 @@ import {
} from '@opensumi/ide-remote-opener/lib/common';
import { RemoteOpenerServiceImpl } from '@opensumi/ide-remote-opener/lib/node';
export async function startServer(arg1: NodeModule[] | Partial<IServerAppOpts>) {
export async function startServer(
arg1: NodeModule[] | Partial<IServerAppOpts>,
options?: {
mountStaticPath?: string;
},
) {
const app = new Koa();
const router = new KoaRouter();
const deferred = new Deferred<http.Server>();
@ -39,6 +44,11 @@ export async function startServer(arg1: NodeModule[] | Partial<IServerAppOpts>)
app.use(router.routes());
if (options && options.mountStaticPath) {
console.log('mount static path:', options.mountStaticPath);
app.use(Static(options.mountStaticPath));
}
const injector = new Injector([
{
token: RemoteOpenerServiceToken,
@ -46,7 +56,7 @@ export async function startServer(arg1: NodeModule[] | Partial<IServerAppOpts>)
},
]);
const port = process.env.IDE_SERVER_PORT || 8000;
const port = process.env.PORT || process.env.IDE_SERVER_PORT || 8000;
let opts: IServerAppOpts = {
webSocketHandler: [
// new TerminalHandler(logger),
@ -70,11 +80,12 @@ export async function startServer(arg1: NodeModule[] | Partial<IServerAppOpts>)
* extHost: path.join(__dirname, './ext-host.js') || process.env.EXTENSION_HOST_ENTRY,
*/
extHost:
path.join(__dirname, '../../../packages/extension/lib/hosted/ext.process.js') || process.env.EXTENSION_HOST_ENTRY,
process.env.EXTENSION_HOST_ENTRY || path.join(__dirname, '../../../packages/extension/lib/hosted/ext.process.js'),
onDidCreateExtensionHostProcess: (extHostProcess) => {
console.log(`Extension host process ${extHostProcess.pid} created`);
},
};
if (Array.isArray(arg1)) {
opts = {
...opts,
@ -100,7 +111,7 @@ export async function startServer(arg1: NodeModule[] | Partial<IServerAppOpts>)
});
server.listen(port, () => {
console.log(`server listen on port ${port}`);
console.log(`server listen on http://localhost:${port}`);
deferred.resolve(server);
});
return deferred.promise;

View File

@ -5,26 +5,21 @@ const fse = require('fs-extra');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const NodePolyfillPlugin = require('node-polyfill-webpack-plugin');
const threadLoader = require('thread-loader');
const TsconfigPathsPlugin = require('tsconfig-paths-webpack-plugin');
const webpack = require('webpack');
const { merge } = require('webpack-merge');
threadLoader.warmup({}, ['ts-loader']);
const reactPath = path.resolve(path.join(__dirname, '../../../node_modules/react'));
const reactDOMPath = path.resolve(path.join(__dirname, '../../../node_modules/react-dom'));
const tsConfigPath = path.join(__dirname, '../../../tsconfig.json');
const HOST = process.env.HOST || '0.0.0.0';
const PORT = process.env.PORT || 8080;
const IDE_FRONT_PORT = process.env.IDE_FRONT_PORT || 8080;
const defaultWorkspace = path.join(__dirname, '../../workspace');
fse.mkdirpSync(defaultWorkspace);
const withSlash = process.platform === 'win32' ? '/' : '';
console.log('front port', PORT);
const styleLoader =
process.env.NODE_ENV === 'production' ? MiniCssExtractPlugin.loader : require.resolve('style-loader');
@ -36,6 +31,8 @@ const styleLoader =
* @returns {import('webpack').Configuration}
*/
exports.createWebpackConfig = function (dir, entry, extraConfig) {
console.log('front port', IDE_FRONT_PORT);
const webpackConfig = merge(
{
entry,
@ -43,6 +40,9 @@ exports.createWebpackConfig = function (dir, entry, extraConfig) {
filename: 'bundle.js',
path: dir + '/dist',
},
cache: {
type: 'filesystem',
},
resolve: {
extensions: ['.ts', '.tsx', '.js', '.json', '.less'],
plugins: [
@ -74,35 +74,18 @@ exports.createWebpackConfig = function (dir, entry, extraConfig) {
{
test: /\.tsx?$/,
use: [
process.env.NODE_ENV === 'production'
? {
loader: 'cache-loader',
options: {
cacheDirectory: path.resolve(__dirname, '../../../.cache'),
},
}
: null,
]
.filter(Boolean)
.concat([
{
loader: 'thread-loader',
options: {
workers: require('os').cpus().length - 1,
{
loader: 'ts-loader',
options: {
happyPackMode: true,
transpileOnly: true,
configFile: tsConfigPath,
compilerOptions: {
target: 'es2015',
},
},
{
loader: 'ts-loader',
options: {
happyPackMode: true,
transpileOnly: true,
configFile: tsConfigPath,
compilerOptions: {
target: 'es2015',
},
},
},
]),
},
],
},
{
test: /\.png$/,
@ -177,12 +160,12 @@ exports.createWebpackConfig = function (dir, entry, extraConfig) {
},
optimization: {
nodeEnv: process.env.NODE_ENV,
minimize: false,
},
plugins: [
new HtmlWebpackPlugin({
template: __dirname + '/index.html',
}),
new MiniCssExtractPlugin({
filename: '[name].[chunkhash:8].css',
chunkFilename: '[id].css',
@ -205,18 +188,19 @@ exports.createWebpackConfig = function (dir, entry, extraConfig) {
'process.env.STATIC_SERVER_PATH': JSON.stringify(process.env.STATIC_SERVER_PATH || `http://${HOST}:8000/`),
'process.env.HOST': JSON.stringify(process.env.HOST),
}),
new ForkTsCheckerWebpackPlugin({
typescript: {
diagnosticOptions: {
syntactic: true,
!process.env.SKIP_TS_CHECKER &&
new ForkTsCheckerWebpackPlugin({
typescript: {
diagnosticOptions: {
syntactic: true,
},
configFile: tsConfigPath,
},
configFile: tsConfigPath,
},
issue: {
include: (issue) => issue.file.includes('src/packages/'),
exclude: (issue) => issue.file.includes('__test__'),
},
}),
issue: {
include: (issue) => issue.file.includes('src/packages/'),
exclude: (issue) => issue.file.includes('__test__'),
},
}),
new NodePolyfillPlugin({
includeAliases: ['process', 'Buffer'],
}),
@ -228,7 +212,7 @@ exports.createWebpackConfig = function (dir, entry, extraConfig) {
directory: dir + '/dist',
},
host: HOST,
port: PORT,
port: IDE_FRONT_PORT,
allowedHosts: 'all',
devMiddleware: {
stats: 'errors-only',
@ -271,13 +255,16 @@ exports.createWebpackConfig = function (dir, entry, extraConfig) {
/**
* @returns {import('webpack').Configuration}
*/
exports.createWebviewWebpackConfig = (entry, dir) => {
exports.createWebviewWebpackConfig = (entry, dir, outputPath = '/dist') => {
const port = 8899;
return {
entry,
output: {
filename: 'webview.js',
path: dir + '/dist',
path: dir + outputPath,
},
cache: {
type: 'filesystem',
},
resolve: {
extensions: ['.ts', '.tsx', '.js', '.json', '.less'],
@ -341,3 +328,90 @@ exports.createWebviewWebpackConfig = (entry, dir) => {
},
};
};
/**
* @returns {import('webpack').Configuration}
*/
exports.createNodeWebpackConfig = (entry, distDir) => ({
entry,
target: 'node',
output: {
filename: 'server.js',
path: distDir,
},
node: false,
mode: 'production',
optimization: {
minimize: false,
},
cache: {
type: 'filesystem',
},
watch: false,
resolve: {
modules: [
path.join(__dirname, '../../../node_modules'),
path.join(__dirname, '../node_modules'),
path.resolve('node_modules'),
],
extensions: ['.ts', '.tsx', '.js', '.json'],
plugins: [
new TsconfigPathsPlugin({
configFile: tsConfigPath,
}),
],
},
module: {
exprContextCritical: false,
rules: [
{
test: /\.tsx?$/,
use: [
{
loader: 'ts-loader',
options: {
happyPackMode: true,
transpileOnly: true,
configFile: tsConfigPath,
compilerOptions: {
target: 'es2016',
},
},
},
],
},
],
},
externals: [
function ({ request }, callback) {
if (
[
'node-pty',
'oniguruma',
'@parcel/watcher',
'nsfw',
'spdlog',
'vm2',
'canvas',
'@opensumi/vscode-ripgrep',
'vertx',
'keytar',
'tsconfig-paths',
].indexOf(request) !== -1
) {
return callback(null, `commonjs ${request}`);
}
callback();
},
],
resolveLoader: {
extensions: ['.ts', '.tsx', '.js', '.json'],
mainFields: ['loader', 'main'],
modules: [
path.join(__dirname, '../../../node_modules'),
path.join(__dirname, '../node_modules'),
path.resolve('node_modules'),
],
},
plugins: [!process.env.CI && new webpack.ProgressPlugin()],
});

View File

@ -53,11 +53,11 @@
"fs-extra": "^10.1.0",
"glob-to-regexp": "0.4.1",
"html-webpack-plugin": "^5.6.0",
"koa": "^2.13.4",
"koa": "^2.15.0",
"koa-bodyparser": "^4.3.0",
"less": "^3.9.0",
"less-loader": "^12.1.0",
"mini-css-extract-plugin": "^0.6.0",
"mini-css-extract-plugin": "^2.7.7",
"mobx": "^5.9.4",
"mobx-react-lite": "^1.3.1",
"npm-run": "^5.0.1",

View File

@ -282,20 +282,20 @@ __metadata:
version: 0.0.0-use.local
resolution: "@opensumi/ide-dev-tool@portal:../dev-tool::locator=%40opensumi%2Fide-electron%40workspace%3A."
dependencies:
"@types/koa": ^2.13.4
"@types/koa": ^2.14.0
"@types/koa-bodyparser": ^4.3.7
"@types/koa-router": ^7.4.2
cache-loader: ^4.1.0
copy-webpack-plugin: ^12.0.2
css-loader: ^6.9.1
fork-ts-checker-webpack-plugin: ^9.0.2
html-webpack-plugin: ^5.6.0
koa: ^2.13.4
koa: ^2.15.0
koa-bodyparser: ^4.3.0
koa-router: ^10.1.1
koa-static: ^5.0.0
less: ^3.9.0
less-loader: ^12.1.0
mini-css-extract-plugin: ^0.6.0
mini-css-extract-plugin: ^2.7.7
mobx: ^5.9.4
mobx-react-lite: ^1.3.1
node-notifier: ^8.0.1
@ -303,7 +303,6 @@ __metadata:
optimize-css-assets-webpack-plugin: ^6.0.1
react-dom: ^18.0.0
style-loader: ^3.3.4
thread-loader: ^4.0.2
ts-loader: ^9.5.1
ts-node: ^10.9.1
tsconfig-paths: ^4.2.0
@ -332,11 +331,11 @@ __metadata:
fs-extra: ^10.1.0
glob-to-regexp: 0.4.1
html-webpack-plugin: ^5.6.0
koa: ^2.13.4
koa: ^2.15.0
koa-bodyparser: ^4.3.0
less: ^3.9.0
less-loader: ^12.1.0
mini-css-extract-plugin: ^0.6.0
mini-css-extract-plugin: ^2.7.7
mobx: ^5.9.4
mobx-react-lite: ^1.3.1
node-gyp: ^9.3.0
@ -617,7 +616,7 @@ __metadata:
languageName: node
linkType: hard
"@types/json-schema@npm:^7.0.5, @types/json-schema@npm:^7.0.8":
"@types/json-schema@npm:^7.0.8":
version: 7.0.11
resolution: "@types/json-schema@npm:7.0.11"
checksum: 527bddfe62db9012fccd7627794bd4c71beb77601861055d87e3ee464f2217c85fca7a4b56ae677478367bbd248dbde13553312b7d4dbc702a2f2bbf60c4018d
@ -667,7 +666,7 @@ __metadata:
languageName: node
linkType: hard
"@types/koa@npm:*, @types/koa@npm:^2.13.4":
"@types/koa@npm:*":
version: 2.13.5
resolution: "@types/koa@npm:2.13.5"
dependencies:
@ -683,6 +682,22 @@ __metadata:
languageName: node
linkType: hard
"@types/koa@npm:^2.14.0":
version: 2.14.0
resolution: "@types/koa@npm:2.14.0"
dependencies:
"@types/accepts": "*"
"@types/content-disposition": "*"
"@types/cookies": "*"
"@types/http-assert": "*"
"@types/http-errors": "*"
"@types/keygrip": "*"
"@types/koa-compose": "*"
"@types/node": "*"
checksum: 57d809e42350c9ddefa2150306355e40757877468bb027e0bd99f5aeb43cfaf8ba8b14761ea65e419d6fb4c2403a1f3ed0762872a9cf040dbd14357caca56548
languageName: node
linkType: hard
"@types/mime@npm:*":
version: 3.0.1
resolution: "@types/mime@npm:3.0.1"
@ -1079,15 +1094,6 @@ __metadata:
languageName: node
linkType: hard
"ajv-errors@npm:^1.0.0":
version: 1.0.1
resolution: "ajv-errors@npm:1.0.1"
peerDependencies:
ajv: ">=5.0.0"
checksum: 2c9fc02cf58f9aae5bace61ebd1b162e1ea372ae9db5999243ba5e32a9a78c0d635d29ae085f652c61c941a43af0b2b1acdb255e29d44dc43a6e021085716d8c
languageName: node
linkType: hard
"ajv-formats@npm:^2.1.1":
version: 2.1.1
resolution: "ajv-formats@npm:2.1.1"
@ -1102,7 +1108,7 @@ __metadata:
languageName: node
linkType: hard
"ajv-keywords@npm:^3.1.0, ajv-keywords@npm:^3.4.1, ajv-keywords@npm:^3.5.2":
"ajv-keywords@npm:^3.4.1, ajv-keywords@npm:^3.5.2":
version: 3.5.2
resolution: "ajv-keywords@npm:3.5.2"
peerDependencies:
@ -1122,7 +1128,7 @@ __metadata:
languageName: node
linkType: hard
"ajv@npm:^6.1.0, ajv@npm:^6.10.0, ajv@npm:^6.12.0, ajv@npm:^6.12.4, ajv@npm:^6.12.5":
"ajv@npm:^6.10.0, ajv@npm:^6.12.0, ajv@npm:^6.12.5":
version: 6.12.6
resolution: "ajv@npm:6.12.6"
dependencies:
@ -1497,13 +1503,6 @@ __metadata:
languageName: node
linkType: hard
"buffer-json@npm:^2.0.0":
version: 2.0.0
resolution: "buffer-json@npm:2.0.0"
checksum: 9b8601d25f50341a02c42cb7ffbd6d6801d961f2beda5648c86da815b3019dd8503ebf106cdc2ff2b98f78a463d8b6754f6797419d25ec60a90bb9192fccf40c
languageName: node
linkType: hard
"buffer@npm:^5.1.0":
version: 5.7.1
resolution: "buffer@npm:5.7.1"
@ -1592,22 +1591,6 @@ __metadata:
languageName: node
linkType: hard
"cache-loader@npm:^4.1.0":
version: 4.1.0
resolution: "cache-loader@npm:4.1.0"
dependencies:
buffer-json: ^2.0.0
find-cache-dir: ^3.0.0
loader-utils: ^1.2.3
mkdirp: ^0.5.1
neo-async: ^2.6.1
schema-utils: ^2.0.0
peerDependencies:
webpack: ^4.0.0
checksum: 0339778bddbd3368dc420e5a58b569153334fb74226d15b76832a1246ce8990bb5fcdfa8811557f0b0605bbd06aea12bb069abd906aeb114ae0e7d0a9fde7f59
languageName: node
linkType: hard
"cacheable-lookup@npm:^5.0.3":
version: 5.0.4
resolution: "cacheable-lookup@npm:5.0.4"
@ -1953,13 +1936,6 @@ __metadata:
languageName: node
linkType: hard
"commondir@npm:^1.0.1":
version: 1.0.1
resolution: "commondir@npm:1.0.1"
checksum: 59715f2fc456a73f68826285718503340b9f0dd89bfffc42749906c5cf3d4277ef11ef1cca0350d0e79204f00f1f6d83851ececc9095dc88512a697ac0b9bdcb
languageName: node
linkType: hard
"compare-version@npm:^0.1.2":
version: 0.1.2
resolution: "compare-version@npm:0.1.2"
@ -1997,13 +1973,13 @@ __metadata:
languageName: node
linkType: hard
"cookies@npm:~0.8.0":
version: 0.8.0
resolution: "cookies@npm:0.8.0"
"cookies@npm:~0.9.0":
version: 0.9.1
resolution: "cookies@npm:0.9.1"
dependencies:
depd: ~2.0.0
keygrip: ~1.1.0
checksum: 806055a44f128705265b1bc6a853058da18bf80dea3654ad99be20985b1fa1b14f86c1eef73644aab8071241f8a78acd57202b54c4c5c70769fc694fbb9c4edc
checksum: 213e4d14847b582fbd8a003203d3621a4b9fa792a315c37954e89332d38fac5bcc34ba92ef316ad6d5fe28f0187aaa115927fbbe2080744ad1707a93b4313247
languageName: node
linkType: hard
@ -2260,10 +2236,12 @@ __metadata:
languageName: node
linkType: hard
"decode-uri-component@npm:^0.2.0":
version: 0.2.2
resolution: "decode-uri-component@npm:0.2.2"
checksum: 95476a7d28f267292ce745eac3524a9079058bbb35767b76e3ee87d42e34cd0275d2eb19d9d08c3e167f97556e8a2872747f5e65cbebcac8b0c98d83e285f139
"debug@npm:^3.1.0":
version: 3.2.7
resolution: "debug@npm:3.2.7"
dependencies:
ms: ^2.1.1
checksum: b3d8c5940799914d30314b7c3304a43305fd0715581a919dacb8b3176d024a782062368405b47491516d2091d6462d4d11f2f4974a405048094f8bfebfa3071c
languageName: node
linkType: hard
@ -2927,17 +2905,6 @@ __metadata:
languageName: node
linkType: hard
"find-cache-dir@npm:^3.0.0":
version: 3.3.2
resolution: "find-cache-dir@npm:3.3.2"
dependencies:
commondir: ^1.0.1
make-dir: ^3.0.2
pkg-dir: ^4.1.0
checksum: 1e61c2e64f5c0b1c535bd85939ae73b0e5773142713273818cc0b393ee3555fb0fd44e1a5b161b8b6c3e03e98c2fcc9c227d784850a13a90a8ab576869576817
languageName: node
linkType: hard
"find-up@npm:^4.0.0":
version: 4.1.0
resolution: "find-up@npm:4.1.0"
@ -3498,6 +3465,18 @@ __metadata:
languageName: node
linkType: hard
"http-errors@npm:~1.6.2":
version: 1.6.3
resolution: "http-errors@npm:1.6.3"
dependencies:
depd: ~1.1.2
inherits: 2.0.3
setprototypeof: 1.1.0
statuses: ">= 1.4.0 < 2"
checksum: a9654ee027e3d5de305a56db1d1461f25709ac23267c6dc28cdab8323e3f96caa58a9a6a5e93ac15d7285cee0c2f019378c3ada9026e7fe19c872d695f27de7c
languageName: node
linkType: hard
"http-proxy-agent@npm:^5.0.0":
version: 5.0.0
resolution: "http-proxy-agent@npm:5.0.0"
@ -3665,6 +3644,13 @@ __metadata:
languageName: node
linkType: hard
"inherits@npm:2.0.3":
version: 2.0.3
resolution: "inherits@npm:2.0.3"
checksum: 78cb8d7d850d20a5e9a7f3620db31483aa00ad5f722ce03a55b110e5a723539b3716a3b463e2b96ce3fe286f33afc7c131fa2f91407528ba80cea98a7545d4c0
languageName: node
linkType: hard
"internal-slot@npm:^1.0.3":
version: 1.0.3
resolution: "internal-slot@npm:1.0.3"
@ -3866,13 +3852,6 @@ __metadata:
languageName: node
linkType: hard
"is-plain-obj@npm:^1.0.0":
version: 1.1.0
resolution: "is-plain-obj@npm:1.1.0"
checksum: 0ee04807797aad50859652a7467481816cbb57e5cc97d813a7dcd8915da8195dc68c436010bf39d195226cde6a2d352f4b815f16f26b7bf486a5754290629931
languageName: node
linkType: hard
"is-plain-object@npm:^2.0.4":
version: 2.0.4
resolution: "is-plain-object@npm:2.0.4"
@ -4024,7 +4003,7 @@ __metadata:
languageName: node
linkType: hard
"json-parse-better-errors@npm:^1.0.1, json-parse-better-errors@npm:^1.0.2":
"json-parse-better-errors@npm:^1.0.1":
version: 1.0.2
resolution: "json-parse-better-errors@npm:1.0.2"
checksum: ff2b5ba2a70e88fd97a3cb28c1840144c5ce8fae9cbeeddba15afa333a5c407cf0e42300cd0a2885dbb055227fe68d405070faad941beeffbfde9cf3b2c78c5d
@ -4059,17 +4038,6 @@ __metadata:
languageName: node
linkType: hard
"json5@npm:^1.0.1":
version: 1.0.1
resolution: "json5@npm:1.0.1"
dependencies:
minimist: ^1.2.0
bin:
json5: lib/cli.js
checksum: e76ea23dbb8fc1348c143da628134a98adf4c5a4e8ea2adaa74a80c455fc2cdf0e2e13e6398ef819bfe92306b610ebb2002668ed9fc1af386d593691ef346fc3
languageName: node
linkType: hard
"json5@npm:^2.1.2, json5@npm:^2.2.0":
version: 2.2.1
resolution: "json5@npm:2.2.1"
@ -4178,15 +4146,36 @@ __metadata:
languageName: node
linkType: hard
"koa@npm:^2.13.4":
version: 2.14.0
resolution: "koa@npm:2.14.0"
"koa-send@npm:^5.0.0":
version: 5.0.1
resolution: "koa-send@npm:5.0.1"
dependencies:
debug: ^4.1.1
http-errors: ^1.7.3
resolve-path: ^1.4.0
checksum: a9fbaadbe0f50efd157a733df4a1cc2b3b79b0cdf12e67c718641e6038d1792c0bebe40913e6d4ceb707d970301155be3859b98d1ef08b0fd1766f7326b82853
languageName: node
linkType: hard
"koa-static@npm:^5.0.0":
version: 5.0.0
resolution: "koa-static@npm:5.0.0"
dependencies:
debug: ^3.1.0
koa-send: ^5.0.0
checksum: 8d9b9c4d2b3b13e8818e804245d784099c4b353b55ddd7dbeeb90f27a2e9f5b6f86bd16a4909e337cb89db4d332d9002e6c0f5056caf75749cab62f93c1f0cc5
languageName: node
linkType: hard
"koa@npm:^2.15.0":
version: 2.15.0
resolution: "koa@npm:2.15.0"
dependencies:
accepts: ^1.3.5
cache-content-type: ^1.0.0
content-disposition: ~0.5.2
content-type: ^1.0.4
cookies: ~0.8.0
cookies: ~0.9.0
debug: ^4.3.2
delegates: ^1.0.0
depd: ^2.0.0
@ -4205,7 +4194,7 @@ __metadata:
statuses: ^1.5.0
type-is: ^1.6.16
vary: ^1.1.2
checksum: da17421e44559e4c2cc94c6cca79a027f73cbfba4035ed04c5ae676206b16974c09a632c49b57f75ac0c5f34227a42f3cc9b02c37bc98d47f364ed6c6ddf46ce
checksum: a97741f89f328f25ae94d82d0ee608377d89e086c73f2d868023e6050dea682ef93e0a5c80097f3aaad28121853aea50a7fb3c0c12ecc45798da2fd1255f580b
languageName: node
linkType: hard
@ -4296,24 +4285,13 @@ __metadata:
languageName: node
linkType: hard
"loader-runner@npm:^4.1.0, loader-runner@npm:^4.2.0":
"loader-runner@npm:^4.2.0":
version: 4.3.0
resolution: "loader-runner@npm:4.3.0"
checksum: a90e00dee9a16be118ea43fec3192d0b491fe03a32ed48a4132eb61d498f5536a03a1315531c19d284392a8726a4ecad71d82044c28d7f22ef62e029bf761569
languageName: node
linkType: hard
"loader-utils@npm:^1.1.0, loader-utils@npm:^1.2.3":
version: 1.4.2
resolution: "loader-utils@npm:1.4.2"
dependencies:
big.js: ^5.2.2
emojis-list: ^3.0.0
json5: ^1.0.1
checksum: eb6fb622efc0ffd1abdf68a2022f9eac62bef8ec599cf8adb75e94d1d338381780be6278534170e99edc03380a6d29bc7eb1563c89ce17c5fed3a0b17f1ad804
languageName: node
linkType: hard
"loader-utils@npm:^2.0.0":
version: 2.0.4
resolution: "loader-utils@npm:2.0.4"
@ -4408,15 +4386,6 @@ __metadata:
languageName: node
linkType: hard
"make-dir@npm:^3.0.2":
version: 3.1.0
resolution: "make-dir@npm:3.1.0"
dependencies:
semver: ^6.0.0
checksum: 484200020ab5a1fdf12f393fe5f385fc8e4378824c940fba1729dcd198ae4ff24867bc7a5646331e50cead8abff5d9270c456314386e629acec6dff4b8016b78
languageName: node
linkType: hard
"make-error@npm:^1.1.1":
version: 1.3.6
resolution: "make-error@npm:1.3.6"
@ -4566,17 +4535,14 @@ __metadata:
languageName: node
linkType: hard
"mini-css-extract-plugin@npm:^0.6.0":
version: 0.6.0
resolution: "mini-css-extract-plugin@npm:0.6.0"
"mini-css-extract-plugin@npm:^2.7.7":
version: 2.7.7
resolution: "mini-css-extract-plugin@npm:2.7.7"
dependencies:
loader-utils: ^1.1.0
normalize-url: ^2.0.1
schema-utils: ^1.0.0
webpack-sources: ^1.1.0
schema-utils: ^4.0.0
peerDependencies:
webpack: ^4.4.0
checksum: 6703d4de8c788c467dea1baacaa8843ddfd3e6895912635f01d568d2f60017df631badd3a757089ab5c4cdac97c60cc7167a6e941b2c36f6f634d00254ea6d6a
webpack: ^5.0.0
checksum: 04af0e7d8c1a4ff31c70ac2d0895837dae3d51cce3bfd90e3c1d90d50eef7de21778361a3064531df046d775d80b3bf056324dddea93831c7def2047c5aa8718
languageName: node
linkType: hard
@ -4735,7 +4701,7 @@ __metadata:
languageName: node
linkType: hard
"ms@npm:^2.0.0":
"ms@npm:^2.0.0, ms@npm:^2.1.1":
version: 2.1.3
resolution: "ms@npm:2.1.3"
checksum: aa92de608021b242401676e35cfa5aa42dd70cbdc082b916da7fb925c542173e36bce97ea3e804923fe92c0ad991434e4a38327e15a1b5b5f945d66df615ae6d
@ -4783,7 +4749,7 @@ __metadata:
languageName: node
linkType: hard
"neo-async@npm:^2.6.1, neo-async@npm:^2.6.2":
"neo-async@npm:^2.6.2":
version: 2.6.2
resolution: "neo-async@npm:2.6.2"
checksum: deac9f8d00eda7b2e5cd1b2549e26e10a0faa70adaa6fdadca701cc55f49ee9018e427f424bac0c790b7c7e2d3068db97f3093f1093975f2acb8f8818b936ed9
@ -4931,17 +4897,6 @@ __metadata:
languageName: node
linkType: hard
"normalize-url@npm:^2.0.1":
version: 2.0.1
resolution: "normalize-url@npm:2.0.1"
dependencies:
prepend-http: ^2.0.0
query-string: ^5.0.1
sort-keys: ^2.0.0
checksum: 30e337ee03fc7f360c7d2b966438657fabd2628925cc58bffc893982fe4d2c59b397ae664fa2c319cd83565af73eee88906e80bc5eec91bc32b601920e770d75
languageName: node
linkType: hard
"normalize-url@npm:^6.0.1":
version: 6.1.0
resolution: "normalize-url@npm:6.1.0"
@ -5041,7 +4996,7 @@ __metadata:
languageName: node
linkType: hard
"object-assign@npm:^4.0.1, object-assign@npm:^4.1.0":
"object-assign@npm:^4.0.1":
version: 4.1.1
resolution: "object-assign@npm:4.1.1"
checksum: fcc6e4ea8c7fe48abfbb552578b1c53e0d194086e2e6bbbf59e0a536381a292f39943c6e9628af05b5528aa5e3318bb30d6b2e53cadaf5b8fe9e12c4b69af23f
@ -5225,7 +5180,7 @@ __metadata:
languageName: node
linkType: hard
"path-is-absolute@npm:^1.0.0":
"path-is-absolute@npm:1.0.1, path-is-absolute@npm:^1.0.0":
version: 1.0.1
resolution: "path-is-absolute@npm:1.0.1"
checksum: 060840f92cf8effa293bcc1bea81281bd7d363731d214cbe5c227df207c34cd727430f70c6037b5159c8a870b9157cba65e775446b0ab06fd5ecc7e54615a3b8
@ -5357,7 +5312,7 @@ __metadata:
languageName: node
linkType: hard
"pkg-dir@npm:^4.1.0, pkg-dir@npm:^4.2.0":
"pkg-dir@npm:^4.2.0":
version: 4.2.0
resolution: "pkg-dir@npm:4.2.0"
dependencies:
@ -5763,13 +5718,6 @@ __metadata:
languageName: node
linkType: hard
"prepend-http@npm:^2.0.0":
version: 2.0.0
resolution: "prepend-http@npm:2.0.0"
checksum: 7694a9525405447662c1ffd352fcb41b6410c705b739b6f4e3a3e21cf5fdede8377890088e8934436b8b17ba55365a615f153960f30877bf0d0392f9e93503ea
languageName: node
linkType: hard
"pretty-error@npm:^4.0.0":
version: 4.0.0
resolution: "pretty-error@npm:4.0.0"
@ -5844,17 +5792,6 @@ __metadata:
languageName: node
linkType: hard
"query-string@npm:^5.0.1":
version: 5.1.1
resolution: "query-string@npm:5.1.1"
dependencies:
decode-uri-component: ^0.2.0
object-assign: ^4.1.0
strict-uri-encode: ^1.0.0
checksum: 4ac760d9778d413ef5f94f030ed14b1a07a1708dd13fd3bc54f8b9ef7b425942c7577f30de0bf5a7d227ee65a9a0350dfa3a43d1d266880882fb7ce4c434a4dd
languageName: node
linkType: hard
"queue-microtask@npm:^1.2.2":
version: 1.2.3
resolution: "queue-microtask@npm:1.2.3"
@ -6030,6 +5967,16 @@ __metadata:
languageName: node
linkType: hard
"resolve-path@npm:^1.4.0":
version: 1.4.0
resolution: "resolve-path@npm:1.4.0"
dependencies:
http-errors: ~1.6.2
path-is-absolute: 1.0.1
checksum: 1a39f569ee54dd5f8ee8576ef8671c9724bea65d9f9982fbb5352af9fb4e500e1e459c1bfb1ae3ebfd8d43a709c3a01dfa4f46cf5b831e45e2caed4f1a208300
languageName: node
linkType: hard
"resolve@npm:^1.10.0":
version: 1.22.1
resolution: "resolve@npm:1.22.1"
@ -6200,28 +6147,6 @@ __metadata:
languageName: node
linkType: hard
"schema-utils@npm:^1.0.0":
version: 1.0.0
resolution: "schema-utils@npm:1.0.0"
dependencies:
ajv: ^6.1.0
ajv-errors: ^1.0.0
ajv-keywords: ^3.1.0
checksum: e8273b4f6eff9ddf4a4f4c11daf7b96b900237bf8859c86fa1e9b4fab416b72d7ea92468f8db89c18a3499a1070206e1c8a750c83b42d5325fc659cbb55eee88
languageName: node
linkType: hard
"schema-utils@npm:^2.0.0":
version: 2.7.1
resolution: "schema-utils@npm:2.7.1"
dependencies:
"@types/json-schema": ^7.0.5
ajv: ^6.12.4
ajv-keywords: ^3.5.2
checksum: 32c62fc9e28edd101e1bd83453a4216eb9bd875cc4d3775e4452b541908fa8f61a7bbac8ffde57484f01d7096279d3ba0337078e85a918ecbeb72872fb09fb2b
languageName: node
linkType: hard
"schema-utils@npm:^3.0.0":
version: 3.1.1
resolution: "schema-utils@npm:3.1.1"
@ -6244,7 +6169,7 @@ __metadata:
languageName: node
linkType: hard
"schema-utils@npm:^4.0.1, schema-utils@npm:^4.2.0":
"schema-utils@npm:^4.0.0, schema-utils@npm:^4.2.0":
version: 4.2.0
resolution: "schema-utils@npm:4.2.0"
dependencies:
@ -6272,7 +6197,7 @@ __metadata:
languageName: node
linkType: hard
"semver@npm:^6.0.0, semver@npm:^6.2.0":
"semver@npm:^6.2.0":
version: 6.3.0
resolution: "semver@npm:6.3.0"
bin:
@ -6346,6 +6271,13 @@ __metadata:
languageName: node
linkType: hard
"setprototypeof@npm:1.1.0":
version: 1.1.0
resolution: "setprototypeof@npm:1.1.0"
checksum: 27cb44304d6c9e1a23bc6c706af4acaae1a7aa1054d4ec13c05f01a99fd4887109a83a8042b67ad90dbfcd100d43efc171ee036eb080667172079213242ca36e
languageName: node
linkType: hard
"setprototypeof@npm:1.2.0":
version: 1.2.0
resolution: "setprototypeof@npm:1.2.0"
@ -6481,15 +6413,6 @@ __metadata:
languageName: node
linkType: hard
"sort-keys@npm:^2.0.0":
version: 2.0.0
resolution: "sort-keys@npm:2.0.0"
dependencies:
is-plain-obj: ^1.0.0
checksum: f0fd827fa9f8f866e98588d2a38c35209afbf1e9a05bb0e4ceeeb8bbf31d923c8902b0a7e0f561590ddb65e58eba6a74f74b991c85360bcc52e83a3f0d1cffd7
languageName: node
linkType: hard
"source-list-map@npm:^2.0.0":
version: 2.0.1
resolution: "source-list-map@npm:2.0.1"
@ -6611,20 +6534,13 @@ __metadata:
languageName: node
linkType: hard
"statuses@npm:>= 1.5.0 < 2, statuses@npm:^1.5.0":
"statuses@npm:>= 1.4.0 < 2, statuses@npm:>= 1.5.0 < 2, statuses@npm:^1.5.0":
version: 1.5.0
resolution: "statuses@npm:1.5.0"
checksum: c469b9519de16a4bb19600205cffb39ee471a5f17b82589757ca7bd40a8d92ebb6ed9f98b5a540c5d302ccbc78f15dc03cc0280dd6e00df1335568a5d5758a5c
languageName: node
linkType: hard
"strict-uri-encode@npm:^1.0.0":
version: 1.1.0
resolution: "strict-uri-encode@npm:1.1.0"
checksum: 9466d371f7b36768d43f7803f26137657559e4c8b0161fb9e320efb8edba3ae22f8e99d4b0d91da023b05a13f62ec5412c3f4f764b5788fac11d1fea93720bb3
languageName: node
linkType: hard
"string-width@npm:^1.0.2 || 2 || 3 || 4, string-width@npm:^4.1.0, string-width@npm:^4.2.0, string-width@npm:^4.2.3":
version: 4.2.3
resolution: "string-width@npm:4.2.3"
@ -6842,20 +6758,6 @@ __metadata:
languageName: node
linkType: hard
"thread-loader@npm:^4.0.2":
version: 4.0.2
resolution: "thread-loader@npm:4.0.2"
dependencies:
json-parse-better-errors: ^1.0.2
loader-runner: ^4.1.0
neo-async: ^2.6.2
schema-utils: ^4.0.1
peerDependencies:
webpack: ^5.0.0
checksum: 1b1bd4cf4320b63e2a8c52d6ff64c4cf7fbc5e6099f41aae5fa35c4714134becff5b91cd6b00d707f60d18003aba0ae112a719dfbd92fbcdeb875beba76b1146
languageName: node
linkType: hard
"tmp-promise@npm:^3.0.2":
version: 3.0.3
resolution: "tmp-promise@npm:3.0.3"

882
yarn.lock

File diff suppressed because it is too large Load Diff