@verdaccio/server 8.0.0-next-8.3 → 8.0.0-next-8.5
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/CHANGELOG.md +51 -0
- package/build/index.d.ts +1 -1
- package/build/index.js +9 -2
- package/build/index.js.map +1 -1
- package/build/server.d.ts +4 -2
- package/build/server.js +13 -9
- package/build/server.js.map +1 -1
- package/package.json +17 -17
- package/src/index.ts +1 -1
- package/src/server.ts +19 -10
- package/test/_helper.ts +3 -3
- package/test/server.spec.ts +101 -95
- package/jest.config.js +0 -10
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,56 @@
|
|
|
1
1
|
# @verdaccio/server
|
|
2
2
|
|
|
3
|
+
## 8.0.0-next-8.5
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 9041b0f: chore: add info to log when audit, htpasswd, theme are used
|
|
8
|
+
- Updated dependencies [ba71932]
|
|
9
|
+
- Updated dependencies [64a7fc0]
|
|
10
|
+
- Updated dependencies [b2339e2]
|
|
11
|
+
- Updated dependencies [9041b0f]
|
|
12
|
+
- Updated dependencies [eca6259]
|
|
13
|
+
- Updated dependencies [4adaa83]
|
|
14
|
+
- Updated dependencies [80e4cb8]
|
|
15
|
+
- Updated dependencies [5cbee6f]
|
|
16
|
+
- Updated dependencies [538bb8f]
|
|
17
|
+
- Updated dependencies [a049bba]
|
|
18
|
+
- Updated dependencies [6e344d0]
|
|
19
|
+
- Updated dependencies [3967a52]
|
|
20
|
+
- @verdaccio/loaders@8.0.0-next-8.4
|
|
21
|
+
- @verdaccio/config@8.0.0-next-8.5
|
|
22
|
+
- @verdaccio/core@8.0.0-next-8.5
|
|
23
|
+
- @verdaccio/web@8.1.0-next-8.5
|
|
24
|
+
- @verdaccio/store@8.0.0-next-8.5
|
|
25
|
+
- @verdaccio/auth@8.0.0-next-8.5
|
|
26
|
+
- @verdaccio/api@8.1.0-next-8.5
|
|
27
|
+
- @verdaccio/logger@8.0.0-next-8.5
|
|
28
|
+
- verdaccio-audit@13.0.0-next-8.5
|
|
29
|
+
- @verdaccio/middleware@8.0.0-next-8.5
|
|
30
|
+
- @verdaccio/utils@8.1.0-next-8.5
|
|
31
|
+
|
|
32
|
+
## 8.0.0-next-8.4
|
|
33
|
+
|
|
34
|
+
### Patch Changes
|
|
35
|
+
|
|
36
|
+
- 48aa89f: chore: request header constants
|
|
37
|
+
- e93d6a3: chore: auth package requires logger as parameter
|
|
38
|
+
- Updated dependencies [48aa89f]
|
|
39
|
+
- Updated dependencies [58e0d95]
|
|
40
|
+
- Updated dependencies [1076a89]
|
|
41
|
+
- Updated dependencies [e93d6a3]
|
|
42
|
+
- @verdaccio/middleware@8.0.0-next-8.4
|
|
43
|
+
- @verdaccio/core@8.0.0-next-8.4
|
|
44
|
+
- @verdaccio/api@8.1.0-next-8.4
|
|
45
|
+
- @verdaccio/auth@8.0.0-next-8.4
|
|
46
|
+
- @verdaccio/web@8.1.0-next-8.4
|
|
47
|
+
- @verdaccio/config@8.0.0-next-8.4
|
|
48
|
+
- @verdaccio/loaders@8.0.0-next-8.3
|
|
49
|
+
- verdaccio-audit@13.0.0-next-8.4
|
|
50
|
+
- @verdaccio/store@8.0.0-next-8.4
|
|
51
|
+
- @verdaccio/utils@8.1.0-next-8.4
|
|
52
|
+
- @verdaccio/logger@8.0.0-next-8.4
|
|
53
|
+
|
|
3
54
|
## 8.0.0-next-8.3
|
|
4
55
|
|
|
5
56
|
### Patch Changes
|
package/build/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export { default } from './server';
|
|
1
|
+
export { default, startServer } from './server';
|
package/build/index.js
CHANGED
|
@@ -9,6 +9,13 @@ Object.defineProperty(exports, "default", {
|
|
|
9
9
|
return _server.default;
|
|
10
10
|
}
|
|
11
11
|
});
|
|
12
|
-
|
|
13
|
-
|
|
12
|
+
Object.defineProperty(exports, "startServer", {
|
|
13
|
+
enumerable: true,
|
|
14
|
+
get: function () {
|
|
15
|
+
return _server.startServer;
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
var _server = _interopRequireWildcard(require("./server"));
|
|
19
|
+
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
20
|
+
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
14
21
|
//# sourceMappingURL=index.js.map
|
package/build/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["_server","
|
|
1
|
+
{"version":3,"file":"index.js","names":["_server","_interopRequireWildcard","require","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","call","i","set"],"sources":["../src/index.ts"],"sourcesContent":["export { default, startServer } from './server';\n"],"mappings":";;;;;;;;;;;;;;;;;AAAA,IAAAA,OAAA,GAAAC,uBAAA,CAAAC,OAAA;AAAgD,SAAAC,yBAAAC,CAAA,6BAAAC,OAAA,mBAAAC,CAAA,OAAAD,OAAA,IAAAE,CAAA,OAAAF,OAAA,YAAAF,wBAAA,YAAAA,CAAAC,CAAA,WAAAA,CAAA,GAAAG,CAAA,GAAAD,CAAA,KAAAF,CAAA;AAAA,SAAAH,wBAAAG,CAAA,EAAAE,CAAA,SAAAA,CAAA,IAAAF,CAAA,IAAAA,CAAA,CAAAI,UAAA,SAAAJ,CAAA,eAAAA,CAAA,uBAAAA,CAAA,yBAAAA,CAAA,WAAAK,OAAA,EAAAL,CAAA,QAAAG,CAAA,GAAAJ,wBAAA,CAAAG,CAAA,OAAAC,CAAA,IAAAA,CAAA,CAAAG,GAAA,CAAAN,CAAA,UAAAG,CAAA,CAAAI,GAAA,CAAAP,CAAA,OAAAQ,CAAA,KAAAC,SAAA,UAAAC,CAAA,GAAAC,MAAA,CAAAC,cAAA,IAAAD,MAAA,CAAAE,wBAAA,WAAAC,CAAA,IAAAd,CAAA,oBAAAc,CAAA,OAAAC,cAAA,CAAAC,IAAA,CAAAhB,CAAA,EAAAc,CAAA,SAAAG,CAAA,GAAAP,CAAA,GAAAC,MAAA,CAAAE,wBAAA,CAAAb,CAAA,EAAAc,CAAA,UAAAG,CAAA,KAAAA,CAAA,CAAAV,GAAA,IAAAU,CAAA,CAAAC,GAAA,IAAAP,MAAA,CAAAC,cAAA,CAAAJ,CAAA,EAAAM,CAAA,EAAAG,CAAA,IAAAT,CAAA,CAAAM,CAAA,IAAAd,CAAA,CAAAc,CAAA,YAAAN,CAAA,CAAAH,OAAA,GAAAL,CAAA,EAAAG,CAAA,IAAAA,CAAA,CAAAe,GAAA,CAAAlB,CAAA,EAAAQ,CAAA,GAAAA,CAAA","ignoreList":[]}
|
package/build/server.d.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { Express } from 'express';
|
|
1
2
|
import { ConfigYaml } from '@verdaccio/types';
|
|
2
|
-
declare const
|
|
3
|
-
export
|
|
3
|
+
declare const startServer: (configHash: ConfigYaml) => Promise<Express>;
|
|
4
|
+
export { startServer };
|
|
5
|
+
export default startServer;
|
package/build/server.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.default = void 0;
|
|
6
|
+
exports.startServer = exports.default = void 0;
|
|
7
7
|
var _compression = _interopRequireDefault(require("compression"));
|
|
8
8
|
var _cors = _interopRequireDefault(require("cors"));
|
|
9
9
|
var _debug = _interopRequireDefault(require("debug"));
|
|
@@ -26,7 +26,7 @@ const {
|
|
|
26
26
|
version
|
|
27
27
|
} = require('../package.json');
|
|
28
28
|
const defineAPI = async function (config, storage) {
|
|
29
|
-
const auth = new _auth.Auth(config);
|
|
29
|
+
const auth = new _auth.Auth(config, _logger.logger);
|
|
30
30
|
await auth.init();
|
|
31
31
|
const app = (0, _express.default)();
|
|
32
32
|
// run in production mode by default, just in case
|
|
@@ -60,15 +60,18 @@ const defineAPI = async function (config, storage) {
|
|
|
60
60
|
return typeof plugin.register_middlewares !== 'undefined';
|
|
61
61
|
}, config?.serverSettings?.pluginPrefix ?? 'verdaccio', _core.PLUGIN_CATEGORY.MIDDLEWARE);
|
|
62
62
|
if (plugins.length === 0) {
|
|
63
|
-
|
|
64
|
-
// @ts-ignore
|
|
65
|
-
plugins.push(new _verdaccioAudit.default({
|
|
63
|
+
const auditPlugin = new _verdaccioAudit.default({
|
|
66
64
|
enabled: true,
|
|
67
65
|
strict_ssl: true
|
|
68
66
|
}, {
|
|
69
67
|
config,
|
|
70
68
|
logger: _logger.logger
|
|
71
|
-
})
|
|
69
|
+
});
|
|
70
|
+
_logger.logger.info({
|
|
71
|
+
name: 'verdaccio-audit',
|
|
72
|
+
pluginCategory: _core.PLUGIN_CATEGORY.MIDDLEWARE
|
|
73
|
+
}, 'plugin @{name} successfully loaded (@{pluginCategory})');
|
|
74
|
+
plugins.push(auditPlugin);
|
|
72
75
|
}
|
|
73
76
|
plugins.forEach(plugin => {
|
|
74
77
|
plugin.register_middlewares(app, auth, storage);
|
|
@@ -76,7 +79,7 @@ const defineAPI = async function (config, storage) {
|
|
|
76
79
|
|
|
77
80
|
// For npm request
|
|
78
81
|
// @ts-ignore
|
|
79
|
-
app.use((0, _api.default)(config, auth, storage));
|
|
82
|
+
app.use((0, _api.default)(config, auth, storage, _logger.logger));
|
|
80
83
|
|
|
81
84
|
// For WebUI & WebUI API
|
|
82
85
|
if (_lodash.default.get(config, 'web.enable', true)) {
|
|
@@ -84,7 +87,7 @@ const defineAPI = async function (config, storage) {
|
|
|
84
87
|
res.locals.app_version = version ?? '';
|
|
85
88
|
next();
|
|
86
89
|
});
|
|
87
|
-
const middleware = await (0, _web.default)(config, auth, storage);
|
|
90
|
+
const middleware = await (0, _web.default)(config, auth, storage, _logger.logger);
|
|
88
91
|
app.use(middleware);
|
|
89
92
|
} else {
|
|
90
93
|
app.get('/', function (req, res, next) {
|
|
@@ -125,7 +128,7 @@ const defineAPI = async function (config, storage) {
|
|
|
125
128
|
app.use(_middleware.final);
|
|
126
129
|
return app;
|
|
127
130
|
};
|
|
128
|
-
|
|
131
|
+
const startServer = exports.startServer = async function startServer(configHash) {
|
|
129
132
|
debug('start server');
|
|
130
133
|
const config = new _config.Config({
|
|
131
134
|
...configHash
|
|
@@ -147,4 +150,5 @@ var startServer = exports.default = async function startServer(configHash) {
|
|
|
147
150
|
}
|
|
148
151
|
return await defineAPI(config, storage);
|
|
149
152
|
};
|
|
153
|
+
var _default = exports.default = startServer;
|
|
150
154
|
//# sourceMappingURL=server.js.map
|
package/build/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","names":["_compression","_interopRequireDefault","require","_cors","_debug","_express","_lodash","_verdaccioAudit","_api","_auth","_config","_core","_loaders","_logger","_middleware","_store","_web","_debug2","e","__esModule","default","debug","buildDebug","version","defineAPI","config","storage","auth","Auth","init","app","express","set","process","env","NODE_ENV","server","trustProxy","use","cors","rateLimit","serverSettings","errorReportingMiddlewareWrap","errorReportingMiddleware","logger","log","userAgent","compression","get","req","res","next","url","hookDebug","configPath","plugins","asyncLoadPlugin","middlewares","plugin","register_middlewares","pluginPrefix","PLUGIN_CATEGORY","MIDDLEWARE","length","info","push","AuditMiddleware","enabled","strict_ssl","forEach","apiEndpoint","_","_req","locals","app_version","middleware","webMiddleware","errorUtils","getNotFound","API_ERROR","WEB_DISABLED","handleError","final","startServer","exports","configHash","AppConfig","Storage","err","error","msg","Error"],"sources":["../src/server.ts"],"sourcesContent":["import compression from 'compression';\nimport cors from 'cors';\nimport buildDebug from 'debug';\nimport express from 'express';\nimport _ from 'lodash';\nimport AuditMiddleware from 'verdaccio-audit';\n\nimport apiEndpoint from '@verdaccio/api';\nimport { Auth } from '@verdaccio/auth';\nimport { Config as AppConfig } from '@verdaccio/config';\nimport { API_ERROR, PLUGIN_CATEGORY, errorUtils, pluginUtils } from '@verdaccio/core';\nimport { asyncLoadPlugin } from '@verdaccio/loaders';\nimport { logger } from '@verdaccio/logger';\nimport {\n errorReportingMiddleware,\n final,\n handleError,\n log,\n rateLimit,\n userAgent,\n} from '@verdaccio/middleware';\nimport { Storage } from '@verdaccio/store';\nimport { ConfigYaml } from '@verdaccio/types';\nimport { Config as IConfig } from '@verdaccio/types';\nimport webMiddleware from '@verdaccio/web';\n\nimport { $NextFunctionVer, $RequestExtend, $ResponseExtend } from '../types/custom';\nimport hookDebug from './debug';\n\nconst debug = buildDebug('verdaccio:server');\nconst { version } = require('../package.json');\n\nconst defineAPI = async function (config: IConfig, storage: Storage): Promise<any> {\n const auth: Auth = new Auth(config);\n await auth.init();\n const app = express();\n // run in production mode by default, just in case\n // it shouldn't make any difference anyway\n app.set('env', process.env.NODE_ENV || 'production');\n if (config.server?.trustProxy) {\n app.set('trust proxy', config.server.trustProxy);\n }\n app.use(cors());\n app.use(rateLimit(config.serverSettings.rateLimit));\n\n const errorReportingMiddlewareWrap = errorReportingMiddleware(logger);\n\n // Router setup\n app.use(log(logger));\n app.use(errorReportingMiddlewareWrap);\n app.use(userAgent(config));\n app.use(compression());\n\n app.get(\n '/favicon.ico',\n function (req: $RequestExtend, res: $ResponseExtend, next: $NextFunctionVer): void {\n req.url = '/-/static/favicon.ico';\n next();\n }\n );\n\n // Hook for tests only\n if (config._debug) {\n hookDebug(app, config.configPath);\n }\n\n const plugins: pluginUtils.ExpressMiddleware<IConfig, {}, Auth>[] = await asyncLoadPlugin(\n config.middlewares,\n {\n config,\n logger,\n },\n function (plugin) {\n return typeof plugin.register_middlewares !== 'undefined';\n },\n config?.serverSettings?.pluginPrefix ?? 'verdaccio',\n PLUGIN_CATEGORY.MIDDLEWARE\n );\n\n if (plugins.length === 0) {\n logger.info('none middleware plugins has been defined, adding audit middleware by default');\n // @ts-ignore\n plugins.push(new AuditMiddleware({ enabled: true, strict_ssl: true }, { config, logger }));\n }\n\n plugins.forEach((plugin: pluginUtils.ExpressMiddleware<IConfig, {}, Auth>) => {\n plugin.register_middlewares(app, auth, storage);\n });\n\n // For npm request\n // @ts-ignore\n app.use(apiEndpoint(config, auth, storage));\n\n // For WebUI & WebUI API\n if (_.get(config, 'web.enable', true)) {\n app.use((_req, res, next) => {\n res.locals.app_version = version ?? '';\n next();\n });\n const middleware = await webMiddleware(config, auth, storage);\n app.use(middleware);\n } else {\n app.get('/', function (req: $RequestExtend, res: $ResponseExtend, next: $NextFunctionVer) {\n next(errorUtils.getNotFound(API_ERROR.WEB_DISABLED));\n });\n }\n\n // Catch 404\n app.get('/*', function (req: $RequestExtend, res: $ResponseExtend, next: $NextFunctionVer) {\n next(errorUtils.getNotFound('resource not found'));\n });\n\n // @ts-ignore\n app.use(handleError(logger));\n\n // app.use(function (\n // err: HttpError,\n // req: $RequestExtend,\n // res: $ResponseExtend,\n // next: $NextFunctionVer\n // ) {\n // if (_.isError(err)) {\n // if (err.code === 'ECONNABORT' && res.statusCode === HTTP_STATUS.NOT_MODIFIED) {\n // return next();\n // }\n // if (_.isFunction(res.locals.report_error) === false) {\n // // in case of very early error this middleware may not be loaded before error is generated\n // // fixing that\n // errorReportingMiddlewareWrap(req, res, _.noop);\n // }\n // res.locals.report_error(err);\n // } else {\n // // Fall to Middleware.final\n // return next(err);\n // }\n // });\n\n app.use(final);\n\n return app;\n};\n\nexport default (async function startServer(configHash: ConfigYaml): Promise<any> {\n debug('start server');\n const config: IConfig = new AppConfig({ ...configHash } as any);\n // register middleware plugins\n debug('loaded filter plugin');\n // @ts-ignore\n const storage: Storage = new Storage(config, logger);\n try {\n // waits until init calls have been initialized\n debug('storage init start');\n await storage.init(config);\n debug('storage init end');\n } catch (err: any) {\n logger.error({ error: err.msg }, 'storage has failed: @{error}');\n throw new Error(err);\n }\n return await defineAPI(config, storage);\n});\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"server.js","names":["_compression","_interopRequireDefault","require","_cors","_debug","_express","_lodash","_verdaccioAudit","_api","_auth","_config","_core","_loaders","_logger","_middleware","_store","_web","_debug2","e","__esModule","default","debug","buildDebug","version","defineAPI","config","storage","auth","Auth","logger","init","app","express","set","process","env","NODE_ENV","server","trustProxy","use","cors","rateLimit","serverSettings","errorReportingMiddlewareWrap","errorReportingMiddleware","log","userAgent","compression","get","req","res","next","url","hookDebug","configPath","plugins","asyncLoadPlugin","middlewares","plugin","register_middlewares","pluginPrefix","PLUGIN_CATEGORY","MIDDLEWARE","length","auditPlugin","AuditMiddleware","enabled","strict_ssl","info","name","pluginCategory","push","forEach","apiEndpoint","_","_req","locals","app_version","middleware","webMiddleware","errorUtils","getNotFound","API_ERROR","WEB_DISABLED","handleError","final","startServer","exports","configHash","AppConfig","Storage","err","error","msg","Error","_default"],"sources":["../src/server.ts"],"sourcesContent":["import compression from 'compression';\nimport cors from 'cors';\nimport buildDebug from 'debug';\nimport express, { Express } from 'express';\nimport _ from 'lodash';\nimport AuditMiddleware from 'verdaccio-audit';\n\nimport apiEndpoint from '@verdaccio/api';\nimport { Auth } from '@verdaccio/auth';\nimport { Config as AppConfig } from '@verdaccio/config';\nimport { API_ERROR, PLUGIN_CATEGORY, errorUtils, pluginUtils } from '@verdaccio/core';\nimport { asyncLoadPlugin } from '@verdaccio/loaders';\nimport { logger } from '@verdaccio/logger';\nimport {\n errorReportingMiddleware,\n final,\n handleError,\n log,\n rateLimit,\n userAgent,\n} from '@verdaccio/middleware';\nimport { Storage } from '@verdaccio/store';\nimport { ConfigYaml } from '@verdaccio/types';\nimport { Config as IConfig } from '@verdaccio/types';\nimport webMiddleware from '@verdaccio/web';\n\nimport { $NextFunctionVer, $RequestExtend, $ResponseExtend } from '../types/custom';\nimport hookDebug from './debug';\n\nconst debug = buildDebug('verdaccio:server');\nconst { version } = require('../package.json');\n\nconst defineAPI = async function (config: IConfig, storage: Storage): Promise<Express> {\n const auth: Auth = new Auth(config, logger);\n await auth.init();\n const app = express();\n // run in production mode by default, just in case\n // it shouldn't make any difference anyway\n app.set('env', process.env.NODE_ENV || 'production');\n if (config.server?.trustProxy) {\n app.set('trust proxy', config.server.trustProxy);\n }\n app.use(cors());\n app.use(rateLimit(config.serverSettings.rateLimit));\n\n const errorReportingMiddlewareWrap = errorReportingMiddleware(logger);\n\n // Router setup\n app.use(log(logger));\n app.use(errorReportingMiddlewareWrap);\n app.use(userAgent(config));\n app.use(compression());\n\n app.get(\n '/favicon.ico',\n function (req: $RequestExtend, res: $ResponseExtend, next: $NextFunctionVer): void {\n req.url = '/-/static/favicon.ico';\n next();\n }\n );\n\n // Hook for tests only\n if (config._debug) {\n hookDebug(app, config.configPath);\n }\n\n const plugins: pluginUtils.ExpressMiddleware<IConfig, {}, Auth>[] = await asyncLoadPlugin(\n config.middlewares,\n {\n config,\n logger,\n },\n function (plugin) {\n return typeof plugin.register_middlewares !== 'undefined';\n },\n config?.serverSettings?.pluginPrefix ?? 'verdaccio',\n PLUGIN_CATEGORY.MIDDLEWARE\n );\n\n if (plugins.length === 0) {\n const auditPlugin = new AuditMiddleware(\n { enabled: true, strict_ssl: true },\n { config, logger }\n );\n logger.info(\n { name: 'verdaccio-audit', pluginCategory: PLUGIN_CATEGORY.MIDDLEWARE },\n 'plugin @{name} successfully loaded (@{pluginCategory})'\n );\n plugins.push(auditPlugin);\n }\n\n plugins.forEach((plugin: pluginUtils.ExpressMiddleware<IConfig, {}, Auth>) => {\n plugin.register_middlewares(app, auth, storage);\n });\n\n // For npm request\n // @ts-ignore\n app.use(apiEndpoint(config, auth, storage, logger));\n\n // For WebUI & WebUI API\n if (_.get(config, 'web.enable', true)) {\n app.use((_req, res, next) => {\n res.locals.app_version = version ?? '';\n next();\n });\n const middleware = await webMiddleware(config, auth, storage, logger);\n app.use(middleware);\n } else {\n app.get('/', function (req: $RequestExtend, res: $ResponseExtend, next: $NextFunctionVer) {\n next(errorUtils.getNotFound(API_ERROR.WEB_DISABLED));\n });\n }\n\n // Catch 404\n app.get('/*', function (req: $RequestExtend, res: $ResponseExtend, next: $NextFunctionVer) {\n next(errorUtils.getNotFound('resource not found'));\n });\n\n // @ts-ignore\n app.use(handleError(logger));\n\n // app.use(function (\n // err: HttpError,\n // req: $RequestExtend,\n // res: $ResponseExtend,\n // next: $NextFunctionVer\n // ) {\n // if (_.isError(err)) {\n // if (err.code === 'ECONNABORT' && res.statusCode === HTTP_STATUS.NOT_MODIFIED) {\n // return next();\n // }\n // if (_.isFunction(res.locals.report_error) === false) {\n // // in case of very early error this middleware may not be loaded before error is generated\n // // fixing that\n // errorReportingMiddlewareWrap(req, res, _.noop);\n // }\n // res.locals.report_error(err);\n // } else {\n // // Fall to Middleware.final\n // return next(err);\n // }\n // });\n\n app.use(final);\n\n return app;\n};\n\nconst startServer = async function startServer(configHash: ConfigYaml): Promise<Express> {\n debug('start server');\n const config: IConfig = new AppConfig({ ...configHash } as any);\n // register middleware plugins\n debug('loaded filter plugin');\n // @ts-ignore\n const storage: Storage = new Storage(config, logger);\n try {\n // waits until init calls have been initialized\n debug('storage init start');\n await storage.init(config);\n debug('storage init end');\n } catch (err: any) {\n logger.error({ error: err.msg }, 'storage has failed: @{error}');\n throw new Error(err);\n }\n return await defineAPI(config, storage);\n};\n\nexport { startServer };\nexport default startServer;\n"],"mappings":"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","ignoreList":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@verdaccio/server",
|
|
3
|
-
"version": "8.0.0-next-8.
|
|
3
|
+
"version": "8.0.0-next-8.5",
|
|
4
4
|
"description": "server logic",
|
|
5
5
|
"main": "./build/index.js",
|
|
6
6
|
"types": "build/index.d.ts",
|
|
@@ -29,26 +29,26 @@
|
|
|
29
29
|
"node": ">=18"
|
|
30
30
|
},
|
|
31
31
|
"dependencies": {
|
|
32
|
-
"@verdaccio/api": "8.1.0-next-8.
|
|
33
|
-
"@verdaccio/auth": "8.0.0-next-8.
|
|
34
|
-
"@verdaccio/core": "8.0.0-next-8.
|
|
35
|
-
"@verdaccio/config": "8.0.0-next-8.
|
|
36
|
-
"@verdaccio/loaders": "8.0.0-next-8.
|
|
37
|
-
"@verdaccio/logger": "8.0.0-next-8.
|
|
38
|
-
"@verdaccio/middleware": "8.0.0-next-8.
|
|
39
|
-
"@verdaccio/store": "8.0.0-next-8.
|
|
40
|
-
"@verdaccio/utils": "8.1.0-next-8.
|
|
41
|
-
"@verdaccio/web": "8.1.0-next-8.
|
|
42
|
-
"verdaccio-audit": "13.0.0-next-8.
|
|
43
|
-
"compression": "1.7.
|
|
32
|
+
"@verdaccio/api": "8.1.0-next-8.5",
|
|
33
|
+
"@verdaccio/auth": "8.0.0-next-8.5",
|
|
34
|
+
"@verdaccio/core": "8.0.0-next-8.5",
|
|
35
|
+
"@verdaccio/config": "8.0.0-next-8.5",
|
|
36
|
+
"@verdaccio/loaders": "8.0.0-next-8.4",
|
|
37
|
+
"@verdaccio/logger": "8.0.0-next-8.5",
|
|
38
|
+
"@verdaccio/middleware": "8.0.0-next-8.5",
|
|
39
|
+
"@verdaccio/store": "8.0.0-next-8.5",
|
|
40
|
+
"@verdaccio/utils": "8.1.0-next-8.5",
|
|
41
|
+
"@verdaccio/web": "8.1.0-next-8.5",
|
|
42
|
+
"verdaccio-audit": "13.0.0-next-8.5",
|
|
43
|
+
"compression": "1.7.5",
|
|
44
44
|
"cors": "2.8.5",
|
|
45
45
|
"debug": "4.3.7",
|
|
46
|
-
"express": "4.21.
|
|
46
|
+
"express": "4.21.1",
|
|
47
47
|
"lodash": "4.17.21"
|
|
48
48
|
},
|
|
49
49
|
"devDependencies": {
|
|
50
|
-
"@verdaccio/proxy": "8.0.0-next-8.
|
|
51
|
-
"@verdaccio/test-helper": "4.0.0-next-8.
|
|
50
|
+
"@verdaccio/proxy": "8.0.0-next-8.5",
|
|
51
|
+
"@verdaccio/test-helper": "4.0.0-next-8.2",
|
|
52
52
|
"http-errors": "2.0.0"
|
|
53
53
|
},
|
|
54
54
|
"funding": {
|
|
@@ -57,7 +57,7 @@
|
|
|
57
57
|
},
|
|
58
58
|
"scripts": {
|
|
59
59
|
"clean": "rimraf ./build",
|
|
60
|
-
"test": "
|
|
60
|
+
"test": "vitest run",
|
|
61
61
|
"type-check": "tsc --noEmit -p tsconfig.build.json",
|
|
62
62
|
"build:types": "tsc --emitDeclarationOnly -p tsconfig.build.json",
|
|
63
63
|
"watch": "pnpm build:js -- --watch",
|
package/src/index.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export { default } from './server';
|
|
1
|
+
export { default, startServer } from './server';
|
package/src/server.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import compression from 'compression';
|
|
2
2
|
import cors from 'cors';
|
|
3
3
|
import buildDebug from 'debug';
|
|
4
|
-
import express from 'express';
|
|
4
|
+
import express, { Express } from 'express';
|
|
5
5
|
import _ from 'lodash';
|
|
6
6
|
import AuditMiddleware from 'verdaccio-audit';
|
|
7
7
|
|
|
@@ -30,8 +30,8 @@ import hookDebug from './debug';
|
|
|
30
30
|
const debug = buildDebug('verdaccio:server');
|
|
31
31
|
const { version } = require('../package.json');
|
|
32
32
|
|
|
33
|
-
const defineAPI = async function (config: IConfig, storage: Storage): Promise<
|
|
34
|
-
const auth: Auth = new Auth(config);
|
|
33
|
+
const defineAPI = async function (config: IConfig, storage: Storage): Promise<Express> {
|
|
34
|
+
const auth: Auth = new Auth(config, logger);
|
|
35
35
|
await auth.init();
|
|
36
36
|
const app = express();
|
|
37
37
|
// run in production mode by default, just in case
|
|
@@ -78,9 +78,15 @@ const defineAPI = async function (config: IConfig, storage: Storage): Promise<an
|
|
|
78
78
|
);
|
|
79
79
|
|
|
80
80
|
if (plugins.length === 0) {
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
81
|
+
const auditPlugin = new AuditMiddleware(
|
|
82
|
+
{ enabled: true, strict_ssl: true },
|
|
83
|
+
{ config, logger }
|
|
84
|
+
);
|
|
85
|
+
logger.info(
|
|
86
|
+
{ name: 'verdaccio-audit', pluginCategory: PLUGIN_CATEGORY.MIDDLEWARE },
|
|
87
|
+
'plugin @{name} successfully loaded (@{pluginCategory})'
|
|
88
|
+
);
|
|
89
|
+
plugins.push(auditPlugin);
|
|
84
90
|
}
|
|
85
91
|
|
|
86
92
|
plugins.forEach((plugin: pluginUtils.ExpressMiddleware<IConfig, {}, Auth>) => {
|
|
@@ -89,7 +95,7 @@ const defineAPI = async function (config: IConfig, storage: Storage): Promise<an
|
|
|
89
95
|
|
|
90
96
|
// For npm request
|
|
91
97
|
// @ts-ignore
|
|
92
|
-
app.use(apiEndpoint(config, auth, storage));
|
|
98
|
+
app.use(apiEndpoint(config, auth, storage, logger));
|
|
93
99
|
|
|
94
100
|
// For WebUI & WebUI API
|
|
95
101
|
if (_.get(config, 'web.enable', true)) {
|
|
@@ -97,7 +103,7 @@ const defineAPI = async function (config: IConfig, storage: Storage): Promise<an
|
|
|
97
103
|
res.locals.app_version = version ?? '';
|
|
98
104
|
next();
|
|
99
105
|
});
|
|
100
|
-
const middleware = await webMiddleware(config, auth, storage);
|
|
106
|
+
const middleware = await webMiddleware(config, auth, storage, logger);
|
|
101
107
|
app.use(middleware);
|
|
102
108
|
} else {
|
|
103
109
|
app.get('/', function (req: $RequestExtend, res: $ResponseExtend, next: $NextFunctionVer) {
|
|
@@ -140,7 +146,7 @@ const defineAPI = async function (config: IConfig, storage: Storage): Promise<an
|
|
|
140
146
|
return app;
|
|
141
147
|
};
|
|
142
148
|
|
|
143
|
-
|
|
149
|
+
const startServer = async function startServer(configHash: ConfigYaml): Promise<Express> {
|
|
144
150
|
debug('start server');
|
|
145
151
|
const config: IConfig = new AppConfig({ ...configHash } as any);
|
|
146
152
|
// register middleware plugins
|
|
@@ -157,4 +163,7 @@ export default (async function startServer(configHash: ConfigYaml): Promise<any>
|
|
|
157
163
|
throw new Error(err);
|
|
158
164
|
}
|
|
159
165
|
return await defineAPI(config, storage);
|
|
160
|
-
}
|
|
166
|
+
};
|
|
167
|
+
|
|
168
|
+
export { startServer };
|
|
169
|
+
export default startServer;
|
package/test/_helper.ts
CHANGED
|
@@ -8,8 +8,6 @@ import { generateRandomHexString } from '@verdaccio/utils';
|
|
|
8
8
|
|
|
9
9
|
import apiMiddleware from '../src';
|
|
10
10
|
|
|
11
|
-
setup({});
|
|
12
|
-
|
|
13
11
|
export const getConf = async (conf) => {
|
|
14
12
|
const configPath = path.join(__dirname, 'config', conf);
|
|
15
13
|
const config = parseConfigFile(configPath);
|
|
@@ -25,5 +23,7 @@ export const getConf = async (conf) => {
|
|
|
25
23
|
};
|
|
26
24
|
|
|
27
25
|
export async function initializeServer(configName): Promise<Application> {
|
|
28
|
-
|
|
26
|
+
const config = await getConf(configName);
|
|
27
|
+
setup(config.log ?? {});
|
|
28
|
+
return apiMiddleware(config);
|
|
29
29
|
}
|
package/test/server.spec.ts
CHANGED
|
@@ -1,113 +1,119 @@
|
|
|
1
1
|
import supertest from 'supertest';
|
|
2
|
+
import { describe, expect, test } from 'vitest';
|
|
2
3
|
|
|
3
4
|
import { API_ERROR, HEADERS, HEADER_TYPE, HTTP_STATUS } from '@verdaccio/core';
|
|
5
|
+
import { setup } from '@verdaccio/logger';
|
|
4
6
|
|
|
5
7
|
import { initializeServer } from './_helper';
|
|
6
8
|
|
|
7
|
-
|
|
8
|
-
const app = await initializeServer('conf.yaml');
|
|
9
|
-
await supertest(app)
|
|
10
|
-
.get('/jquery')
|
|
11
|
-
.expect(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON_CHARSET)
|
|
12
|
-
.expect(HTTP_STATUS.NOT_FOUND);
|
|
13
|
-
});
|
|
9
|
+
setup({});
|
|
14
10
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
11
|
+
describe('server api', () => {
|
|
12
|
+
test('should request any package', async () => {
|
|
13
|
+
const app = await initializeServer('conf.yaml');
|
|
14
|
+
await supertest(app)
|
|
15
|
+
.get('/jquery')
|
|
16
|
+
.expect(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON_CHARSET)
|
|
17
|
+
.expect(HTTP_STATUS.NOT_FOUND);
|
|
18
|
+
});
|
|
22
19
|
|
|
23
|
-
test('should
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
expect(response.text).toMatch('<title>verdaccio</title>');
|
|
31
|
-
});
|
|
20
|
+
test('should able to catch non defined routes with 404', async () => {
|
|
21
|
+
const app = await initializeServer('conf.yaml');
|
|
22
|
+
await supertest(app)
|
|
23
|
+
.get('/-/this-does-not-exist-anywhere')
|
|
24
|
+
.expect(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON_CHARSET)
|
|
25
|
+
.expect(HTTP_STATUS.NOT_FOUND);
|
|
26
|
+
});
|
|
32
27
|
|
|
33
|
-
test('should
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
});
|
|
28
|
+
test('should return index page if web is enabled', async () => {
|
|
29
|
+
const app = await initializeServer('conf.yaml');
|
|
30
|
+
const response = await supertest(app)
|
|
31
|
+
.get('/')
|
|
32
|
+
.expect(HEADER_TYPE.CONTENT_TYPE, HEADERS.TEXT_HTML_UTF8)
|
|
33
|
+
.expect(HEADER_TYPE.CONTENT_ENCODING, HEADERS.GZIP)
|
|
34
|
+
.expect(HTTP_STATUS.OK);
|
|
35
|
+
expect(response.text).toMatch('<title>verdaccio</title>');
|
|
36
|
+
});
|
|
42
37
|
|
|
43
|
-
test('should
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
38
|
+
test('should define rate limit headers', async () => {
|
|
39
|
+
const app = await initializeServer('conf.yaml');
|
|
40
|
+
await supertest(app)
|
|
41
|
+
.get('/')
|
|
42
|
+
.expect(HEADER_TYPE.CONTENT_TYPE, HEADERS.TEXT_HTML_UTF8)
|
|
43
|
+
.expect(HEADERS.RATELIMIT_LIMIT, '10000')
|
|
44
|
+
.expect(HEADERS.RATELIMIT_REMAINING, '9999')
|
|
45
|
+
.expect(HTTP_STATUS.OK);
|
|
46
|
+
});
|
|
47
47
|
|
|
48
|
-
test('should contains
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
.expect(HEADER_TYPE.CONTENT_TYPE, HEADERS.TEXT_HTML_UTF8)
|
|
53
|
-
.expect(HTTP_STATUS.OK);
|
|
54
|
-
const etag = response.get(HEADERS.ETAG);
|
|
55
|
-
expect(typeof etag === 'string').toBeTruthy();
|
|
56
|
-
});
|
|
48
|
+
test('should contains cors headers', async () => {
|
|
49
|
+
const app = await initializeServer('conf.yaml');
|
|
50
|
+
await supertest(app).get('/').expect('access-control-allow-origin', '*').expect(HTTP_STATUS.OK);
|
|
51
|
+
});
|
|
57
52
|
|
|
58
|
-
test('should
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
}
|
|
53
|
+
test('should contains etag', async () => {
|
|
54
|
+
const app = await initializeServer('conf.yaml');
|
|
55
|
+
const response = await supertest(app)
|
|
56
|
+
.get('/')
|
|
57
|
+
.expect(HEADER_TYPE.CONTENT_TYPE, HEADERS.TEXT_HTML_UTF8)
|
|
58
|
+
.expect(HTTP_STATUS.OK);
|
|
59
|
+
const etag = response.get(HEADERS.ETAG);
|
|
60
|
+
expect(typeof etag === 'string').toBeTruthy();
|
|
61
|
+
});
|
|
67
62
|
|
|
68
|
-
test('should
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
});
|
|
63
|
+
test('should be hidden by default', async () => {
|
|
64
|
+
const app = await initializeServer('conf.yaml');
|
|
65
|
+
const response = await supertest(app)
|
|
66
|
+
.get('/')
|
|
67
|
+
.expect(HEADER_TYPE.CONTENT_TYPE, HEADERS.TEXT_HTML_UTF8)
|
|
68
|
+
.expect(HTTP_STATUS.OK);
|
|
69
|
+
const powered = response.get(HEADERS.POWERED_BY);
|
|
70
|
+
expect(powered).toMatch('hidden');
|
|
71
|
+
}, 40000);
|
|
77
72
|
|
|
78
|
-
test('should contains
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
});
|
|
73
|
+
test('should not contains powered header', async () => {
|
|
74
|
+
const app = await initializeServer('powered-disabled.yaml');
|
|
75
|
+
const response = await supertest(app)
|
|
76
|
+
.get('/')
|
|
77
|
+
.expect(HEADER_TYPE.CONTENT_TYPE, HEADERS.TEXT_HTML_UTF8)
|
|
78
|
+
.expect(HTTP_STATUS.OK);
|
|
79
|
+
const powered = response.get(HEADERS.POWERED_BY);
|
|
80
|
+
expect(powered).toEqual('hidden');
|
|
81
|
+
});
|
|
87
82
|
|
|
88
|
-
test('should
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
83
|
+
test('should contains custom powered header', async () => {
|
|
84
|
+
const app = await initializeServer('powered-custom.yaml');
|
|
85
|
+
const response = await supertest(app)
|
|
86
|
+
.get('/')
|
|
87
|
+
.expect(HEADER_TYPE.CONTENT_TYPE, HEADERS.TEXT_HTML_UTF8)
|
|
88
|
+
.expect(HTTP_STATUS.OK);
|
|
89
|
+
const powered = response.get(HEADERS.POWERED_BY);
|
|
90
|
+
expect(powered).toEqual('custom user agent');
|
|
91
|
+
});
|
|
96
92
|
|
|
97
|
-
test('should
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
93
|
+
test('should return 404 if web is disabled', async () => {
|
|
94
|
+
const app = await initializeServer('web-disabled.yaml');
|
|
95
|
+
const response = await supertest(app)
|
|
96
|
+
.get('/')
|
|
97
|
+
.expect(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON_CHARSET)
|
|
98
|
+
.expect(HTTP_STATUS.NOT_FOUND);
|
|
99
|
+
expect(response.body.error).toEqual(API_ERROR.WEB_DISABLED);
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
test('should not display debug hook disabled by default', async () => {
|
|
103
|
+
const app = await initializeServer('no_debug.yaml');
|
|
104
|
+
await supertest(app)
|
|
105
|
+
.get('/-/_debug')
|
|
106
|
+
.expect(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON_CHARSET)
|
|
107
|
+
.expect(HTTP_STATUS.NOT_FOUND);
|
|
108
|
+
});
|
|
104
109
|
|
|
105
|
-
test('should display debug hook if directly enabled', async () => {
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
110
|
+
test('should display debug hook if directly enabled', async () => {
|
|
111
|
+
const app = await initializeServer('conf.yaml');
|
|
112
|
+
const res = await supertest(app)
|
|
113
|
+
.get('/-/_debug')
|
|
114
|
+
.expect(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON_CHARSET)
|
|
115
|
+
.expect(HTTP_STATUS.OK);
|
|
116
|
+
expect(res.body.pid).toEqual(process.pid);
|
|
117
|
+
expect(res.body.mem).toBeDefined();
|
|
118
|
+
});
|
|
113
119
|
});
|