Refactor WEB UI microservice to typescript.
This commit is contained in:
		
							parent
							
								
									828b754134
								
							
						
					
					
						commit
						7f1ab395b5
					
				@ -1,59 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright © 2016-2022 The Thingsboard Authors
 | 
			
		||||
 *
 | 
			
		||||
 * Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
 * you may not use this file except in compliance with the License.
 | 
			
		||||
 * You may obtain a copy of the License at
 | 
			
		||||
 *
 | 
			
		||||
 *     http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
 * distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
 * See the License for the specific language governing permissions and
 | 
			
		||||
 * limitations under the License.
 | 
			
		||||
 */
 | 
			
		||||
var config = require('config'),
 | 
			
		||||
    path = require('path'),
 | 
			
		||||
    DailyRotateFile = require('winston-daily-rotate-file');
 | 
			
		||||
 | 
			
		||||
const { createLogger, format, transports } = require('winston');
 | 
			
		||||
const { combine, timestamp, label, printf, splat } = format;
 | 
			
		||||
 | 
			
		||||
var loggerTransports = [];
 | 
			
		||||
 | 
			
		||||
if (process.env.NODE_ENV !== 'production' || process.env.DOCKER_MODE === 'true') {
 | 
			
		||||
    loggerTransports.push(new transports.Console({
 | 
			
		||||
        handleExceptions: true
 | 
			
		||||
    }));
 | 
			
		||||
} else {
 | 
			
		||||
    var filename = path.join(config.get('logger.path'), config.get('logger.filename'));
 | 
			
		||||
    var transport = new (DailyRotateFile)({
 | 
			
		||||
        filename: filename,
 | 
			
		||||
        datePattern: 'YYYY-MM-DD-HH',
 | 
			
		||||
        zippedArchive: true,
 | 
			
		||||
        maxSize: '20m',
 | 
			
		||||
        maxFiles: '14d',
 | 
			
		||||
        handleExceptions: true
 | 
			
		||||
    });
 | 
			
		||||
    loggerTransports.push(transport);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const tbFormat = printf(info => {
 | 
			
		||||
    return `${info.timestamp} [${info.label}] ${info.level.toUpperCase()}: ${info.message}`;
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
function _logger(moduleLabel) {
 | 
			
		||||
    return createLogger({
 | 
			
		||||
        level: config.get('logger.level'),
 | 
			
		||||
        format:combine(
 | 
			
		||||
            splat(),
 | 
			
		||||
            label({ label: moduleLabel }),
 | 
			
		||||
            timestamp({format: 'YYYY-MM-DD HH:mm:ss,SSS'}),
 | 
			
		||||
            tbFormat
 | 
			
		||||
        ),
 | 
			
		||||
        transports: loggerTransports
 | 
			
		||||
    });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
module.exports = _logger;
 | 
			
		||||
							
								
								
									
										63
									
								
								msa/web-ui/config/logger.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								msa/web-ui/config/logger.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,63 @@
 | 
			
		||||
///
 | 
			
		||||
/// Copyright © 2016-2022 The Thingsboard Authors
 | 
			
		||||
///
 | 
			
		||||
/// Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
/// you may not use this file except in compliance with the License.
 | 
			
		||||
/// You may obtain a copy of the License at
 | 
			
		||||
///
 | 
			
		||||
///     http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
///
 | 
			
		||||
/// Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
/// distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
/// See the License for the specific language governing permissions and
 | 
			
		||||
/// limitations under the License.
 | 
			
		||||
///
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
import config from 'config';
 | 
			
		||||
import path from 'path';
 | 
			
		||||
import DailyRotateFile from 'winston-daily-rotate-file';
 | 
			
		||||
import { createLogger, format, transports }  from 'winston';
 | 
			
		||||
import * as Transport from 'winston-transport';
 | 
			
		||||
const { combine, timestamp, label, printf, splat } = format;
 | 
			
		||||
 | 
			
		||||
const loggerTransports: Array<Transport> = [];
 | 
			
		||||
 | 
			
		||||
if (process.env.NODE_ENV !== 'production' || process.env.DOCKER_MODE === 'true') {
 | 
			
		||||
    loggerTransports.push(new transports.Console({
 | 
			
		||||
        handleExceptions: true
 | 
			
		||||
    }));
 | 
			
		||||
} else {
 | 
			
		||||
    const filename = path.join(config.get('logger.path'), config.get('logger.filename'));
 | 
			
		||||
    const transport = new (DailyRotateFile)({
 | 
			
		||||
        filename: filename,
 | 
			
		||||
        datePattern: 'YYYY-MM-DD-HH',
 | 
			
		||||
        zippedArchive: true,
 | 
			
		||||
        maxSize: '20m',
 | 
			
		||||
        maxFiles: '14d',
 | 
			
		||||
        handleExceptions: true
 | 
			
		||||
    });
 | 
			
		||||
    loggerTransports.push(transport);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const tbFormat = printf(info => {
 | 
			
		||||
    let logMessage = `${info.timestamp} [${info.label}] ${info.level.toUpperCase()}: ${info.message}`;
 | 
			
		||||
    if (info.stack) {
 | 
			
		||||
        logMessage += ':\n' + info.stack;
 | 
			
		||||
    }
 | 
			
		||||
    return logMessage;
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
export function _logger(moduleLabel: string) {
 | 
			
		||||
    return createLogger({
 | 
			
		||||
        level: config.get('logger.level'),
 | 
			
		||||
        format:combine(
 | 
			
		||||
            splat(),
 | 
			
		||||
            label({ label: moduleLabel }),
 | 
			
		||||
            timestamp({format: 'YYYY-MM-DD HH:mm:ss,SSS'}),
 | 
			
		||||
            tbFormat
 | 
			
		||||
        ),
 | 
			
		||||
        transports: loggerTransports
 | 
			
		||||
    });
 | 
			
		||||
}
 | 
			
		||||
@ -28,6 +28,7 @@ COPY ["src/package.json", "src/yarn.lock", "./"]
 | 
			
		||||
COPY package/linux/conf ./conf
 | 
			
		||||
COPY package/linux/conf ./config
 | 
			
		||||
COPY web ./web
 | 
			
		||||
COPY src/config ./config
 | 
			
		||||
COPY src/server.js ./
 | 
			
		||||
 | 
			
		||||
RUN chmod a+x /tmp/*.sh \
 | 
			
		||||
 | 
			
		||||
@ -3,13 +3,14 @@
 | 
			
		||||
  "private": true,
 | 
			
		||||
  "version": "3.4.0",
 | 
			
		||||
  "description": "ThingsBoard Web UI Microservice",
 | 
			
		||||
  "main": "server.js",
 | 
			
		||||
  "main": "server.ts",
 | 
			
		||||
  "bin": "server.js",
 | 
			
		||||
  "scripts": {
 | 
			
		||||
    "pkg": "pkg -t node16-linux-x64,node16-win-x64 --out-path ./target . && node install.js",
 | 
			
		||||
    "pkg": "tsc && pkg -t node16-linux-x64,node16-win-x64 --out-path ./target ./target/src && node install.js",
 | 
			
		||||
    "test": "echo \"Error: no test specified\" && exit 1",
 | 
			
		||||
    "start": "WEB_FOLDER=./target/web nodemon server.js",
 | 
			
		||||
    "start-prod": "NODE_ENV=production nodemon server.js"
 | 
			
		||||
    "start": "nodemon --watch '.' --ext 'ts' --exec 'WEB_FOLDER=./target/web ts-node server.ts'",
 | 
			
		||||
    "start-prod": "nodemon --watch '.' --ext 'ts' --exec 'WEB_FOLDER=./target/web NODE_ENV=production ts-node server.ts'",
 | 
			
		||||
    "build": "tsc"
 | 
			
		||||
  },
 | 
			
		||||
  "dependencies": {
 | 
			
		||||
    "compression": "^1.7.4",
 | 
			
		||||
@ -31,9 +32,17 @@
 | 
			
		||||
    ]
 | 
			
		||||
  },
 | 
			
		||||
  "devDependencies": {
 | 
			
		||||
    "@types/compression": "^1.7.2",
 | 
			
		||||
    "@types/config": "^0.0.41",
 | 
			
		||||
    "@types/connect-history-api-fallback": "^1.3.5",
 | 
			
		||||
    "@types/express": "^4.17.13",
 | 
			
		||||
    "@types/http-proxy": "^1.17.9",
 | 
			
		||||
    "@types/node": "^18.0.0",
 | 
			
		||||
    "fs-extra": "^10.1.0",
 | 
			
		||||
    "nodemon": "^2.0.16",
 | 
			
		||||
    "pkg": "^5.7.0"
 | 
			
		||||
    "pkg": "^5.7.0",
 | 
			
		||||
    "ts-node": "^10.8.1",
 | 
			
		||||
    "typescript": "^4.7.4"
 | 
			
		||||
  },
 | 
			
		||||
  "pkg": {
 | 
			
		||||
    "assets": [
 | 
			
		||||
 | 
			
		||||
@ -98,6 +98,7 @@
 | 
			
		||||
                        <goals>
 | 
			
		||||
                            <goal>yarn</goal>
 | 
			
		||||
                        </goals>
 | 
			
		||||
                        <phase>compile</phase>
 | 
			
		||||
                        <configuration>
 | 
			
		||||
                            <arguments>run pkg</arguments>
 | 
			
		||||
                        </configuration>
 | 
			
		||||
@ -162,7 +163,6 @@
 | 
			
		||||
                                <resource>
 | 
			
		||||
                                    <directory>${basedir}</directory>
 | 
			
		||||
                                    <includes>
 | 
			
		||||
                                        <include>server.js</include>
 | 
			
		||||
                                        <include>package.json</include>
 | 
			
		||||
                                        <include>yarn.lock</include>
 | 
			
		||||
                                    </includes>
 | 
			
		||||
 | 
			
		||||
@ -1,3 +1,19 @@
 | 
			
		||||
///
 | 
			
		||||
/// Copyright © 2016-2022 The Thingsboard Authors
 | 
			
		||||
///
 | 
			
		||||
/// Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
/// you may not use this file except in compliance with the License.
 | 
			
		||||
/// You may obtain a copy of the License at
 | 
			
		||||
///
 | 
			
		||||
///     http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
///
 | 
			
		||||
/// Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
/// distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
/// See the License for the specific language governing permissions and
 | 
			
		||||
/// limitations under the License.
 | 
			
		||||
///
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright © 2016-2022 The Thingsboard Authors
 | 
			
		||||
 *
 | 
			
		||||
@ -13,28 +29,31 @@
 | 
			
		||||
 * See the License for the specific language governing permissions and
 | 
			
		||||
 * limitations under the License.
 | 
			
		||||
 */
 | 
			
		||||
const config = require('config'),
 | 
			
		||||
      logger = require('./config/logger')('main'),
 | 
			
		||||
      express = require('express'),
 | 
			
		||||
      compression = require('compression'),
 | 
			
		||||
      http = require('http'),
 | 
			
		||||
      httpProxy = require('http-proxy'),
 | 
			
		||||
      path = require('path'),
 | 
			
		||||
      historyApiFallback = require("connect-history-api-fallback");
 | 
			
		||||
 | 
			
		||||
var server;
 | 
			
		||||
import express from 'express';
 | 
			
		||||
import config from 'config';
 | 
			
		||||
import { _logger}  from './config/logger';
 | 
			
		||||
import path from 'path';
 | 
			
		||||
import http, { ServerResponse } from 'http';
 | 
			
		||||
import httpProxy from 'http-proxy';
 | 
			
		||||
import compression from 'compression';
 | 
			
		||||
import historyApiFallback from 'connect-history-api-fallback';
 | 
			
		||||
 | 
			
		||||
const logger = _logger('main');
 | 
			
		||||
 | 
			
		||||
let server: http.Server | null;
 | 
			
		||||
 | 
			
		||||
(async() => {
 | 
			
		||||
    try {
 | 
			
		||||
        logger.info('Starting ThingsBoard Web UI Microservice...');
 | 
			
		||||
 | 
			
		||||
        const bindAddress = config.get('server.address');
 | 
			
		||||
        const bindPort = config.get('server.port');
 | 
			
		||||
        const bindAddress: string = config.get('server.address');
 | 
			
		||||
        const bindPort = Number(config.get('server.port'));
 | 
			
		||||
 | 
			
		||||
        const thingsboardEnableProxy = config.get('thingsboard.enableProxy');
 | 
			
		||||
        const thingsboardEnableProxy: string = config.get('thingsboard.enableProxy');
 | 
			
		||||
 | 
			
		||||
        const thingsboardHost = config.get('thingsboard.host');
 | 
			
		||||
        const thingsboardPort = config.get('thingsboard.port');
 | 
			
		||||
        const thingsboardHost: string = config.get('thingsboard.host');
 | 
			
		||||
        const thingsboardPort = Number(config.get('thingsboard.port'));
 | 
			
		||||
 | 
			
		||||
        logger.info('Bind address: %s', bindAddress);
 | 
			
		||||
        logger.info('Bind port: %s', bindPort);
 | 
			
		||||
@ -44,9 +63,9 @@ var server;
 | 
			
		||||
 | 
			
		||||
        const useApiProxy = thingsboardEnableProxy === "true";
 | 
			
		||||
 | 
			
		||||
        var webDir = path.join(__dirname, 'web');
 | 
			
		||||
        let webDir = path.join(__dirname, 'web');
 | 
			
		||||
 | 
			
		||||
        if (typeof process.env.WEB_FOLDER === 'string') {
 | 
			
		||||
        if (typeof process.env.WEB_FOLDER !== 'undefined') {
 | 
			
		||||
            webDir = path.resolve(process.env.WEB_FOLDER);
 | 
			
		||||
        }
 | 
			
		||||
        logger.info('Web folder: %s', webDir);
 | 
			
		||||
@ -54,7 +73,7 @@ var server;
 | 
			
		||||
        const app = express();
 | 
			
		||||
        server = http.createServer(app);
 | 
			
		||||
 | 
			
		||||
        var apiProxy;
 | 
			
		||||
        let apiProxy: httpProxy;
 | 
			
		||||
        if (useApiProxy) {
 | 
			
		||||
            apiProxy = httpProxy.createProxyServer({
 | 
			
		||||
                target: {
 | 
			
		||||
@ -65,13 +84,14 @@ var server;
 | 
			
		||||
 | 
			
		||||
            apiProxy.on('error', function (err, req, res) {
 | 
			
		||||
                logger.warn('API proxy error: %s', err.message);
 | 
			
		||||
                if (res.writeHead) {
 | 
			
		||||
                  res.writeHead(500);
 | 
			
		||||
                  if (err.code && err.code === 'ECONNREFUSED') {
 | 
			
		||||
                    res.end('Unable to connect to ThingsBoard server.');
 | 
			
		||||
                  } else {
 | 
			
		||||
                    res.end('Thingsboard server connection error: ' + err.code ? err.code : '');
 | 
			
		||||
                  }
 | 
			
		||||
                if (res instanceof ServerResponse) {
 | 
			
		||||
                    res.writeHead(500);
 | 
			
		||||
                    const error = err as any;
 | 
			
		||||
                    if (error.code && error.code === 'ECONNREFUSED') {
 | 
			
		||||
                        res.end('Unable to connect to ThingsBoard server.');
 | 
			
		||||
                    } else {
 | 
			
		||||
                        res.end('Thingsboard server connection error: ' + error.code ? error.code : '');
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            });
 | 
			
		||||
            app.all('/api/*', (req, res) => {
 | 
			
		||||
@ -95,18 +115,16 @@ var server;
 | 
			
		||||
 | 
			
		||||
        app.use(express.static(root));
 | 
			
		||||
 | 
			
		||||
        server.listen(bindPort, bindAddress, (error) => {
 | 
			
		||||
            if (error) {
 | 
			
		||||
                logger.error('Failed to start ThingsBoard Web UI Microservice: %s', e.message);
 | 
			
		||||
                logger.error(error.stack);
 | 
			
		||||
                exit(-1);
 | 
			
		||||
            } else {
 | 
			
		||||
                logger.info('==> 🌎  Listening on port %s.', bindPort);
 | 
			
		||||
                logger.info('Started ThingsBoard Web UI Microservice.');
 | 
			
		||||
            }
 | 
			
		||||
        server.listen(bindPort, bindAddress, () => {
 | 
			
		||||
            logger.info('==> 🌎  Listening on port %s.', bindPort);
 | 
			
		||||
            logger.info('Started ThingsBoard Web UI Microservice.');
 | 
			
		||||
        }).on('error', (error) => {
 | 
			
		||||
            logger.error('Failed to start ThingsBoard Web UI Microservice: %s', error.message);
 | 
			
		||||
            logger.error(error.stack);
 | 
			
		||||
            exit(-1);
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
    } catch (e) {
 | 
			
		||||
    } catch (e: any) {
 | 
			
		||||
        logger.error('Failed to start ThingsBoard Web UI Microservice: %s', e.message);
 | 
			
		||||
        logger.error(e.stack);
 | 
			
		||||
        exit(-1);
 | 
			
		||||
@ -117,11 +135,11 @@ process.on('exit', function () {
 | 
			
		||||
    exit(0);
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
function exit(status) {
 | 
			
		||||
function exit(status: number) {
 | 
			
		||||
    logger.info('Exiting with status: %d ...', status);
 | 
			
		||||
    if (server) {
 | 
			
		||||
        logger.info('Stopping HTTP Server...');
 | 
			
		||||
        var _server = server;
 | 
			
		||||
        const _server = server;
 | 
			
		||||
        server = null;
 | 
			
		||||
        _server.close(() => {
 | 
			
		||||
            logger.info('HTTP Server stopped.');
 | 
			
		||||
							
								
								
									
										13
									
								
								msa/web-ui/tsconfig.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								msa/web-ui/tsconfig.json
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,13 @@
 | 
			
		||||
{
 | 
			
		||||
  "compilerOptions": {
 | 
			
		||||
    "outDir": "target/src",
 | 
			
		||||
    "target": "es2016",
 | 
			
		||||
    "module": "commonjs",
 | 
			
		||||
    "esModuleInterop": true,
 | 
			
		||||
    "forceConsistentCasingInFileNames": true,
 | 
			
		||||
    "strict": true,
 | 
			
		||||
    "skipLibCheck": true,
 | 
			
		||||
    "strictPropertyInitialization": false
 | 
			
		||||
  },
 | 
			
		||||
  "exclude": ["node_modules", "target"]
 | 
			
		||||
}
 | 
			
		||||
@ -25,6 +25,13 @@
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9"
 | 
			
		||||
  integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==
 | 
			
		||||
 | 
			
		||||
"@cspotcode/source-map-support@^0.8.0":
 | 
			
		||||
  version "0.8.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1"
 | 
			
		||||
  integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    "@jridgewell/trace-mapping" "0.3.9"
 | 
			
		||||
 | 
			
		||||
"@dabh/diagnostics@^2.0.2":
 | 
			
		||||
  version "2.0.2"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/@dabh/diagnostics/-/diagnostics-2.0.2.tgz#290d08f7b381b8f94607dc8f471a12c675f9db31"
 | 
			
		||||
@ -34,6 +41,24 @@
 | 
			
		||||
    enabled "2.0.x"
 | 
			
		||||
    kuler "^2.0.0"
 | 
			
		||||
 | 
			
		||||
"@jridgewell/resolve-uri@^3.0.3":
 | 
			
		||||
  version "3.0.8"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.0.8.tgz#687cc2bbf243f4e9a868ecf2262318e2658873a1"
 | 
			
		||||
  integrity sha512-YK5G9LaddzGbcucK4c8h5tWFmMPBvRZ/uyWmN1/SbBdIvqGUdWGkJ5BAaccgs6XbzVLsqbPJrBSFwKv3kT9i7w==
 | 
			
		||||
 | 
			
		||||
"@jridgewell/sourcemap-codec@^1.4.10":
 | 
			
		||||
  version "1.4.14"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24"
 | 
			
		||||
  integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==
 | 
			
		||||
 | 
			
		||||
"@jridgewell/trace-mapping@0.3.9":
 | 
			
		||||
  version "0.3.9"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9"
 | 
			
		||||
  integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    "@jridgewell/resolve-uri" "^3.0.3"
 | 
			
		||||
    "@jridgewell/sourcemap-codec" "^1.4.10"
 | 
			
		||||
 | 
			
		||||
"@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"
 | 
			
		||||
@ -67,11 +92,120 @@
 | 
			
		||||
  dependencies:
 | 
			
		||||
    defer-to-connect "^1.0.1"
 | 
			
		||||
 | 
			
		||||
"@tsconfig/node10@^1.0.7":
 | 
			
		||||
  version "1.0.9"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2"
 | 
			
		||||
  integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==
 | 
			
		||||
 | 
			
		||||
"@tsconfig/node12@^1.0.7":
 | 
			
		||||
  version "1.0.11"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d"
 | 
			
		||||
  integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==
 | 
			
		||||
 | 
			
		||||
"@tsconfig/node14@^1.0.0":
 | 
			
		||||
  version "1.0.3"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1"
 | 
			
		||||
  integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==
 | 
			
		||||
 | 
			
		||||
"@tsconfig/node16@^1.0.2":
 | 
			
		||||
  version "1.0.3"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.3.tgz#472eaab5f15c1ffdd7f8628bd4c4f753995ec79e"
 | 
			
		||||
  integrity sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==
 | 
			
		||||
 | 
			
		||||
"@types/body-parser@*":
 | 
			
		||||
  version "1.19.2"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.2.tgz#aea2059e28b7658639081347ac4fab3de166e6f0"
 | 
			
		||||
  integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    "@types/connect" "*"
 | 
			
		||||
    "@types/node" "*"
 | 
			
		||||
 | 
			
		||||
"@types/color-name@^1.1.1":
 | 
			
		||||
  version "1.1.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0"
 | 
			
		||||
  integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==
 | 
			
		||||
 | 
			
		||||
"@types/compression@^1.7.2":
 | 
			
		||||
  version "1.7.2"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/@types/compression/-/compression-1.7.2.tgz#7cc1cdb01b4730eea284615a68fc70a2cdfd5e71"
 | 
			
		||||
  integrity sha512-lwEL4M/uAGWngWFLSG87ZDr2kLrbuR8p7X+QZB1OQlT+qkHsCPDVFnHPyXf4Vyl4yDDorNY+mAhosxkCvppatg==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    "@types/express" "*"
 | 
			
		||||
 | 
			
		||||
"@types/config@^0.0.41":
 | 
			
		||||
  version "0.0.41"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/@types/config/-/config-0.0.41.tgz#c8237ab09730380801f3643beaefa077ca5f3c28"
 | 
			
		||||
  integrity sha512-HjXUmIld0gwvyG8MU/17QtLzOyuMX4jbGuijmS9sWsob5xxgZ/hY9cbRCaHIHqTQ3HMLhwS3F8uXq3Bt9zgzHA==
 | 
			
		||||
 | 
			
		||||
"@types/connect-history-api-fallback@^1.3.5":
 | 
			
		||||
  version "1.3.5"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz#d1f7a8a09d0ed5a57aee5ae9c18ab9b803205dae"
 | 
			
		||||
  integrity sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    "@types/express-serve-static-core" "*"
 | 
			
		||||
    "@types/node" "*"
 | 
			
		||||
 | 
			
		||||
"@types/connect@*":
 | 
			
		||||
  version "3.4.35"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1"
 | 
			
		||||
  integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    "@types/node" "*"
 | 
			
		||||
 | 
			
		||||
"@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.18":
 | 
			
		||||
  version "4.17.29"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.29.tgz#2a1795ea8e9e9c91b4a4bbe475034b20c1ec711c"
 | 
			
		||||
  integrity sha512-uMd++6dMKS32EOuw1Uli3e3BPgdLIXmezcfHv7N4c1s3gkhikBplORPpMq3fuWkxncZN1reb16d5n8yhQ80x7Q==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    "@types/node" "*"
 | 
			
		||||
    "@types/qs" "*"
 | 
			
		||||
    "@types/range-parser" "*"
 | 
			
		||||
 | 
			
		||||
"@types/express@*", "@types/express@^4.17.13":
 | 
			
		||||
  version "4.17.13"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.13.tgz#a76e2995728999bab51a33fabce1d705a3709034"
 | 
			
		||||
  integrity sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    "@types/body-parser" "*"
 | 
			
		||||
    "@types/express-serve-static-core" "^4.17.18"
 | 
			
		||||
    "@types/qs" "*"
 | 
			
		||||
    "@types/serve-static" "*"
 | 
			
		||||
 | 
			
		||||
"@types/http-proxy@^1.17.9":
 | 
			
		||||
  version "1.17.9"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.9.tgz#7f0e7931343761efde1e2bf48c40f02f3f75705a"
 | 
			
		||||
  integrity sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    "@types/node" "*"
 | 
			
		||||
 | 
			
		||||
"@types/mime@^1":
 | 
			
		||||
  version "1.3.2"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a"
 | 
			
		||||
  integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==
 | 
			
		||||
 | 
			
		||||
"@types/node@*", "@types/node@^18.0.0":
 | 
			
		||||
  version "18.0.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/@types/node/-/node-18.0.0.tgz#67c7b724e1bcdd7a8821ce0d5ee184d3b4dd525a"
 | 
			
		||||
  integrity sha512-cHlGmko4gWLVI27cGJntjs/Sj8th9aYwplmZFwmmgYQQvL5NUsgVJG7OddLvNfLqYS31KFN0s3qlaD9qCaxACA==
 | 
			
		||||
 | 
			
		||||
"@types/qs@*":
 | 
			
		||||
  version "6.9.7"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb"
 | 
			
		||||
  integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==
 | 
			
		||||
 | 
			
		||||
"@types/range-parser@*":
 | 
			
		||||
  version "1.2.4"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc"
 | 
			
		||||
  integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==
 | 
			
		||||
 | 
			
		||||
"@types/serve-static@*":
 | 
			
		||||
  version "1.13.10"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.10.tgz#f5e0ce8797d2d7cc5ebeda48a52c96c4fa47a8d9"
 | 
			
		||||
  integrity sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    "@types/mime" "^1"
 | 
			
		||||
    "@types/node" "*"
 | 
			
		||||
 | 
			
		||||
abbrev@1:
 | 
			
		||||
  version "1.1.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
 | 
			
		||||
@ -93,6 +227,16 @@ accepts@~1.3.8:
 | 
			
		||||
    mime-types "~2.1.34"
 | 
			
		||||
    negotiator "0.6.3"
 | 
			
		||||
 | 
			
		||||
acorn-walk@^8.1.1:
 | 
			
		||||
  version "8.2.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1"
 | 
			
		||||
  integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==
 | 
			
		||||
 | 
			
		||||
acorn@^8.4.1:
 | 
			
		||||
  version "8.7.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.1.tgz#0197122c843d1bf6d0a5e83220a788f278f63c30"
 | 
			
		||||
  integrity sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==
 | 
			
		||||
 | 
			
		||||
agent-base@6:
 | 
			
		||||
  version "6.0.2"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77"
 | 
			
		||||
@ -168,6 +312,11 @@ are-we-there-yet@~1.1.2:
 | 
			
		||||
    delegates "^1.0.0"
 | 
			
		||||
    readable-stream "^2.0.6"
 | 
			
		||||
 | 
			
		||||
arg@^4.1.0:
 | 
			
		||||
  version "4.1.3"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089"
 | 
			
		||||
  integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==
 | 
			
		||||
 | 
			
		||||
argparse@^2.0.1:
 | 
			
		||||
  version "2.0.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38"
 | 
			
		||||
@ -496,6 +645,11 @@ core-util-is@~1.0.0:
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
 | 
			
		||||
  integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
 | 
			
		||||
 | 
			
		||||
create-require@^1.1.0:
 | 
			
		||||
  version "1.1.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333"
 | 
			
		||||
  integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==
 | 
			
		||||
 | 
			
		||||
crypto-random-string@^2.0.0:
 | 
			
		||||
  version "2.0.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5"
 | 
			
		||||
@ -571,6 +725,11 @@ detect-libc@^1.0.3:
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b"
 | 
			
		||||
  integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=
 | 
			
		||||
 | 
			
		||||
diff@^4.0.1:
 | 
			
		||||
  version "4.0.2"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d"
 | 
			
		||||
  integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==
 | 
			
		||||
 | 
			
		||||
dir-glob@^3.0.1:
 | 
			
		||||
  version "3.0.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f"
 | 
			
		||||
@ -1251,6 +1410,11 @@ make-dir@^3.0.0:
 | 
			
		||||
  dependencies:
 | 
			
		||||
    semver "^6.0.0"
 | 
			
		||||
 | 
			
		||||
make-error@^1.1.1:
 | 
			
		||||
  version "1.3.6"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2"
 | 
			
		||||
  integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==
 | 
			
		||||
 | 
			
		||||
media-typer@0.3.0:
 | 
			
		||||
  version "0.3.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
 | 
			
		||||
@ -2098,6 +2262,25 @@ triple-beam@^1.2.0, triple-beam@^1.3.0:
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/triple-beam/-/triple-beam-1.3.0.tgz#a595214c7298db8339eeeee083e4d10bd8cb8dd9"
 | 
			
		||||
  integrity sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==
 | 
			
		||||
 | 
			
		||||
ts-node@^10.8.1:
 | 
			
		||||
  version "10.8.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.8.1.tgz#ea2bd3459011b52699d7e88daa55a45a1af4f066"
 | 
			
		||||
  integrity sha512-Wwsnao4DQoJsN034wePSg5nZiw4YKXf56mPIAeD6wVmiv+RytNSWqc2f3fKvcUoV+Yn2+yocD71VOfQHbmVX4g==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    "@cspotcode/source-map-support" "^0.8.0"
 | 
			
		||||
    "@tsconfig/node10" "^1.0.7"
 | 
			
		||||
    "@tsconfig/node12" "^1.0.7"
 | 
			
		||||
    "@tsconfig/node14" "^1.0.0"
 | 
			
		||||
    "@tsconfig/node16" "^1.0.2"
 | 
			
		||||
    acorn "^8.4.1"
 | 
			
		||||
    acorn-walk "^8.1.1"
 | 
			
		||||
    arg "^4.1.0"
 | 
			
		||||
    create-require "^1.1.0"
 | 
			
		||||
    diff "^4.0.1"
 | 
			
		||||
    make-error "^1.1.1"
 | 
			
		||||
    v8-compile-cache-lib "^3.0.1"
 | 
			
		||||
    yn "3.1.1"
 | 
			
		||||
 | 
			
		||||
tunnel-agent@^0.6.0:
 | 
			
		||||
  version "0.6.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
 | 
			
		||||
@ -2132,6 +2315,11 @@ typedarray-to-buffer@^3.1.5:
 | 
			
		||||
  dependencies:
 | 
			
		||||
    is-typedarray "^1.0.0"
 | 
			
		||||
 | 
			
		||||
typescript@^4.7.4:
 | 
			
		||||
  version "4.7.4"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.7.4.tgz#1a88596d1cf47d59507a1bcdfb5b9dfe4d488235"
 | 
			
		||||
  integrity sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==
 | 
			
		||||
 | 
			
		||||
undefsafe@^2.0.5:
 | 
			
		||||
  version "2.0.5"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.5.tgz#38733b9327bdcd226db889fb723a6efd162e6e2c"
 | 
			
		||||
@ -2196,6 +2384,11 @@ utils-merge@1.0.1:
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
 | 
			
		||||
  integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=
 | 
			
		||||
 | 
			
		||||
v8-compile-cache-lib@^3.0.1:
 | 
			
		||||
  version "3.0.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf"
 | 
			
		||||
  integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==
 | 
			
		||||
 | 
			
		||||
vary@~1.1.2:
 | 
			
		||||
  version "1.1.2"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
 | 
			
		||||
@ -2332,3 +2525,8 @@ yargs@^16.2.0:
 | 
			
		||||
    string-width "^4.2.0"
 | 
			
		||||
    y18n "^5.0.5"
 | 
			
		||||
    yargs-parser "^20.2.2"
 | 
			
		||||
 | 
			
		||||
yn@3.1.1:
 | 
			
		||||
  version "3.1.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50"
 | 
			
		||||
  integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user