help prs, why do i get ENOENT on second downloadFile in downloadPlugin?

This commit is contained in:
Daniel Hübleitner
2019-08-01 16:56:53 +02:00
parent ea346fe0cb
commit 4edf6c1a7f
5 changed files with 388 additions and 74 deletions
+1 -1
View File
@@ -2,4 +2,4 @@ node_modules
lib
static
kfs
plugin
plugins
+9 -59
View File
@@ -3,46 +3,26 @@
import * as Logger from 'log4js'
import { Plugin, socketioRPC } from 'frontblock-generic/Plugin';
import { ErrorResponse, SuccessResponse } from 'frontblock-generic/Types';
import { PluginManager } from './PluginManager'
import express = require('express');
import http = require('http');
import fs = require('fs');
import bsock = require('bsock');
import fetch = require("node-fetch");
const kfs = require("key-file-storage").default('kfs')
type pluginEntry =
{
pluginName:string
}
const pluginList:pluginEntry[] =
[
//{ pluginName: 'apiclient' },
//{ pluginName: 'paymentmanager' },
//{ pluginName: 'wallet' },
{ pluginName: 'htmlsupplier' }
]
type releaseEntry =
{
tagName: string,
staticZipURL: URL,
checksumFileURL: URL
}
Logger.configure({
appenders:
{
"admin": { type: 'stdout' },
"frontblock-admin": { type: 'stdout' },
//app: { type: 'file', filename: 'application.log' }
},
categories:
{
default: { appenders: [ 'admin' ], level: 'debug' }
default: { appenders: [ 'frontblock-admin' ], level: 'debug' }
}
})
const logger = Logger.getLogger("admin")
const logger = Logger.getLogger("frontblock-admin")
type hookRPC =
{
@@ -80,58 +60,28 @@ export type rpcInfo =
* The list of available plugins is published via the frontblock API and downloaded via gitea-releases
*/
export class FrontblockAdmin{
private plugins: Plugin[]
private plugins: Plugin[] = []
private hookToUids:{[hookName:string]:string[]} = {}
private express
private httpServer
private io = bsock.createServer()
private wsServer = http.createServer()
private pm: PluginManager
constructor(){
if(!('admin.conf' in kfs)){
logger.info('Generating ./kfs/admin.conf')
kfs['admin.conf'] = { httpPort: 8080 }
}
this.pm = new PluginManager()
this.initialize()
}
private async initialize(){
const wat = await this.fetchReleaseList('htmlsupplier')
logger.debug(wat)
//await this.downloadPlugins()
//this.plugins.forEach(plugin => plugin.start())
//this.startWebsocket()
//this.startWebserver()
}
private async fetchReleaseList(pluginName:string): Promise<releaseEntry[]>{
const res = await fetch('https://gitea.frontblock.me/api/v1/repos/fb-vendor/' + pluginName + '/releases')
const json = await res.json();
const releaseList:releaseEntry[] = []
json.forEach((release) => {
const tagName = release.tag_name
const staticZipURL = release.assets.filter(asset => asset.name === pluginName + '.zip')[0].browser_download_url
const checksumFileURL = release.assets.filter(asset => asset.name === 'md5sum.txt')[0].browser_download_url
releaseList.push({tagName,staticZipURL,checksumFileURL})
})
return releaseList
}
private async downloadPlugin(release:releaseEntry) {
}
private async verifyPlugin(release:releaseEntry) {
}
private async extractPlugin(release:releaseEntry) {
}
private async installPlugin(release:releaseEntry) {
}
private initApis(socket){
//Declare own functions
const rpcInfos:rpcInfo[] = [
@@ -234,7 +184,7 @@ export class FrontblockAdmin{
private restartWebserver(port:number){
this.stopWebserver()
kfs.FrontblockAdmin = { httpPort: port }
kfs['admin.conf'] = { httpPort: port }
this.startWebserver()
}
+136
View File
@@ -0,0 +1,136 @@
'use strict'
import * as Logger from 'log4js';
import fetch = require('node-fetch');
import fs = require('fs');
import path = require('path')
import unzip = require('unzip')
Logger.configure({
appenders:
{
"plugin-manager": { type: 'stdout' },
//app: { type: 'file', filename: 'application.log' }
},
categories:
{
default: { appenders: [ 'plugin-manager' ], level: 'debug' }
}
})
const logger = Logger.getLogger("plugin-manager")
export class PluginManager{
private installDir: string
private cacheDir: string
private loadedPlugins: string[]
constructor(installDir: string = './plugins'){
this.installDir = installDir
this.cacheDir = path.join(installDir, '.cache')
this.initialize()
}
private initialize() {
logger.info('Initializing manager')
try {
fs.access(this.cacheDir, async err => {
if (err && err.code === 'ENOENT') {
await fs.promises.mkdir(this.cacheDir, {recursive: true})
logger.info('Manager installed to ' + this.installDir)
} else {
logger.info('Manager already installed at ' + this.installDir)
}
})
} catch (error) {
logger.error(error)
}
}
public async getAvailablePlugins(): Promise<string[] | void> {
return [
'apiclient',
'paymentmanager',
'wallet',
'htmlsupplier'
]
}
public async getInstalledPlugins(): Promise<string[] | void> {
try {
const installed = await fs.promises.readdir(this.installDir)
return installed.filter( entry => entry[0] != '.')
} catch (error) {
logger.error(error)
return
}
}
public async getLoadedPlugins(): Promise<string[] | void> {
return this.loadedPlugins
}
private async downloadFile(url: URL, dest: string) {
try {
fs.access(path.dirname(dest), err => {
if (err && err.code === 'ENOENT') {
fs.mkdirSync(path.dirname(dest), {recursive: true})
}
})
const file = fs.createWriteStream(dest)
file.on('error', err => {throw new Error(err)})
const response = await fetch(url)
if (!response.ok) throw new Error(response.statusText)
response.body.pipe(file)
} catch (error) {
logger.error(error)
await fs.promises.unlink(dest)
}
}
private async downloadPlugin(pluginName: string) {
try {
const response = await fetch('https://gitea.frontblock.me/api/v1/repos/fb-vendor/' + pluginName + '/releases')
if (!response.ok) throw new Error(response.statusText)
const releases = await response.json()
if (!releases || !releases.length) throw new Error('Empty response')
const latest = releases[0]
const version = latest.tag_name
const archiveURL = latest.assets.filter(asset => asset.name === pluginName + '.zip')[0].browser_download_url
const checksumURL = latest.assets.filter(asset => asset.name === 'md5sum.txt')[0].browser_download_url
if (!version || ! archiveURL || !checksumURL) throw new Error('Malformed response')
await this.downloadFile(archiveURL, path.join(this.cacheDir, pluginName, version, 'plugin.zip'))
await this.downloadFile(checksumURL, path.join(this.cacheDir, pluginName, version, 'md5sum.txt'))
} catch (error) {
logger.error(error)
}
}
public async installPlugin(pluginName: string) {
try {
await this.downloadPlugin(pluginName)
} catch (error) {
logger.debug(error)
}
}
public uninstallPlugin(pluginName: string) {
}
public async loadPlugin() {
}
public async unloadPlugin() {
}
}
+234 -9
View File
@@ -386,7 +386,8 @@
"@types/angular": {
"version": "1.6.55",
"resolved": "https://registry.npmjs.org/@types/angular/-/angular-1.6.55.tgz",
"integrity": "sha512-jpQ5K6t76thd9Ook5x4Xj9K462hMje6/Q84SFxglBmaW8HOLblVnALpvg6w6aV3Oe6o9jWXnYH8gHHKrfSRxNQ=="
"integrity": "sha512-jpQ5K6t76thd9Ook5x4Xj9K462hMje6/Q84SFxglBmaW8HOLblVnALpvg6w6aV3Oe6o9jWXnYH8gHHKrfSRxNQ==",
"dev": true
},
"@types/babel__core": {
"version": "7.1.2",
@@ -433,6 +434,7 @@
"version": "1.17.0",
"resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.17.0.tgz",
"integrity": "sha512-a2+YeUjPkztKJu5aIF2yArYFQQp8d51wZ7DavSHjFuY1mqVgidGyzEQ41JIVNy82fXj8yPgy2vJmfIywgESW6w==",
"dev": true,
"requires": {
"@types/connect": "*",
"@types/node": "*"
@@ -442,6 +444,7 @@
"version": "3.4.32",
"resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.32.tgz",
"integrity": "sha512-4r8qa0quOvh7lGD0pre62CAb1oni1OO6ecJLGCezTmhQ8Fz50Arx9RUszryR8KlgK6avuSXvviL6yWyViQABOg==",
"dev": true,
"requires": {
"@types/node": "*"
}
@@ -450,6 +453,7 @@
"version": "4.17.0",
"resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.0.tgz",
"integrity": "sha512-CjaMu57cjgjuZbh9DpkloeGxV45CnMGlVd+XpG7Gm9QgVrd7KFq+X4HY0vM+2v0bczS48Wg7bvnMY5TN+Xmcfw==",
"dev": true,
"requires": {
"@types/body-parser": "*",
"@types/express-serve-static-core": "*",
@@ -460,6 +464,7 @@
"version": "4.16.7",
"resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.16.7.tgz",
"integrity": "sha512-847KvL8Q1y3TtFLRTXcVakErLJQgdpFSaq+k043xefz9raEf0C7HalpSY7OW5PyjCnY8P7bPW5t/Co9qqp+USg==",
"dev": true,
"requires": {
"@types/node": "*",
"@types/range-parser": "*"
@@ -521,7 +526,8 @@
"@types/mime": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.1.tgz",
"integrity": "sha512-FwI9gX75FgVBJ7ywgnq/P7tw+/o1GUbtP0KzbtusLigAOgIgNISRK0ZPl4qertvXSIE8YbsVJueQ90cDt9YYyw=="
"integrity": "sha512-FwI9gX75FgVBJ7ywgnq/P7tw+/o1GUbtP0KzbtusLigAOgIgNISRK0ZPl4qertvXSIE8YbsVJueQ90cDt9YYyw==",
"dev": true
},
"@types/node": {
"version": "11.13.18",
@@ -537,12 +543,20 @@
"@types/range-parser": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz",
"integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA=="
"integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==",
"dev": true
},
"@types/semver": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/@types/semver/-/semver-6.0.1.tgz",
"integrity": "sha512-ffCdcrEE5h8DqVxinQjo+2d1q+FV5z7iNtPofw3JsrltSoSVlOGaW0rY8XxtO9XukdTn8TaCGWmk2VFGhI70mg==",
"dev": true
},
"@types/serve-static": {
"version": "1.13.2",
"resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.2.tgz",
"integrity": "sha512-/BZ4QRLpH/bNYgZgwhKEh+5AsboDBcUdlBYgzoLX0fpj3Y2gp6EApyOlM3bK53wQS/OE1SrdSYBAbux2D1528Q==",
"dev": true,
"requires": {
"@types/express-serve-static-core": "*",
"@types/mime": "*"
@@ -557,7 +571,8 @@
"@types/webpack-env": {
"version": "1.14.0",
"resolved": "https://registry.npmjs.org/@types/webpack-env/-/webpack-env-1.14.0.tgz",
"integrity": "sha512-Fv+0gYJzE/czLoRKq+gnXWr4yBpPM3tO3C8pDLFwqVKlMICQUq5OsxwwFZYDaVr7+L6mgNDp16iOcJHEz3J5RQ=="
"integrity": "sha512-Fv+0gYJzE/czLoRKq+gnXWr4yBpPM3tO3C8pDLFwqVKlMICQUq5OsxwwFZYDaVr7+L6mgNDp16iOcJHEz3J5RQ==",
"dev": true
},
"@types/yargs": {
"version": "12.0.12",
@@ -1262,6 +1277,15 @@
"integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==",
"dev": true
},
"binary": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz",
"integrity": "sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk=",
"requires": {
"buffers": "~0.1.1",
"chainsaw": "~0.1.0"
}
},
"binary-extensions": {
"version": "1.13.1",
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz",
@@ -1528,6 +1552,11 @@
"integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=",
"dev": true
},
"buffers": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz",
"integrity": "sha1-skV5w77U1tOWru5tmorn9Ugqt7s="
},
"builtin-modules": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
@@ -1688,6 +1717,14 @@
"integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
"dev": true
},
"chainsaw": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz",
"integrity": "sha1-XqtQsor+WAdNDVgpE4iCi15fvJg=",
"requires": {
"traverse": ">=0.3.0 <0.4"
}
},
"chalk": {
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
@@ -2057,8 +2094,7 @@
"core-util-is": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
"integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
"dev": true
"integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
},
"cosmiconfig": {
"version": "5.2.1",
@@ -3159,6 +3195,11 @@
"integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=",
"dev": true
},
"fast-extend": {
"version": "0.0.2",
"resolved": "https://registry.npmjs.org/fast-extend/-/fast-extend-0.0.2.tgz",
"integrity": "sha1-9exCz0C5Rg9SGmOH37Ut7u1nHb0="
},
"fast-json-stable-stringify": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
@@ -3401,6 +3442,11 @@
}
}
},
"fs-monkey": {
"version": "0.3.3",
"resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-0.3.3.tgz",
"integrity": "sha512-FNUvuTAJ3CqCQb5ELn+qCbGR/Zllhf2HtwsdAtBi59s1WeCjKMT81fHcSu7dwIskqGVK+MmOrb7VOBlq3/SItw=="
},
"fs-write-stream-atomic": {
"version": "1.0.10",
"resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz",
@@ -5943,6 +5989,38 @@
"object-visit": "^1.0.0"
}
},
"match-stream": {
"version": "0.0.2",
"resolved": "https://registry.npmjs.org/match-stream/-/match-stream-0.0.2.tgz",
"integrity": "sha1-mesFAJOzTf+t5CG5rAtBCpz6F88=",
"requires": {
"buffers": "~0.1.1",
"readable-stream": "~1.0.0"
},
"dependencies": {
"isarray": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
"integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
},
"readable-stream": {
"version": "1.0.34",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
"integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
"requires": {
"core-util-is": "~1.0.0",
"inherits": "~2.0.1",
"isarray": "0.0.1",
"string_decoder": "~0.10.x"
}
},
"string_decoder": {
"version": "0.10.31",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
"integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
}
}
},
"md5.js": {
"version": "1.3.5",
"resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz",
@@ -5976,6 +6054,15 @@
"p-is-promise": "^2.0.0"
}
},
"memfs": {
"version": "2.15.5",
"resolved": "https://registry.npmjs.org/memfs/-/memfs-2.15.5.tgz",
"integrity": "sha512-x8v6Uok7FRuPt8RNXnIk3HzSFB2kaJtoT6ztpfIxxURjBPPsu4eKA+ZDLQ5GdV8+Lx71+vdMaBzHxy51vLQ7dw==",
"requires": {
"fast-extend": "0.0.2",
"fs-monkey": "^0.3.3"
}
},
"memory-fs": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz",
@@ -6320,6 +6407,11 @@
"to-regex": "^3.0.1"
}
},
"natives": {
"version": "1.1.6",
"resolved": "https://registry.npmjs.org/natives/-/natives-1.1.6.tgz",
"integrity": "sha512-6+TDFewD4yxY14ptjKaS63GVdtKiES1pTPyxn9Jb0rBqPMZ7VcCiooEhPNsr+mqHtMGxa/5c/HhcC4uPEUw/nA=="
},
"natural-compare": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
@@ -6841,6 +6933,11 @@
"os-tmpdir": "^1.0.0"
}
},
"over": {
"version": "0.0.5",
"resolved": "https://registry.npmjs.org/over/-/over-0.0.5.tgz",
"integrity": "sha1-8phS5w/X4l82DgE6jsRMgq7bVwg="
},
"p-defer": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz",
@@ -7823,6 +7920,40 @@
"safe-buffer": "^5.1.2"
}
},
"pullstream": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/pullstream/-/pullstream-0.4.1.tgz",
"integrity": "sha1-1vs79a7Wl+gxFQ6xACwlo/iuExQ=",
"requires": {
"over": ">= 0.0.5 < 1",
"readable-stream": "~1.0.31",
"setimmediate": ">= 1.0.2 < 2",
"slice-stream": ">= 1.0.0 < 2"
},
"dependencies": {
"isarray": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
"integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
},
"readable-stream": {
"version": "1.0.34",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
"integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
"requires": {
"core-util-is": "~1.0.0",
"inherits": "~2.0.1",
"isarray": "0.0.1",
"string_decoder": "~0.10.x"
}
},
"string_decoder": {
"version": "0.10.31",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
"integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
}
}
},
"pump": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
@@ -8285,7 +8416,6 @@
"version": "2.6.3",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
"integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
"dev": true,
"requires": {
"glob": "^7.1.3"
}
@@ -8711,8 +8841,7 @@
"setimmediate": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
"integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=",
"dev": true
"integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU="
},
"setprototypeof": {
"version": "1.1.1",
@@ -8804,6 +8933,37 @@
"integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==",
"dev": true
},
"slice-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/slice-stream/-/slice-stream-1.0.0.tgz",
"integrity": "sha1-WzO9ZvATsaf4ZGCwPUY97DmtPqA=",
"requires": {
"readable-stream": "~1.0.31"
},
"dependencies": {
"isarray": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
"integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
},
"readable-stream": {
"version": "1.0.34",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
"integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
"requires": {
"core-util-is": "~1.0.0",
"inherits": "~2.0.1",
"isarray": "0.0.1",
"string_decoder": "~0.10.x"
}
},
"string_decoder": {
"version": "0.10.31",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
"integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
}
}
},
"snapdragon": {
"version": "0.8.2",
"resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
@@ -9178,6 +9338,11 @@
"readable-stream": "^2.0.2"
}
},
"stream-buffers": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-3.0.2.tgz",
"integrity": "sha512-DQi1h8VEBA/lURbSwFtEHnSTb9s2/pwLEaFuNhXwy1Dx3Sa0lOuYT2yNUr4/j2fs8oCAMANtrZ5OrPZtyVs3MQ=="
},
"stream-each": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz",
@@ -9610,6 +9775,11 @@
"punycode": "^2.1.0"
}
},
"traverse": {
"version": "0.3.9",
"resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz",
"integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk="
},
"trim-newlines": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz",
@@ -9921,6 +10091,61 @@
}
}
},
"unzip": {
"version": "0.1.11",
"resolved": "https://registry.npmjs.org/unzip/-/unzip-0.1.11.tgz",
"integrity": "sha1-iXScY7BY19kNYZ+GuYqhU107l/A=",
"requires": {
"binary": ">= 0.3.0 < 1",
"fstream": ">= 0.1.30 < 1",
"match-stream": ">= 0.0.2 < 1",
"pullstream": ">= 0.4.1 < 1",
"readable-stream": "~1.0.31",
"setimmediate": ">= 1.0.1 < 2"
},
"dependencies": {
"fstream": {
"version": "0.1.31",
"resolved": "https://registry.npmjs.org/fstream/-/fstream-0.1.31.tgz",
"integrity": "sha1-czfwWPu7vvqMn1YaKMqwhJICyYg=",
"requires": {
"graceful-fs": "~3.0.2",
"inherits": "~2.0.0",
"mkdirp": "0.5",
"rimraf": "2"
}
},
"graceful-fs": {
"version": "3.0.11",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.11.tgz",
"integrity": "sha1-dhPHeKGv6mLyXGMKCG1/Osu92Bg=",
"requires": {
"natives": "^1.1.0"
}
},
"isarray": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
"integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
},
"readable-stream": {
"version": "1.0.34",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
"integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
"requires": {
"core-util-is": "~1.0.0",
"inherits": "~2.0.1",
"isarray": "0.0.1",
"string_decoder": "~0.10.x"
}
},
"string_decoder": {
"version": "0.10.31",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
"integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
}
}
},
"upath": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/upath/-/upath-1.1.2.tgz",
+8 -5
View File
@@ -15,10 +15,6 @@
"author": "frontblock.me",
"license": "ISC",
"dependencies": {
"@types/angular": "^1.6.55",
"@types/express": "^4.17.0",
"@types/node": "^11.13.18",
"@types/webpack-env": "^1.14.0",
"@uirouter/angularjs": "^1.0.5",
"angular": "^1.7.8",
"bsert": "0.0.10",
@@ -28,10 +24,17 @@
"http": "0.0.0",
"key-file-storage": "^2.2.1",
"log4js": "^4.4.0",
"memfs": "^2.15.5",
"node-fetch": "^2.6.0",
"socket.io": "^2.2.0"
"socket.io": "^2.2.0",
"stream-buffers": "^3.0.2",
"unzip": "^0.1.11"
},
"devDependencies": {
"@types/express": "^4.17.0",
"@types/node": "^11.13.18",
"@types/semver": "^6.0.1",
"@types/webpack-env": "^1.14.0",
"@types/angular": "^1.6.27",
"@types/jest": "^24.0.15",
"autoprefixer": "^9.4.7",