Add registry server

This commit is contained in:
the1812 2022-05-08 22:37:55 +08:00
parent aed7ab70ab
commit 768c818908
14 changed files with 260 additions and 83 deletions

View File

@ -1,28 +1,23 @@
import * as webpack from 'webpack'
import * as webpackConfig from '../../webpack/webpack.dev'
import { sendMessage } from './server'
import webpack from 'webpack'
import exitHook from 'async-exit-hook'
import webpackConfig from '../../webpack/webpack.dev'
import { sendMessage } from './web-socket-server'
import { defaultWatcherHandler } from './watcher-common'
export const startCoreWatcher = () => {
const compiler = webpack(webpackConfig as webpack.Configuration)
let lastHash = ''
console.log('Starting core watcher')
const instance = compiler.watch({}, (error, result) => {
if (error) {
console.error(error)
process.exit(1)
}
if (result.hash === lastHash) {
return
}
if (!lastHash) {
console.log('Core watcher started')
}
lastHash = result.hash
sendMessage({
type: 'coreUpdate',
})
})
process.on('beforeExit', () => instance.close(() => {
const instance = compiler.watch({}, defaultWatcherHandler(
() => console.log('Core watcher started'),
result => {
console.log('coreUpdate:', result.hash)
sendMessage({
type: 'coreUpdate',
})
},
))
exitHook(exit => instance.close(() => {
console.log('Core watcher stopped')
exit()
}))
}

View File

@ -30,10 +30,7 @@ Send Messages:
```json
{
"type": "itemUpdate",
"name": "name",
"itemType": "component",
"displayName": "Display Name",
"path": "registry/components/feeds/copy-link.js"
"path": "http://localhost:2333/registry/components/style/auto-hide-sidebar.js"
}
```

View File

@ -1,6 +1,8 @@
import { startCoreWatcher } from './core-watcher'
import { startWebSocketServer } from './server'
import { startRegistryWatcher } from './registry-watcher'
import { startWebSocketServer } from './web-socket-server'
startWebSocketServer().then(() => {
startRegistryWatcher().then(server => {
startCoreWatcher()
startWebSocketServer(server)
})

View File

@ -4,9 +4,6 @@ export interface PayloadBase<Type extends string = string> {
export type StartPayload = PayloadBase<'start'>
export type CoreUpdatePayload = PayloadBase<'coreUpdate'>
export type ItemUpdatePayload = PayloadBase<'itemUpdate'> & {
name: string
displayName: string
itemType: string
path: string
}
export type StopPayload = PayloadBase<'stop'>

View File

@ -1,50 +1,108 @@
import { createServer } from 'http'
import { Watching } from 'webpack'
import * as webpack from 'webpack'
import { createServer, Server } from 'http'
import webpack, { Watching, Configuration } from 'webpack'
import exitHook from 'async-exit-hook'
import handler from 'serve-handler'
import path from 'path'
import { devServerConfig } from './config'
import { buildByEntry } from '../../registry/webpack/config'
import { fromId } from '../../registry/webpack/id'
import { defaultWatcherHandler } from './watcher-common'
import { sendMessage } from './web-socket-server'
export const startRegistryWatcher = () => {
export const startRegistryWatcher = () => new Promise<Server>(resolve => {
const { maxWatchers, port } = devServerConfig
const watchers: Record<string, Watching> = {}
const watchers: { url: string; instance: Watching }[] = []
const parseRegistryUrl = (url: string) => {
/* example: http://localhost:2333/registry/components/style/auto-hide-sidebar.js
-> src: ./registry/lib/components/
-> type: component
-> entry: ./registry/lib/components/style/auto-hide-sidebar/index.ts
*/
const regex = new RegExp('http://[^/]+/registry/(.+)s/(.+)\\.js')
const match = url.match(regex)
if (!match) {
return null
}
const [, type, id] = match
const src = `./registry/lib/${type}s/`
return {
src,
type,
entry: fromId(src, id),
}
}
const createWatcher = (url: string): Promise<void> => {
const watcher = webpack(buildByEntry())
const createWatcher = async (url: string, config: Configuration) => {
const watcher = webpack(config)
const instance = watcher.watch({}, defaultWatcherHandler(
() => console.log(`Registry watcher started, url = ${url}`),
result => {
console.log('itemUpdate', result.hash, url)
sendMessage({
type: 'itemUpdate',
path: url,
})
},
))
exitHook(exit => {
if (!instance.closed) {
instance.close(() => {
console.log(`Registry watcher stopped, url = ${url}`)
exit()
})
}
})
if (watchers.length >= maxWatchers) {
const oldInstance = watchers.shift()
if (!oldInstance.instance.closed) {
oldInstance.instance.close(() => {
console.log(`Registry watcher stopped, url = ${oldInstance.url}`)
})
}
}
watchers.push({ url, instance })
}
const server = createServer((request, response) => {
const { url } = request
if (url.startsWith('/core/')) {
if (url.startsWith('/core')) {
request.url = url.replace(/^\/core/, '')
console.log('request from', request.url)
handler(request, response, {
public: './dist/',
public: path.resolve('./dist/'),
})
}
if (url.startsWith('/registry/')) {
if (url.startsWith('/registry')) {
request.url = url.replace(/^\/registry/, '')
const existingWatcher = watchers[url]
const registryRoot = './registry/dist/'
if (existingWatcher) {
const registryInfo = parseRegistryUrl(url)
const registryRoot = path.resolve('./registry/dist/')
if (existingWatcher || !registryInfo) {
handler(request, response, {
public: registryRoot,
})
} else {
createWatcher(url, buildByEntry(registryInfo) as Configuration).then(
() => handler(request, response, {
public: registryRoot,
}),
)
}
createWatcher(url).then(
() => handler(request, response, {
public: registryRoot,
}),
)
}
})
process.on('beforeExit', () => {
exitHook(exit => {
server.close(error => {
if (error) {
console.error(error)
exit()
return
}
console.log('Registry watcher stopped')
console.log('Registry server stopped')
exit()
})
})
server.listen(port, () => {
console.log('Registry watcher started')
console.log(`Registry server listening at ${port}`)
resolve(server)
})
}
})

View File

@ -0,0 +1,7 @@
{
"extends": "../../tsconfig.json",
"compilerOptions": {
"module": "CommonJS",
"noEmit": true,
}
}

View File

@ -0,0 +1,22 @@
import { Stats } from 'webpack'
export const defaultWatcherHandler = (
initCallback: (result: Stats) => void,
updateCallback: (result: Stats) => void,
) => {
let lastHash = ''
return (error: Error, result: Stats) => {
if (error) {
console.error(error)
return
}
if (result.hash === lastHash) {
return
}
if (!lastHash) {
initCallback(result)
}
lastHash = result.hash
updateCallback(result)
}
}

View File

@ -1,3 +1,4 @@
import { Server } from 'http'
import { WebSocketServer } from 'ws'
import { devServerConfig } from './config'
import { Payload } from './payload'
@ -13,10 +14,13 @@ export const sendMessage = (message: Payload) => {
client.send(text)
})
}
export const startWebSocketServer = () => new Promise<void>((resolve, reject) => {
export const startWebSocketServer = (httpServer: Server) => new Promise<void>((resolve, reject) => {
const { port } = devServerConfig
server = new WebSocketServer({ port })
server = new WebSocketServer({ server: httpServer })
server.on('close', () => sendMessage({ type: 'stop' }))
server.on('listening', () => resolve())
server.on('listening', () => {
console.log(`WebSocket server listening ${port}`)
resolve()
})
server.on('error', () => reject())
})

View File

@ -16,9 +16,11 @@
"@babel/plugin-proposal-class-properties": "^7.8.3",
"@babel/preset-env": "^7.9.6",
"@babel/preset-typescript": "^7.9.0",
"@types/async-exit-hook": "^2.0.0",
"@types/color": "^3.0.1",
"@types/lodash": "^4.14.172",
"@types/marked": "^1.2.0",
"@types/node": "^17.0.31",
"@types/serve-handler": "^6.1.1",
"@types/sortablejs": "^1.10.7",
"@types/webpack": "^4.41.6",
@ -26,6 +28,7 @@
"@types/ws": "^8.2.3",
"@typescript-eslint/eslint-plugin": "^5.9.1",
"@typescript-eslint/parser": "^5.9.1",
"async-exit-hook": "^2.0.1",
"autoprefixer": "^10.0.1",
"babel-loader": "^8.1.0",
"css-loader": "^5.0.0",
@ -45,6 +48,7 @@
"terser": ">=5.3.8 <6",
"terser-webpack-plugin": "^5.0.1",
"to-string-loader": "^1.2.0",
"ts-node": "^10.7.0",
"typescript": "^4.4.4",
"vue-loader": "^15.8.3",
"vue-template-compiler": "^2.6.11",

View File

@ -8,7 +8,7 @@ module.exports = Object.fromEntries(['component', 'plugin', 'doc'].map(type => {
if (buildAll) {
console.log(`[build all] discovered ${entries.length} ${type}s`)
return entries.map(entry => buildByEntry(entry))
return entries.map(entry => buildByEntry({ src, type, entry }))
}
let entry
@ -24,6 +24,6 @@ module.exports = Object.fromEntries(['component', 'plugin', 'doc'].map(type => {
[entry] = entries
console.log(`Build target · ${entry}`)
}
return buildByEntry(src, entry)
return buildByEntry({ src, type, entry })
}]
}))

View File

@ -1,9 +1,8 @@
const buildByEntry = (entry: string) => {
const match = entry.match(/\/?registry\/dist\/([^\/]+)\/(.+)\/index\.ts/)
if (!match) {
throw new Error(`Invalid entry path: ${entry}`)
}
const
const buildByEntry = ({ src, type, entry }) => {
// const match = entry.match(/\/?registry\/dist\/([^\/]+)\/(.+)\/index\.ts/)
// if (!match) {
// throw new Error(`Invalid entry path: ${entry}`)
// }
const path = require('path')
const { getId } = require('./id')
const id = getId(src, entry)

View File

@ -1 +1,2 @@
export const getId: (root: string, entry: string) => string
export const fromId: (root: string, id: string, filename?: string) => string

View File

@ -1,7 +1,21 @@
/** Runs both in Node.js and browser (without path module).
/**
* Runs both in Node.js and browser (without path module).
* Paths are case-sensitive.
*/
module.exports.getId = (root, entry) => {
const relative = entry.replace(root, '').replace(/\\/g, '/')
return relative.replace(/\/[^\/]+$/, '')
module.exports = {
/**
* Generate id from relative path and remove filename
* @example getId('folder1/', 'folder1/folder2/index.ts') -> 'folder2'
*/
getId: (root, entry) => {
const relative = entry.replace(root, '').replace(/\\/g, '/')
return relative.replace(/\/[^\/]+$/, '')
},
/**
* Reverse method for `getId`
* @example getId('folder1/', 'folder2') -> 'folder1/folder2/index.ts'
*/
fromId: (root, id, filename = 'index.ts') => {
return `${root.replace(/\\/g, '/')}${id.replace(/\\/g, '/')}/${filename}`
}
}

111
yarn.lock
View File

@ -920,6 +920,18 @@
"@babel/helper-validator-identifier" "^7.16.7"
to-fast-properties "^2.0.0"
"@cspotcode/source-map-consumer@0.8.0":
version "0.8.0"
resolved "https://registry.npmmirror.com/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz#33bf4b7b39c178821606f669bbc447a6a629786b"
integrity sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==
"@cspotcode/source-map-support@0.7.0":
version "0.7.0"
resolved "https://registry.npmmirror.com/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz#4789840aa859e46d2f3173727ab707c66bf344f5"
integrity sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==
dependencies:
"@cspotcode/source-map-consumer" "0.8.0"
"@csstools/postcss-color-function@^1.1.0":
version "1.1.0"
resolved "https://registry.npmmirror.com/@csstools/postcss-color-function/-/postcss-color-function-1.1.0.tgz#229966327747f58fbe586de35daa139db3ce1e5d"
@ -1140,6 +1152,31 @@
resolved "https://registry.npmmirror.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570"
integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==
"@tsconfig/node10@^1.0.7":
version "1.0.8"
resolved "https://registry.npmmirror.com/@tsconfig/node10/-/node10-1.0.8.tgz#c1e4e80d6f964fbecb3359c43bd48b40f7cadad9"
integrity sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==
"@tsconfig/node12@^1.0.7":
version "1.0.9"
resolved "https://registry.npmmirror.com/@tsconfig/node12/-/node12-1.0.9.tgz#62c1f6dee2ebd9aead80dc3afa56810e58e1a04c"
integrity sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==
"@tsconfig/node14@^1.0.0":
version "1.0.1"
resolved "https://registry.npmmirror.com/@tsconfig/node14/-/node14-1.0.1.tgz#95f2d167ffb9b8d2068b0b235302fafd4df711f2"
integrity sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==
"@tsconfig/node16@^1.0.2":
version "1.0.2"
resolved "https://registry.npmmirror.com/@tsconfig/node16/-/node16-1.0.2.tgz#423c77877d0569db20e1fc80885ac4118314010e"
integrity sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==
"@types/async-exit-hook@^2.0.0":
version "2.0.0"
resolved "https://registry.npmmirror.com/@types/async-exit-hook/-/async-exit-hook-2.0.0.tgz#162623f74b7018ec0da99a810d2284d697230837"
integrity sha512-RNjIyjnVZdcP5a1zeIPb5c0hq2nbJc/NOCLNKUAqeCw+J5z2zMcINISn9wybCWhczHnUu3VSUFy7ZCO6ir4ZRw==
"@types/color-convert@*":
version "2.0.0"
resolved "https://registry.npmmirror.com/@types/color-convert/-/color-convert-2.0.0.tgz#8f5ee6b9e863dcbee5703f5a517ffb13d3ea4e22"
@ -1210,7 +1247,7 @@
resolved "https://registry.npmmirror.com/@types/marked/-/marked-1.2.2.tgz#1f858a0e690247ecf3b2eef576f98f86e8d960d4"
integrity sha512-wLfw1hnuuDYrFz97IzJja0pdVsC0oedtS4QsKH1/inyW9qkLQbXgMUqEQT0MVtUBx3twjWeInUfjQbhBVLECXw==
"@types/node@*", "@types/node@>=13.7.0":
"@types/node@*", "@types/node@>=13.7.0", "@types/node@^17.0.31":
version "17.0.31"
resolved "https://registry.npmmirror.com/@types/node/-/node-17.0.31.tgz#a5bb84ecfa27eec5e1c802c6bbf8139bdb163a5d"
integrity sha512-AR0x5HbXGqkEx9CadRH3EBYx/VkiUgZIhP4wvPn/+5KIsgpNoyFaRlVe0Zlx9gRtg8fA06a9tskE2MSN7TcG4Q==
@ -1549,7 +1586,7 @@ acorn-jsx@^5.2.0, acorn-jsx@^5.3.1:
resolved "https://registry.npmmirror.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937"
integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==
acorn-walk@^8.0.0:
acorn-walk@^8.0.0, acorn-walk@^8.1.1:
version "8.2.0"
resolved "https://registry.npmmirror.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1"
integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==
@ -1648,6 +1685,11 @@ arg@2.0.0:
resolved "https://registry.npmmirror.com/arg/-/arg-2.0.0.tgz#c06e7ff69ab05b3a4a03ebe0407fac4cba657545"
integrity sha512-XxNTUzKnz1ctK3ZIcI2XUPlD96wbHP2nGqkPKpvk/HNRlPveYrXIVSTk9m3LcqOgDPg3B1nMvdV/K8wZd7PG4w==
arg@^4.1.0:
version "4.1.3"
resolved "https://registry.npmmirror.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089"
integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==
argparse@^1.0.7:
version "1.0.10"
resolved "https://registry.npmmirror.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
@ -1686,6 +1728,11 @@ astral-regex@^2.0.0:
resolved "https://registry.npmmirror.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31"
integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==
async-exit-hook@^2.0.1:
version "2.0.1"
resolved "https://registry.npmmirror.com/async-exit-hook/-/async-exit-hook-2.0.1.tgz#8bd8b024b0ec9b1c01cccb9af9db29bd717dfaf3"
integrity sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==
async@^2.0.1:
version "2.6.4"
resolved "https://registry.npmmirror.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221"
@ -2089,6 +2136,11 @@ cosmiconfig@^7.0.0:
path-type "^4.0.0"
yaml "^1.10.0"
create-require@^1.1.0:
version "1.1.1"
resolved "https://registry.npmmirror.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333"
integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==
cross-spawn@^6.0.0:
version "6.0.5"
resolved "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4"
@ -2214,6 +2266,11 @@ define-properties@^1.1.3, define-properties@^1.1.4:
has-property-descriptors "^1.0.0"
object-keys "^1.1.1"
diff@^4.0.1:
version "4.0.2"
resolved "https://registry.npmmirror.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.npmmirror.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f"
@ -3434,6 +3491,11 @@ make-dir@^3.0.2, make-dir@^3.1.0:
dependencies:
semver "^6.0.0"
make-error@^1.1.1:
version "1.3.6"
resolved "https://registry.npmmirror.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2"
integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==
marked@^1.2.5:
version "1.2.9"
resolved "https://registry.npmmirror.com/marked/-/marked-1.2.9.tgz#53786f8b05d4c01a2a5a76b7d1ec9943d29d72dc"
@ -4454,21 +4516,7 @@ serialize-javascript@^6.0.0:
dependencies:
randombytes "^2.1.0"
serve-handler@6.1.3:
version "6.1.3"
resolved "https://registry.npmmirror.com/serve-handler/-/serve-handler-6.1.3.tgz#1bf8c5ae138712af55c758477533b9117f6435e8"
integrity sha512-FosMqFBNrLyeiIDvP1zgO6YoTzFYHxLDEIavhlmQ+knB2Z7l1t+kGLHkZIDN7UVWqQAmKI3D20A6F6jo3nDd4w==
dependencies:
bytes "3.0.0"
content-disposition "0.5.2"
fast-url-parser "1.1.3"
mime-types "2.1.18"
minimatch "3.0.4"
path-is-inside "1.0.2"
path-to-regexp "2.2.1"
range-parser "1.2.0"
serve-handler@^6.1.3:
serve-handler@6.1.3, serve-handler@^6.1.3:
version "6.1.3"
resolved "https://registry.npmmirror.com/serve-handler/-/serve-handler-6.1.3.tgz#1bf8c5ae138712af55c758477533b9117f6435e8"
integrity sha512-FosMqFBNrLyeiIDvP1zgO6YoTzFYHxLDEIavhlmQ+knB2Z7l1t+kGLHkZIDN7UVWqQAmKI3D20A6F6jo3nDd4w==
@ -4804,6 +4852,25 @@ tr46@^1.0.1:
dependencies:
punycode "^2.1.0"
ts-node@^10.7.0:
version "10.7.0"
resolved "https://registry.npmmirror.com/ts-node/-/ts-node-10.7.0.tgz#35d503d0fab3e2baa672a0e94f4b40653c2463f5"
integrity sha512-TbIGS4xgJoX2i3do417KSaep1uRAW/Lu+WAL2doDHC0D6ummjirVOXU5/7aiZotbQ5p1Zp9tP7U6cYhA0O7M8A==
dependencies:
"@cspotcode/source-map-support" "0.7.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.0"
yn "3.1.1"
tsconfig-paths@^3.14.1:
version "3.14.1"
resolved "https://registry.npmmirror.com/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz#ba0734599e8ea36c862798e920bcf163277b137a"
@ -4911,6 +4978,11 @@ utila@~0.4:
resolved "https://registry.npmmirror.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c"
integrity sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==
v8-compile-cache-lib@^3.0.0:
version "3.0.1"
resolved "https://registry.npmmirror.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf"
integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==
v8-compile-cache@^2.0.3:
version "2.3.0"
resolved "https://registry.npmmirror.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee"
@ -5159,3 +5231,8 @@ yaml@^1.10.0:
version "1.10.2"
resolved "https://registry.npmmirror.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b"
integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==
yn@3.1.1:
version "3.1.1"
resolved "https://registry.npmmirror.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50"
integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==