@verdaccio/node-api 9.0.0-next-9.20 → 9.0.0-next-9.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/build/server.js CHANGED
@@ -127,6 +127,7 @@ async function runServer(config, serverFactory) {
127
127
  return createServerFactory(configurationParsed, (0, _verdaccio_config.getListenAddress)(configurationParsed.listen, _verdaccio_logger.logger), await serverFactory(configurationParsed));
128
128
  }
129
129
  //#endregion
130
+ exports.createServerFactory = createServerFactory;
130
131
  exports.initServer = initServer;
131
132
  exports.runServer = runServer;
132
133
 
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","names":[],"sources":["../src/server.ts"],"sourcesContent":["/* eslint-disable */\nimport buildDebug from 'debug';\nimport { assign } from 'lodash-es';\nimport constants from 'node:constants';\nimport fs from 'node:fs';\nimport http from 'node:http';\nimport https from 'node:https';\nimport url from 'node:url';\n\nimport { getConfigParsed, getListenAddress } from '@verdaccio/config';\nimport { logger, setup } from '@verdaccio/logger';\nimport { ConfigYaml, HttpsConfKeyCert, HttpsConfPfx } from '@verdaccio/types';\n\nimport { displayExperimentsInfoBox } from './experiments';\n\nexport type ServerFactory = (config: ConfigYaml) => Promise<any>;\n\nconst debug = buildDebug('verdaccio:node-api');\n\nfunction unlinkAddressPath(addr) {\n if (addr.path && fs.existsSync(addr.path)) {\n fs.unlinkSync(addr.path);\n }\n}\n\n/**\n * Return a native HTTP/HTTPS server instance\n * @param config\n * @param addr\n * @param app\n */\nexport function createServerFactory(config: ConfigYaml, addr, app) {\n let serverFactory;\n if (addr.proto === 'https') {\n debug('https enabled');\n try {\n let httpsOptions = {\n // disable insecure SSLv2 and SSLv3\n secureOptions: constants.SSL_OP_NO_SSLv2 | constants.SSL_OP_NO_SSLv3,\n };\n\n const keyCertConfig = config.https as HttpsConfKeyCert;\n const pfxConfig = config.https as HttpsConfPfx;\n\n // https must either have key and cert or a pfx and (optionally) a passphrase\n if (!((keyCertConfig.key && keyCertConfig.cert) || pfxConfig.pfx)) {\n // logHTTPSError(configPath);\n throw Error('bad format https configuration');\n }\n\n if (pfxConfig.pfx) {\n const { pfx, passphrase } = pfxConfig;\n httpsOptions = assign(httpsOptions, {\n pfx: fs.readFileSync(pfx),\n passphrase: passphrase || '',\n });\n } else {\n const { key, cert, ca } = keyCertConfig;\n httpsOptions = assign(httpsOptions, {\n key: fs.readFileSync(key),\n cert: fs.readFileSync(cert),\n ...(ca && {\n ca: fs.readFileSync(ca),\n }),\n });\n }\n // TODO: enable http2 as feature\n // if (config.server.http2) <-- check if force http2\n serverFactory = https.createServer(httpsOptions, app);\n } catch (err: any) {\n throw new Error(`cannot create https server: ${err.message}`);\n }\n } else {\n // http\n debug('http enabled');\n serverFactory = http.createServer(app);\n }\n\n debug('server created');\n\n if (\n config.server &&\n typeof config.server.keepAliveTimeout !== 'undefined' &&\n // @ts-ignore\n config.server.keepAliveTimeout !== 'null'\n ) {\n // library definition for node is not up to date (doesn't contain recent 8.0 changes)\n serverFactory.keepAliveTimeout = config.server.keepAliveTimeout * 1000;\n }\n // Remove stale Unix socket file from a previous run to avoid EADDRINUSE\n unlinkAddressPath(addr);\n\n return serverFactory;\n}\n\n/**\n * Start the server on the port defined (or the port defined in the config file)\n * @param config\n * @param port\n * @param version\n * @param pkgName\n */\nexport async function initServer(\n config: ConfigYaml,\n port: string | void,\n version: string,\n pkgName: string,\n serverFactory: ServerFactory\n): Promise<void> {\n const logger = await setup(config?.log as any);\n const addr = getListenAddress(port ?? config?.listen, logger);\n displayExperimentsInfoBox(config.flags);\n\n const app = await serverFactory(config);\n const httpServer = createServerFactory(config, addr, app);\n\n return new Promise<void>((resolve, reject) => {\n httpServer\n .listen(addr.port || addr.path, addr.host, (): void => {\n // send a message for test\n if (typeof process.send === 'function') {\n process.send({\n verdaccio_started: true,\n });\n }\n const addressServer = `${\n addr.path\n ? url.format({\n protocol: 'unix',\n pathname: addr.path,\n })\n : url.format({\n protocol: addr.proto,\n hostname: addr.host,\n port: addr.port,\n pathname: '/',\n })\n }`;\n logger.info({ addressServer }, 'http address: @{addressServer}');\n logger.info({ version }, 'version: @{version}');\n resolve();\n })\n .on('error', function (err): void {\n reject(err);\n process.exitCode = 1;\n });\n function handleShutdownGracefully() {\n logger.info('received shutdown signal - closing server gracefully...');\n httpServer.close(() => {\n logger.info('server closed.');\n process.exit(0);\n });\n }\n\n for (const signal of ['SIGINT', 'SIGTERM', 'SIGHUP']) {\n // Use once() so that receiving double signals exit the app.\n process.once(signal, handleShutdownGracefully);\n }\n });\n}\n\n/**\n * Exposes a server factory to be instantiated programmatically.\n *\n ```ts\n const app = await runServer(); // default configuration\n const app = await runServer('./config/config.yaml');\n const app = await runServer({ configuration });\n app.listen(4000, (event) => {\n // do something\n });\n ```\n * @param config\n */\nexport async function runServer(\n config: string | ConfigYaml | undefined,\n serverFactory: ServerFactory\n): Promise<any> {\n const configurationParsed = getConfigParsed(config);\n await setup(configurationParsed.log as any);\n displayExperimentsInfoBox(configurationParsed.flags);\n const addr = getListenAddress(configurationParsed.listen, logger);\n const app = await serverFactory(configurationParsed);\n return createServerFactory(configurationParsed, addr, app);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"server.js","names":[],"sources":["../src/server.ts"],"sourcesContent":["/* eslint-disable */\nimport buildDebug from 'debug';\nimport { assign } from 'lodash-es';\nimport constants from 'node:constants';\nimport fs from 'node:fs';\nimport http from 'node:http';\nimport https from 'node:https';\nimport url from 'node:url';\n\nimport { getConfigParsed, getListenAddress } from '@verdaccio/config';\nimport { logger, setup } from '@verdaccio/logger';\nimport { ConfigYaml, HttpsConfKeyCert, HttpsConfPfx } from '@verdaccio/types';\n\nimport { displayExperimentsInfoBox } from './experiments';\n\nexport type ServerFactory = (config: ConfigYaml) => Promise<any>;\n\nconst debug = buildDebug('verdaccio:node-api');\n\nfunction unlinkAddressPath(addr) {\n if (addr.path && fs.existsSync(addr.path)) {\n fs.unlinkSync(addr.path);\n }\n}\n\n/**\n * Return a native HTTP/HTTPS server instance\n * @param config\n * @param addr\n * @param app\n */\nexport function createServerFactory(config: ConfigYaml, addr, app) {\n let serverFactory;\n if (addr.proto === 'https') {\n debug('https enabled');\n try {\n let httpsOptions = {\n // disable insecure SSLv2 and SSLv3\n secureOptions: constants.SSL_OP_NO_SSLv2 | constants.SSL_OP_NO_SSLv3,\n };\n\n const keyCertConfig = config.https as HttpsConfKeyCert;\n const pfxConfig = config.https as HttpsConfPfx;\n\n // https must either have key and cert or a pfx and (optionally) a passphrase\n if (!((keyCertConfig.key && keyCertConfig.cert) || pfxConfig.pfx)) {\n // logHTTPSError(configPath);\n throw Error('bad format https configuration');\n }\n\n if (pfxConfig.pfx) {\n const { pfx, passphrase } = pfxConfig;\n httpsOptions = assign(httpsOptions, {\n pfx: fs.readFileSync(pfx),\n passphrase: passphrase || '',\n });\n } else {\n const { key, cert, ca } = keyCertConfig;\n httpsOptions = assign(httpsOptions, {\n key: fs.readFileSync(key),\n cert: fs.readFileSync(cert),\n ...(ca && {\n ca: fs.readFileSync(ca),\n }),\n });\n }\n // TODO: enable http2 as feature\n // if (config.server.http2) <-- check if force http2\n serverFactory = https.createServer(httpsOptions, app);\n } catch (err: any) {\n throw new Error(`cannot create https server: ${err.message}`);\n }\n } else {\n // http\n debug('http enabled');\n serverFactory = http.createServer(app);\n }\n\n debug('server created');\n\n if (\n config.server &&\n typeof config.server.keepAliveTimeout !== 'undefined' &&\n // @ts-ignore\n config.server.keepAliveTimeout !== 'null'\n ) {\n // library definition for node is not up to date (doesn't contain recent 8.0 changes)\n serverFactory.keepAliveTimeout = config.server.keepAliveTimeout * 1000;\n }\n // Remove stale Unix socket file from a previous run to avoid EADDRINUSE\n unlinkAddressPath(addr);\n\n return serverFactory;\n}\n\n/**\n * Start the server on the port defined (or the port defined in the config file)\n * @param config\n * @param port\n * @param version\n * @param pkgName\n */\nexport async function initServer(\n config: ConfigYaml,\n port: string | void,\n version: string,\n pkgName: string,\n serverFactory: ServerFactory\n): Promise<void> {\n const logger = await setup(config?.log as any);\n const addr = getListenAddress(port ?? config?.listen, logger);\n displayExperimentsInfoBox(config.flags);\n\n const app = await serverFactory(config);\n const httpServer = createServerFactory(config, addr, app);\n\n return new Promise<void>((resolve, reject) => {\n httpServer\n .listen(addr.port || addr.path, addr.host, (): void => {\n // send a message for test\n if (typeof process.send === 'function') {\n process.send({\n verdaccio_started: true,\n });\n }\n const addressServer = `${\n addr.path\n ? url.format({\n protocol: 'unix',\n pathname: addr.path,\n })\n : url.format({\n protocol: addr.proto,\n hostname: addr.host,\n port: addr.port,\n pathname: '/',\n })\n }`;\n logger.info({ addressServer }, 'http address: @{addressServer}');\n logger.info({ version }, 'version: @{version}');\n resolve();\n })\n .on('error', function (err): void {\n reject(err);\n process.exitCode = 1;\n });\n function handleShutdownGracefully() {\n logger.info('received shutdown signal - closing server gracefully...');\n httpServer.close(() => {\n logger.info('server closed.');\n process.exit(0);\n });\n }\n\n for (const signal of ['SIGINT', 'SIGTERM', 'SIGHUP']) {\n // Use once() so that receiving double signals exit the app.\n process.once(signal, handleShutdownGracefully);\n }\n });\n}\n\n/**\n * Exposes a server factory to be instantiated programmatically.\n *\n ```ts\n const app = await runServer(); // default configuration\n const app = await runServer('./config/config.yaml');\n const app = await runServer({ configuration });\n app.listen(4000, (event) => {\n // do something\n });\n ```\n * @param config\n */\nexport async function runServer(\n config: string | ConfigYaml | undefined,\n serverFactory: ServerFactory\n): Promise<any> {\n const configurationParsed = getConfigParsed(config);\n await setup(configurationParsed.log as any);\n displayExperimentsInfoBox(configurationParsed.flags);\n const addr = getListenAddress(configurationParsed.listen, logger);\n const app = await serverFactory(configurationParsed);\n return createServerFactory(configurationParsed, addr, app);\n}\n"],"mappings":"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"}
package/build/server.mjs CHANGED
@@ -120,6 +120,6 @@ async function runServer(config, serverFactory) {
120
120
  return createServerFactory(configurationParsed, getListenAddress(configurationParsed.listen, logger), await serverFactory(configurationParsed));
121
121
  }
122
122
  //#endregion
123
- export { initServer, runServer };
123
+ export { createServerFactory, initServer, runServer };
124
124
 
125
125
  //# sourceMappingURL=server.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"server.mjs","names":[],"sources":["../src/server.ts"],"sourcesContent":["/* eslint-disable */\nimport buildDebug from 'debug';\nimport { assign } from 'lodash-es';\nimport constants from 'node:constants';\nimport fs from 'node:fs';\nimport http from 'node:http';\nimport https from 'node:https';\nimport url from 'node:url';\n\nimport { getConfigParsed, getListenAddress } from '@verdaccio/config';\nimport { logger, setup } from '@verdaccio/logger';\nimport { ConfigYaml, HttpsConfKeyCert, HttpsConfPfx } from '@verdaccio/types';\n\nimport { displayExperimentsInfoBox } from './experiments';\n\nexport type ServerFactory = (config: ConfigYaml) => Promise<any>;\n\nconst debug = buildDebug('verdaccio:node-api');\n\nfunction unlinkAddressPath(addr) {\n if (addr.path && fs.existsSync(addr.path)) {\n fs.unlinkSync(addr.path);\n }\n}\n\n/**\n * Return a native HTTP/HTTPS server instance\n * @param config\n * @param addr\n * @param app\n */\nexport function createServerFactory(config: ConfigYaml, addr, app) {\n let serverFactory;\n if (addr.proto === 'https') {\n debug('https enabled');\n try {\n let httpsOptions = {\n // disable insecure SSLv2 and SSLv3\n secureOptions: constants.SSL_OP_NO_SSLv2 | constants.SSL_OP_NO_SSLv3,\n };\n\n const keyCertConfig = config.https as HttpsConfKeyCert;\n const pfxConfig = config.https as HttpsConfPfx;\n\n // https must either have key and cert or a pfx and (optionally) a passphrase\n if (!((keyCertConfig.key && keyCertConfig.cert) || pfxConfig.pfx)) {\n // logHTTPSError(configPath);\n throw Error('bad format https configuration');\n }\n\n if (pfxConfig.pfx) {\n const { pfx, passphrase } = pfxConfig;\n httpsOptions = assign(httpsOptions, {\n pfx: fs.readFileSync(pfx),\n passphrase: passphrase || '',\n });\n } else {\n const { key, cert, ca } = keyCertConfig;\n httpsOptions = assign(httpsOptions, {\n key: fs.readFileSync(key),\n cert: fs.readFileSync(cert),\n ...(ca && {\n ca: fs.readFileSync(ca),\n }),\n });\n }\n // TODO: enable http2 as feature\n // if (config.server.http2) <-- check if force http2\n serverFactory = https.createServer(httpsOptions, app);\n } catch (err: any) {\n throw new Error(`cannot create https server: ${err.message}`);\n }\n } else {\n // http\n debug('http enabled');\n serverFactory = http.createServer(app);\n }\n\n debug('server created');\n\n if (\n config.server &&\n typeof config.server.keepAliveTimeout !== 'undefined' &&\n // @ts-ignore\n config.server.keepAliveTimeout !== 'null'\n ) {\n // library definition for node is not up to date (doesn't contain recent 8.0 changes)\n serverFactory.keepAliveTimeout = config.server.keepAliveTimeout * 1000;\n }\n // Remove stale Unix socket file from a previous run to avoid EADDRINUSE\n unlinkAddressPath(addr);\n\n return serverFactory;\n}\n\n/**\n * Start the server on the port defined (or the port defined in the config file)\n * @param config\n * @param port\n * @param version\n * @param pkgName\n */\nexport async function initServer(\n config: ConfigYaml,\n port: string | void,\n version: string,\n pkgName: string,\n serverFactory: ServerFactory\n): Promise<void> {\n const logger = await setup(config?.log as any);\n const addr = getListenAddress(port ?? config?.listen, logger);\n displayExperimentsInfoBox(config.flags);\n\n const app = await serverFactory(config);\n const httpServer = createServerFactory(config, addr, app);\n\n return new Promise<void>((resolve, reject) => {\n httpServer\n .listen(addr.port || addr.path, addr.host, (): void => {\n // send a message for test\n if (typeof process.send === 'function') {\n process.send({\n verdaccio_started: true,\n });\n }\n const addressServer = `${\n addr.path\n ? url.format({\n protocol: 'unix',\n pathname: addr.path,\n })\n : url.format({\n protocol: addr.proto,\n hostname: addr.host,\n port: addr.port,\n pathname: '/',\n })\n }`;\n logger.info({ addressServer }, 'http address: @{addressServer}');\n logger.info({ version }, 'version: @{version}');\n resolve();\n })\n .on('error', function (err): void {\n reject(err);\n process.exitCode = 1;\n });\n function handleShutdownGracefully() {\n logger.info('received shutdown signal - closing server gracefully...');\n httpServer.close(() => {\n logger.info('server closed.');\n process.exit(0);\n });\n }\n\n for (const signal of ['SIGINT', 'SIGTERM', 'SIGHUP']) {\n // Use once() so that receiving double signals exit the app.\n process.once(signal, handleShutdownGracefully);\n }\n });\n}\n\n/**\n * Exposes a server factory to be instantiated programmatically.\n *\n ```ts\n const app = await runServer(); // default configuration\n const app = await runServer('./config/config.yaml');\n const app = await runServer({ configuration });\n app.listen(4000, (event) => {\n // do something\n });\n ```\n * @param config\n */\nexport async function runServer(\n config: string | ConfigYaml | undefined,\n serverFactory: ServerFactory\n): Promise<any> {\n const configurationParsed = getConfigParsed(config);\n await setup(configurationParsed.log as any);\n displayExperimentsInfoBox(configurationParsed.flags);\n const addr = getListenAddress(configurationParsed.listen, logger);\n const app = await serverFactory(configurationParsed);\n return createServerFactory(configurationParsed, addr, app);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"server.mjs","names":[],"sources":["../src/server.ts"],"sourcesContent":["/* eslint-disable */\nimport buildDebug from 'debug';\nimport { assign } from 'lodash-es';\nimport constants from 'node:constants';\nimport fs from 'node:fs';\nimport http from 'node:http';\nimport https from 'node:https';\nimport url from 'node:url';\n\nimport { getConfigParsed, getListenAddress } from '@verdaccio/config';\nimport { logger, setup } from '@verdaccio/logger';\nimport { ConfigYaml, HttpsConfKeyCert, HttpsConfPfx } from '@verdaccio/types';\n\nimport { displayExperimentsInfoBox } from './experiments';\n\nexport type ServerFactory = (config: ConfigYaml) => Promise<any>;\n\nconst debug = buildDebug('verdaccio:node-api');\n\nfunction unlinkAddressPath(addr) {\n if (addr.path && fs.existsSync(addr.path)) {\n fs.unlinkSync(addr.path);\n }\n}\n\n/**\n * Return a native HTTP/HTTPS server instance\n * @param config\n * @param addr\n * @param app\n */\nexport function createServerFactory(config: ConfigYaml, addr, app) {\n let serverFactory;\n if (addr.proto === 'https') {\n debug('https enabled');\n try {\n let httpsOptions = {\n // disable insecure SSLv2 and SSLv3\n secureOptions: constants.SSL_OP_NO_SSLv2 | constants.SSL_OP_NO_SSLv3,\n };\n\n const keyCertConfig = config.https as HttpsConfKeyCert;\n const pfxConfig = config.https as HttpsConfPfx;\n\n // https must either have key and cert or a pfx and (optionally) a passphrase\n if (!((keyCertConfig.key && keyCertConfig.cert) || pfxConfig.pfx)) {\n // logHTTPSError(configPath);\n throw Error('bad format https configuration');\n }\n\n if (pfxConfig.pfx) {\n const { pfx, passphrase } = pfxConfig;\n httpsOptions = assign(httpsOptions, {\n pfx: fs.readFileSync(pfx),\n passphrase: passphrase || '',\n });\n } else {\n const { key, cert, ca } = keyCertConfig;\n httpsOptions = assign(httpsOptions, {\n key: fs.readFileSync(key),\n cert: fs.readFileSync(cert),\n ...(ca && {\n ca: fs.readFileSync(ca),\n }),\n });\n }\n // TODO: enable http2 as feature\n // if (config.server.http2) <-- check if force http2\n serverFactory = https.createServer(httpsOptions, app);\n } catch (err: any) {\n throw new Error(`cannot create https server: ${err.message}`);\n }\n } else {\n // http\n debug('http enabled');\n serverFactory = http.createServer(app);\n }\n\n debug('server created');\n\n if (\n config.server &&\n typeof config.server.keepAliveTimeout !== 'undefined' &&\n // @ts-ignore\n config.server.keepAliveTimeout !== 'null'\n ) {\n // library definition for node is not up to date (doesn't contain recent 8.0 changes)\n serverFactory.keepAliveTimeout = config.server.keepAliveTimeout * 1000;\n }\n // Remove stale Unix socket file from a previous run to avoid EADDRINUSE\n unlinkAddressPath(addr);\n\n return serverFactory;\n}\n\n/**\n * Start the server on the port defined (or the port defined in the config file)\n * @param config\n * @param port\n * @param version\n * @param pkgName\n */\nexport async function initServer(\n config: ConfigYaml,\n port: string | void,\n version: string,\n pkgName: string,\n serverFactory: ServerFactory\n): Promise<void> {\n const logger = await setup(config?.log as any);\n const addr = getListenAddress(port ?? config?.listen, logger);\n displayExperimentsInfoBox(config.flags);\n\n const app = await serverFactory(config);\n const httpServer = createServerFactory(config, addr, app);\n\n return new Promise<void>((resolve, reject) => {\n httpServer\n .listen(addr.port || addr.path, addr.host, (): void => {\n // send a message for test\n if (typeof process.send === 'function') {\n process.send({\n verdaccio_started: true,\n });\n }\n const addressServer = `${\n addr.path\n ? url.format({\n protocol: 'unix',\n pathname: addr.path,\n })\n : url.format({\n protocol: addr.proto,\n hostname: addr.host,\n port: addr.port,\n pathname: '/',\n })\n }`;\n logger.info({ addressServer }, 'http address: @{addressServer}');\n logger.info({ version }, 'version: @{version}');\n resolve();\n })\n .on('error', function (err): void {\n reject(err);\n process.exitCode = 1;\n });\n function handleShutdownGracefully() {\n logger.info('received shutdown signal - closing server gracefully...');\n httpServer.close(() => {\n logger.info('server closed.');\n process.exit(0);\n });\n }\n\n for (const signal of ['SIGINT', 'SIGTERM', 'SIGHUP']) {\n // Use once() so that receiving double signals exit the app.\n process.once(signal, handleShutdownGracefully);\n }\n });\n}\n\n/**\n * Exposes a server factory to be instantiated programmatically.\n *\n ```ts\n const app = await runServer(); // default configuration\n const app = await runServer('./config/config.yaml');\n const app = await runServer({ configuration });\n app.listen(4000, (event) => {\n // do something\n });\n ```\n * @param config\n */\nexport async function runServer(\n config: string | ConfigYaml | undefined,\n serverFactory: ServerFactory\n): Promise<any> {\n const configurationParsed = getConfigParsed(config);\n await setup(configurationParsed.log as any);\n displayExperimentsInfoBox(configurationParsed.flags);\n const addr = getListenAddress(configurationParsed.listen, logger);\n const app = await serverFactory(configurationParsed);\n return createServerFactory(configurationParsed, addr, app);\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@verdaccio/node-api",
3
- "version": "9.0.0-next-9.20",
3
+ "version": "9.0.0-next-9.22",
4
4
  "description": "Verdaccio Node API",
5
5
  "main": "build/index.js",
6
6
  "types": "build/index.d.ts",
@@ -33,16 +33,16 @@
33
33
  },
34
34
  "license": "MIT",
35
35
  "dependencies": {
36
- "@verdaccio/config": "9.0.0-next-9.20",
37
- "@verdaccio/logger": "9.0.0-next-9.20",
36
+ "@verdaccio/config": "9.0.0-next-9.22",
37
+ "@verdaccio/logger": "9.0.0-next-9.22",
38
38
  "debug": "4.4.3",
39
39
  "lodash-es": "4.18.1"
40
40
  },
41
41
  "devDependencies": {
42
42
  "@types/lodash-es": "4.17.12",
43
43
  "rimraf": "6.1.3",
44
- "vite": "8.0.14",
45
- "vitest": "4.1.7"
44
+ "vite": "8.1.4",
45
+ "vitest": "4.1.10"
46
46
  },
47
47
  "publishConfig": {
48
48
  "access": "public"