From f814da0b31e243da62a1466e3fb3f9a3d99b7a3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C2=A0stackdumper?= Date: Sun, 17 Mar 2019 00:36:56 +0200 Subject: [PATCH 1/7] feat: add dist-tags getting and creating --- packages/emeralt-server/src/config.ts | 5 +++ packages/emeralt-server/src/constants.ts | 7 +++- .../emeralt-server/src/handlers/adduser.ts | 31 +++++++++------ .../src/handlers/dist-tags/create.ts | 38 +++++++++++++++++++ .../src/handlers/dist-tags/get.ts | 27 +++++++++++++ .../src/handlers/dist-tags/index.ts | 11 ++++++ packages/emeralt-server/src/handlers/index.ts | 2 + packages/emeralt-server/src/handlers/login.ts | 3 +- .../src/handlers/packages/get.ts | 5 ++- .../src/handlers/packages/publish.ts | 7 ++-- .../src/handlers/packages/tarball.ts | 30 +++++++++------ packages/emeralt-server/src/handlers/ping.ts | 3 +- .../emeralt-server/src/handlers/search.ts | 3 +- .../src/handlers/sys/healthz.ts | 3 +- .../emeralt-server/src/middlewares/index.ts | 8 +++- .../src/middlewares/verify-token.ts | 1 + packages/emeralt-server/src/server.ts | 8 ++-- packages/emeralt-server/src/services/index.ts | 1 + packages/emeralt-types/src/emeralt/server.ts | 6 +++ 19 files changed, 163 insertions(+), 36 deletions(-) create mode 100644 packages/emeralt-server/src/handlers/dist-tags/create.ts create mode 100644 packages/emeralt-server/src/handlers/dist-tags/get.ts create mode 100644 packages/emeralt-server/src/handlers/dist-tags/index.ts diff --git a/packages/emeralt-server/src/config.ts b/packages/emeralt-server/src/config.ts index 30fd7eb..b625d55 100644 --- a/packages/emeralt-server/src/config.ts +++ b/packages/emeralt-server/src/config.ts @@ -17,6 +17,11 @@ export const emeraltServerDefaultConfig: TEmeraltServerConfig = { publish: true, }, + distTags: { + get: true, + create: true, + }, + sys: { healthz: true, }, diff --git a/packages/emeralt-server/src/constants.ts b/packages/emeralt-server/src/constants.ts index 3246489..3b6dd7d 100644 --- a/packages/emeralt-server/src/constants.ts +++ b/packages/emeralt-server/src/constants.ts @@ -6,10 +6,15 @@ export const endpoints = { package: { get: '/:package_name', - getTarball: '/-/tarball/:name/:version', + getTarball: '/-/tarball/:package_name/:version', publish: '/:package_name', }, + distTags: { + get: '/-/package/:package_name/dist-tags', + create: '/-/package/:package_name/dist-tags/:dist_tag', + }, + sys: { healthz: '/-/sys/healthz', }, diff --git a/packages/emeralt-server/src/handlers/adduser.ts b/packages/emeralt-server/src/handlers/adduser.ts index b7aa1a3..4c77ea9 100644 --- a/packages/emeralt-server/src/handlers/adduser.ts +++ b/packages/emeralt-server/src/handlers/adduser.ts @@ -1,23 +1,32 @@ import { TEmeraltHandlerParams } from '@emeralt/types' -import { endpoints } from '@/constants' import { Router } from 'express' import jwt from 'jsonwebtoken' + +import { endpoints } from '@/constants' import { useIf } from '@/utils' -export const adduserHandler = ({ auth, config }: TEmeraltHandlerParams) => +export const adduserHandler = ({ + config, + middlewares, + auth, +}: TEmeraltHandlerParams) => useIf( config.endpoints.adduser, - Router().put(endpoints.adduser, async (req, res, next) => { - const { name, password }: TRegistryAuthenticateRequestBody = req.body + Router().put( + endpoints.adduser, + middlewares.json, + async (req, res, next) => { + const { name, password }: TRegistryAuthenticateRequestBody = req.body - const valid = await auth.comparePassword(name, password) + const valid = await auth.comparePassword(name, password) - return res.status(valid ? 201 : 401).json({ - ok: valid, - id: name, - token: valid ? jwt.sign({ name }, 'secret') : null, - }) - }), + return res.status(valid ? 201 : 401).json({ + ok: valid, + id: name, + token: valid ? jwt.sign({ name }, 'secret') : null, + }) + }, + ), ) type TRegistryAuthenticateRequestBody = { diff --git a/packages/emeralt-server/src/handlers/dist-tags/create.ts b/packages/emeralt-server/src/handlers/dist-tags/create.ts new file mode 100644 index 0000000..1091ca8 --- /dev/null +++ b/packages/emeralt-server/src/handlers/dist-tags/create.ts @@ -0,0 +1,38 @@ +import { TEmeraltHandlerParams } from '@emeralt/types' +import { Router } from 'express' + +import { endpoints } from '@/constants' +import { useIf } from '@/utils' + +export const createDistTagHandler = ({ + config, + middlewares, + database, +}: TEmeraltHandlerParams) => + useIf( + config.endpoints.distTags.create, + Router().put( + endpoints.distTags.create, + middlewares.verifyToken, + middlewares.text, + async (req, res) => { + const { package_name, dist_tag } = req.params + + const metadata = await database.getMetadata(package_name) + + if (!metadata) { + return res.status(400).json({ ok: false }) + } + + if (!metadata['dist-tags']) { + metadata['dist-tags'] = {} + } + + metadata['dist-tags'][dist_tag] = req.body + + await database.putMetadata(package_name, metadata) + + return res.status(200).json({ ok: true }) + }, + ), + ) diff --git a/packages/emeralt-server/src/handlers/dist-tags/get.ts b/packages/emeralt-server/src/handlers/dist-tags/get.ts new file mode 100644 index 0000000..eae4bfa --- /dev/null +++ b/packages/emeralt-server/src/handlers/dist-tags/get.ts @@ -0,0 +1,27 @@ +import { TEmeraltHandlerParams } from '@emeralt/types' +import { Router } from 'express' + +import { endpoints } from '@/constants' +import { useIf } from '@/utils' + +export const getDistTagsHandler = ({ + config, + middlewares, + database, +}: TEmeraltHandlerParams) => + useIf( + config.endpoints.distTags.get, + Router().get( + endpoints.distTags.get, + middlewares.verifyToken, + async (req, res) => { + const metadata = await database.getMetadata(req.params.package_name) + + if (metadata) { + return res.status(200).json(metadata['dist-tags']) + } else { + return res.status(404).json({ ok: false }) + } + }, + ), + ) diff --git a/packages/emeralt-server/src/handlers/dist-tags/index.ts b/packages/emeralt-server/src/handlers/dist-tags/index.ts new file mode 100644 index 0000000..5a9b309 --- /dev/null +++ b/packages/emeralt-server/src/handlers/dist-tags/index.ts @@ -0,0 +1,11 @@ +import { TEmeraltHandlerParams } from '@emeralt/types' +import { Router } from 'express' + +// handlers +import { createDistTagHandler } from './create' +import { getDistTagsHandler } from './get' + +export const distTagsHandler = (params: TEmeraltHandlerParams) => + Router() + .use(createDistTagHandler(params)) + .use(getDistTagsHandler(params)) diff --git a/packages/emeralt-server/src/handlers/index.ts b/packages/emeralt-server/src/handlers/index.ts index 3c1188d..84aa5d9 100644 --- a/packages/emeralt-server/src/handlers/index.ts +++ b/packages/emeralt-server/src/handlers/index.ts @@ -4,6 +4,7 @@ import { TEmeraltHandlerParams } from '@emeralt/types' import { pingHandler } from './ping' import { searchHandler } from './search' import { packagesHandler } from './packages' +import { distTagsHandler } from './dist-tags' import { loginHandler } from './login' import { adduserHandler } from './adduser' import { sysHandler } from './sys' @@ -12,6 +13,7 @@ export const createHandlers = (params: TEmeraltHandlerParams) => ({ ping: pingHandler(params), search: searchHandler(params), packages: packagesHandler(params), + distTags: distTagsHandler(params), login: loginHandler(params), adduser: adduserHandler(params), sys: sysHandler(params), diff --git a/packages/emeralt-server/src/handlers/login.ts b/packages/emeralt-server/src/handlers/login.ts index 6965bf8..7e271ec 100644 --- a/packages/emeralt-server/src/handlers/login.ts +++ b/packages/emeralt-server/src/handlers/login.ts @@ -1,7 +1,8 @@ import { TEmeraltHandlerParams } from '@emeralt/types' +import { Router } from 'express' + import { endpoints } from '@/constants' import { useIf } from '@/utils' -import { Router } from 'express' export const loginHandler = ({ config }: TEmeraltHandlerParams) => useIf( diff --git a/packages/emeralt-server/src/handlers/packages/get.ts b/packages/emeralt-server/src/handlers/packages/get.ts index 72f4452..e705407 100644 --- a/packages/emeralt-server/src/handlers/packages/get.ts +++ b/packages/emeralt-server/src/handlers/packages/get.ts @@ -1,9 +1,10 @@ import { TEmeraltHandlerParams } from '@emeralt/types' -import { endpoints } from '@/constants' -import { useIf } from '@/utils' import { Router } from 'express' import { resolve } from 'url' +import { endpoints } from '@/constants' +import { useIf } from '@/utils' + export const getPackageHandler = ({ config, database, diff --git a/packages/emeralt-server/src/handlers/packages/publish.ts b/packages/emeralt-server/src/handlers/packages/publish.ts index ff47411..25d971e 100644 --- a/packages/emeralt-server/src/handlers/packages/publish.ts +++ b/packages/emeralt-server/src/handlers/packages/publish.ts @@ -1,10 +1,10 @@ import { TEmeraltHandlerParams, TMetadata } from '@emeralt/types' -import { extractPackageData, useIf } from '@/utils' -import { endpoints } from '@/constants' - import { Router } from 'express' import ssri from 'ssri' +import { extractPackageData, useIf } from '@/utils' +import { endpoints } from '@/constants' + export const publishPackageHandler = ({ config, middlewares, @@ -17,6 +17,7 @@ export const publishPackageHandler = ({ Router().put( endpoints.package.publish, middlewares.verifyToken, + middlewares.json, async (req, res) => { const { name: username } = req.context.decodedToken diff --git a/packages/emeralt-server/src/handlers/packages/tarball.ts b/packages/emeralt-server/src/handlers/packages/tarball.ts index 2840ce6..e177844 100644 --- a/packages/emeralt-server/src/handlers/packages/tarball.ts +++ b/packages/emeralt-server/src/handlers/packages/tarball.ts @@ -1,17 +1,25 @@ import { TEmeraltHandlerParams } from '@emeralt/types' + import { endpoints } from '@/constants' import { Router } from 'express' +import { useIf } from '@/utils' -export const getPackageTarballHandler = ({ storage }: TEmeraltHandlerParams) => - Router().get(endpoints.package.getTarball, async (req, res, next) => { - const { name, version } = req.params +export const getPackageTarballHandler = ({ + config, + storage, +}: TEmeraltHandlerParams) => + useIf( + config.endpoints.package.tarball, + Router().get(endpoints.package.getTarball, async (req, res) => { + const { package_name, version } = req.params - const rs = await storage.getTarball(name, version) + const rs = await storage.getTarball(package_name, version) - if (rs) { - res.header('content-encoding', 'application/octet-stream') - rs.pipe(res) - } else { - res.status(404).json({ ok: false }) - } - }) + if (rs) { + res.header('content-encoding', 'application/octet-stream') + rs.pipe(res) + } else { + res.status(404).json({ ok: false }) + } + }), + ) diff --git a/packages/emeralt-server/src/handlers/ping.ts b/packages/emeralt-server/src/handlers/ping.ts index 6d26618..ea71a1a 100644 --- a/packages/emeralt-server/src/handlers/ping.ts +++ b/packages/emeralt-server/src/handlers/ping.ts @@ -1,7 +1,8 @@ import { TEmeraltHandlerParams } from '@emeralt/types' +import { Router } from 'express' + import { endpoints } from '@/constants' import { useIf } from '@/utils' -import { Router } from 'express' export const pingHandler = ({ config }: TEmeraltHandlerParams) => useIf( diff --git a/packages/emeralt-server/src/handlers/search.ts b/packages/emeralt-server/src/handlers/search.ts index 5569c7d..020cec4 100644 --- a/packages/emeralt-server/src/handlers/search.ts +++ b/packages/emeralt-server/src/handlers/search.ts @@ -1,7 +1,8 @@ import { TEmeraltHandlerParams } from '@emeralt/types' +import { Router } from 'express' + import { endpoints } from '@/constants' import { useIf } from '@/utils' -import { Router } from 'express' export const searchHandler = ({ config }: TEmeraltHandlerParams) => useIf( diff --git a/packages/emeralt-server/src/handlers/sys/healthz.ts b/packages/emeralt-server/src/handlers/sys/healthz.ts index 5cbf889..ffb54ea 100644 --- a/packages/emeralt-server/src/handlers/sys/healthz.ts +++ b/packages/emeralt-server/src/handlers/sys/healthz.ts @@ -1,7 +1,8 @@ import { TEmeraltHandlerParams } from '@emeralt/types' -import { endpoints } from '@/constants' import { Router } from 'express' +import { endpoints } from '@/constants' + export const sysHealthzHandler = ({ auth, database, diff --git a/packages/emeralt-server/src/middlewares/index.ts b/packages/emeralt-server/src/middlewares/index.ts index 4b1b925..f73ba91 100644 --- a/packages/emeralt-server/src/middlewares/index.ts +++ b/packages/emeralt-server/src/middlewares/index.ts @@ -1,6 +1,7 @@ import { TEmeraltMiddlewareParams } from '@emeralt/types' -import { json } from 'body-parser' +import { json, text } from 'body-parser' import compression from 'compression' + import { loggerMiddleware } from './logger' import { verifyTokenMiddleware } from './verify-token' import { contextMiddleware } from './context' @@ -9,6 +10,11 @@ export const createMiddlewares = (params: TEmeraltMiddlewareParams) => ({ json: json({ limit: '64MB', }), + + text: text({ + limit: '128KB', + type: 'json', + }), compression: compression(), context: contextMiddleware(params), logger: loggerMiddleware(params), diff --git a/packages/emeralt-server/src/middlewares/verify-token.ts b/packages/emeralt-server/src/middlewares/verify-token.ts index 870a7ac..2d7b144 100644 --- a/packages/emeralt-server/src/middlewares/verify-token.ts +++ b/packages/emeralt-server/src/middlewares/verify-token.ts @@ -1,4 +1,5 @@ import { TEmeraltMiddlewareParams } from '@emeralt/types' + import { decodeAuthToken } from '../utils' export const verifyTokenMiddleware = (params: TEmeraltMiddlewareParams) => ( diff --git a/packages/emeralt-server/src/server.ts b/packages/emeralt-server/src/server.ts index baf6d1e..ce7375a 100644 --- a/packages/emeralt-server/src/server.ts +++ b/packages/emeralt-server/src/server.ts @@ -1,4 +1,4 @@ -import express, { Router } from 'express' +import express from 'express' import http from 'http' import merge from 'deepmerge' @@ -60,10 +60,11 @@ export const createEmeraltRouter = async (params: TEmeraltServerParams) => { const middlewares = createMiddlewares({ ...internal, services }) const handlers = createHandlers({ ...internal, services, middlewares }) - const router = Router() + const router = express + .Router() // middlewares .use(middlewares.logger) - .use(middlewares.json) + // .use(middlewares.json) .use(middlewares.compression) .use(middlewares.context) @@ -73,6 +74,7 @@ export const createEmeraltRouter = async (params: TEmeraltServerParams) => { .use(handlers.adduser) .use(handlers.search) .use(handlers.packages) + .use(handlers.distTags) .use(handlers.sys) // HACK FOR TESTS diff --git a/packages/emeralt-server/src/services/index.ts b/packages/emeralt-server/src/services/index.ts index 45af6a7..c8914e6 100644 --- a/packages/emeralt-server/src/services/index.ts +++ b/packages/emeralt-server/src/services/index.ts @@ -1,4 +1,5 @@ import { TEmeraltServiceParams } from '@emeralt/types' + import { jwtService } from './jwt' export const createServices = (params: TEmeraltServiceParams) => ({ diff --git a/packages/emeralt-types/src/emeralt/server.ts b/packages/emeralt-types/src/emeralt/server.ts index c5fb6d2..fcd5400 100644 --- a/packages/emeralt-types/src/emeralt/server.ts +++ b/packages/emeralt-types/src/emeralt/server.ts @@ -20,6 +20,12 @@ export type TEmeraltServerConfig = { package?: { get?: boolean publish?: boolean + tarball?: boolean + } + + distTags?: { + get?: boolean + create?: boolean } sys?: { From 304578ac6c64cfdb3f1ce5e706d333fbedd804eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C2=A0stackdumper?= Date: Sun, 17 Mar 2019 00:45:01 +0200 Subject: [PATCH 2/7] fix(server): enable tarballs endpoint in default config --- packages/emeralt-server/src/config.ts | 1 + packages/emeralt-server/src/middlewares/context.ts | 2 ++ 2 files changed, 3 insertions(+) diff --git a/packages/emeralt-server/src/config.ts b/packages/emeralt-server/src/config.ts index b625d55..ea72d2c 100644 --- a/packages/emeralt-server/src/config.ts +++ b/packages/emeralt-server/src/config.ts @@ -15,6 +15,7 @@ export const emeraltServerDefaultConfig: TEmeraltServerConfig = { package: { get: true, publish: true, + tarball: true, }, distTags: { diff --git a/packages/emeralt-server/src/middlewares/context.ts b/packages/emeralt-server/src/middlewares/context.ts index 492f816..92a3826 100644 --- a/packages/emeralt-server/src/middlewares/context.ts +++ b/packages/emeralt-server/src/middlewares/context.ts @@ -4,6 +4,8 @@ import { Handler } from 'express' export const contextMiddleware = ( params: TEmeraltMiddlewareParams, ): Handler => (req, res, next) => { + res.setHeader('X-Powered-By', 'Emeralt') + req.context = {} next() From 18241bd6a4e131e2dcb717a2c9dbd3aeea0efc05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C2=A0stackdumper?= Date: Sun, 17 Mar 2019 12:08:40 +0200 Subject: [PATCH 3/7] feat(server): add support for removing dist-tags --- packages/emeralt-server/src/config.ts | 1 + packages/emeralt-server/src/constants.ts | 1 + .../src/handlers/dist-tags/delete.ts | 29 +++++++++++++++++++ .../src/handlers/dist-tags/get.ts | 20 +++++-------- .../src/handlers/dist-tags/index.ts | 4 ++- 5 files changed, 42 insertions(+), 13 deletions(-) create mode 100644 packages/emeralt-server/src/handlers/dist-tags/delete.ts diff --git a/packages/emeralt-server/src/config.ts b/packages/emeralt-server/src/config.ts index ea72d2c..0998a55 100644 --- a/packages/emeralt-server/src/config.ts +++ b/packages/emeralt-server/src/config.ts @@ -21,6 +21,7 @@ export const emeraltServerDefaultConfig: TEmeraltServerConfig = { distTags: { get: true, create: true, + delete: true, }, sys: { diff --git a/packages/emeralt-server/src/constants.ts b/packages/emeralt-server/src/constants.ts index 3b6dd7d..0c53581 100644 --- a/packages/emeralt-server/src/constants.ts +++ b/packages/emeralt-server/src/constants.ts @@ -13,6 +13,7 @@ export const endpoints = { distTags: { get: '/-/package/:package_name/dist-tags', create: '/-/package/:package_name/dist-tags/:dist_tag', + delete: '/-/package/:package_name/dist-tags/:dist_tag', }, sys: { diff --git a/packages/emeralt-server/src/handlers/dist-tags/delete.ts b/packages/emeralt-server/src/handlers/dist-tags/delete.ts new file mode 100644 index 0000000..618baa7 --- /dev/null +++ b/packages/emeralt-server/src/handlers/dist-tags/delete.ts @@ -0,0 +1,29 @@ +import { TEmeraltHandlerParams } from '@emeralt/types' +import { Router } from 'express' + +import { endpoints } from '@/constants' +import { useIf } from '@/utils' + +export const deleteDistTagHandler = ({ + config, + middlewares, + database, +}: TEmeraltHandlerParams) => + useIf( + config.endpoints.distTags.delete, + Router().delete( + endpoints.distTags.delete, + middlewares.verifyToken, + async (req, res) => { + const { package_name, dist_tag } = req.params + + const metadata = await database.getMetadata(package_name) + + delete metadata['dist-tags'][dist_tag] + + await database.putMetadata(package_name, metadata) + + return res.status(200).json({ ok: true }) + }, + ), + ) diff --git a/packages/emeralt-server/src/handlers/dist-tags/get.ts b/packages/emeralt-server/src/handlers/dist-tags/get.ts index eae4bfa..929710f 100644 --- a/packages/emeralt-server/src/handlers/dist-tags/get.ts +++ b/packages/emeralt-server/src/handlers/dist-tags/get.ts @@ -11,17 +11,13 @@ export const getDistTagsHandler = ({ }: TEmeraltHandlerParams) => useIf( config.endpoints.distTags.get, - Router().get( - endpoints.distTags.get, - middlewares.verifyToken, - async (req, res) => { - const metadata = await database.getMetadata(req.params.package_name) + Router().get(endpoints.distTags.get, async (req, res) => { + const metadata = await database.getMetadata(req.params.package_name) - if (metadata) { - return res.status(200).json(metadata['dist-tags']) - } else { - return res.status(404).json({ ok: false }) - } - }, - ), + if (metadata) { + return res.status(200).json(metadata['dist-tags']) + } else { + return res.status(404).json({ ok: false }) + } + }), ) diff --git a/packages/emeralt-server/src/handlers/dist-tags/index.ts b/packages/emeralt-server/src/handlers/dist-tags/index.ts index 5a9b309..2d518cf 100644 --- a/packages/emeralt-server/src/handlers/dist-tags/index.ts +++ b/packages/emeralt-server/src/handlers/dist-tags/index.ts @@ -4,8 +4,10 @@ import { Router } from 'express' // handlers import { createDistTagHandler } from './create' import { getDistTagsHandler } from './get' +import { deleteDistTagHandler } from './delete' export const distTagsHandler = (params: TEmeraltHandlerParams) => Router() - .use(createDistTagHandler(params)) .use(getDistTagsHandler(params)) + .use(createDistTagHandler(params)) + .use(deleteDistTagHandler(params)) From f72cf0fcb58b1a460837454ace093fd5722f009f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C2=A0stackdumper?= Date: Sun, 17 Mar 2019 12:09:04 +0200 Subject: [PATCH 4/7] feat(cli): switch to database-localfs and storage-localfs --- packages/emeralt-cli/package.json | 6 +++--- packages/emeralt-cli/src/index.ts | 14 ++++++++++---- packages/emeralt-database-localfs/src/index.ts | 13 ++++++------- packages/emeralt-types/src/emeralt/server.ts | 1 + 4 files changed, 20 insertions(+), 14 deletions(-) diff --git a/packages/emeralt-cli/package.json b/packages/emeralt-cli/package.json index 79fae30..548f5c2 100644 --- a/packages/emeralt-cli/package.json +++ b/packages/emeralt-cli/package.json @@ -23,10 +23,10 @@ "start": "node build/index.js" }, "dependencies": { - "@emeralt/auth-inmemory": "^0.7.0", - "@emeralt/database-inmemory": "^0.7.0", "@emeralt/server": "^0.7.0", - "@emeralt/storage-inmemory": "^0.7.0", + "@emeralt/auth-inmemory": "^0.7.0", + "@emeralt/database-localfs": "^0.7.0", + "@emeralt/storage-localfs": "^0.7.0", "chalk": "^2.4.2" } } diff --git a/packages/emeralt-cli/src/index.ts b/packages/emeralt-cli/src/index.ts index c5235ff..73239f8 100644 --- a/packages/emeralt-cli/src/index.ts +++ b/packages/emeralt-cli/src/index.ts @@ -1,8 +1,10 @@ import chalk from 'chalk' +import { homedir } from 'os' +import { resolve } from 'path' import { createEmeraltServer } from '@emeralt/server' import { EmeraltAuthInMemory } from '@emeralt/auth-inmemory' -import { EmeraltDatabaseInMemory } from '@emeralt/database-inmemory' -import { EmeraltStorageInMemory } from '@emeralt/storage-inmemory' +import { EmeraltDatabaseLocalFS } from '@emeralt/database-localfs' +import { EmeraltStorageLocalFS } from '@emeralt/storage-localfs' createEmeraltServer({ auth: EmeraltAuthInMemory({ @@ -10,8 +12,12 @@ createEmeraltServer({ emeralt: 'emeralt', }, }), - database: EmeraltDatabaseInMemory({}), - storage: EmeraltStorageInMemory({}), + database: EmeraltDatabaseLocalFS({ + path: resolve(homedir(), '.emeralt'), + }), + storage: EmeraltStorageLocalFS({ + path: resolve(homedir(), '.emeralt'), + }), }).then((server) => { server.listen(8080, () => { console.log(chalk.bold.greenBright('Emeralt is listening at 8080...')) diff --git a/packages/emeralt-database-localfs/src/index.ts b/packages/emeralt-database-localfs/src/index.ts index 8b16ff3..4286bc8 100644 --- a/packages/emeralt-database-localfs/src/index.ts +++ b/packages/emeralt-database-localfs/src/index.ts @@ -6,7 +6,6 @@ import { } from '@emeralt/types' import fs from 'fs-extra' import { join } from 'path' -import { isNull } from 'util' interface Options { path?: string @@ -43,8 +42,8 @@ class CEmeraltDatabaseLocalFS implements CEmeraltDatabase { constructor(private options: Options) { this.paths = { - metadatas: join(process.cwd(), options.path, 'metadatas'), - versions: join(process.cwd(), options.path, 'versions'), + metadatas: join(options.path, 'metadatas'), + versions: join(options.path, 'versions'), } } @@ -107,14 +106,14 @@ class CEmeraltDatabaseLocalFS implements CEmeraltDatabase { } } -export const EmeraltDatabaseInMemory: IEmeraltDatabase = ( +export const EmeraltDatabaseLocalFS: IEmeraltDatabase = ( userOptions, ) => async () => { const options = Object.assign({}, defaultOptions, userOptions) - await fs.ensureDir(join(process.cwd(), options.path)) - await fs.ensureDir(join(process.cwd(), options.path, 'metadatas')) - await fs.ensureDir(join(process.cwd(), options.path, 'versions')) + await fs.ensureDir(join(options.path)) + await fs.ensureDir(join(options.path, 'metadatas')) + await fs.ensureDir(join(options.path, 'versions')) return new CEmeraltDatabaseLocalFS(options) } diff --git a/packages/emeralt-types/src/emeralt/server.ts b/packages/emeralt-types/src/emeralt/server.ts index fcd5400..b2bb326 100644 --- a/packages/emeralt-types/src/emeralt/server.ts +++ b/packages/emeralt-types/src/emeralt/server.ts @@ -26,6 +26,7 @@ export type TEmeraltServerConfig = { distTags?: { get?: boolean create?: boolean + delete?: boolean } sys?: { From 19bb10de2b67cddf8d38f729d118fc82398bb43a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C2=A0stackdumper?= Date: Sun, 17 Mar 2019 12:49:52 +0200 Subject: [PATCH 5/7] test(cli): remove source test --- packages/emeralt-cli/test/index.test.ts | 30 ++++++++----------------- 1 file changed, 9 insertions(+), 21 deletions(-) diff --git a/packages/emeralt-cli/test/index.test.ts b/packages/emeralt-cli/test/index.test.ts index 569e4a6..2b022b3 100644 --- a/packages/emeralt-cli/test/index.test.ts +++ b/packages/emeralt-cli/test/index.test.ts @@ -1,31 +1,19 @@ import test from 'ava' import supertest from 'supertest' -import { spawn } from 'child_process' +import { fork } from 'child_process' -test('start server', async (t) => { - require('../src/index') +const sleep = (t) => new Promise((resolve) => setTimeout(resolve, t)) + +test.serial('start server', async (t) => { + const server = fork('build/index.js') + + await sleep(1000) await supertest('http://localhost:8080') .get('/-/ping') .expect(200) - t.pass() -}) - -test('start built server', async (t) => { - const { status, body } = await new Promise(async (resolve) => { - const server = spawn('node', ['build/index.js']) - - const { status, body } = await supertest('http://localhost:8080').get( - '/-/ping', - ) + server.kill('SIGTERM') - server.kill('SIGTERM') - server.on('close', () => { - resolve({ status, body }) - }) - }) - - t.is(status, 200) - t.deepEqual(body, {}) + t.pass() }) From 967d9ce350fb125e511bd026c39af9fca7fee922 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C2=A0stackdumper?= Date: Tue, 19 Mar 2019 18:58:42 +0200 Subject: [PATCH 6/7] test(server): rewrite tests --- packages/emeralt-server/package.json | 2 +- packages/emeralt-server/src/config.ts | 8 +- .../emeralt-server/src/handlers/adduser.ts | 12 +- .../src/handlers/packages/publish.ts | 10 +- .../emeralt-server/src/middlewares/logger.ts | 17 ++- .../src/middlewares/verify-token.ts | 2 +- .../src/services/__test__/jwt.test.ts | 6 +- .../src/utils/extract-package-data.ts | 8 +- packages/emeralt-server/test/adduser.test.ts | 39 ------ .../test/disable-endoints.test.ts | 15 -- .../emeralt-server/test/fixtures/client.ts | 16 --- .../emeralt-server/test/fixtures/index.ts | 52 ------- .../test/fixtures/packages/index.ts | 27 ---- .../test/fixtures/packages/package-1/index.js | 0 .../fixtures/packages/package-1/package.json | 12 -- .../test/fixtures/packages/package-2/index.js | 7 - .../fixtures/packages/package-2/package.json | 9 -- packages/emeralt-server/test/fixtures/user.ts | 8 -- packages/emeralt-server/test/get.test.ts | 98 ------------- .../emeralt-server/test/http/adduser.test.ts | 45 ++++++ .../test/http/disable-endpoint.test.ts | 13 ++ packages/emeralt-server/test/http/get.test.ts | 35 +++++ .../emeralt-server/test/http/ping.test.ts | 10 ++ .../emeralt-server/test/http/publish.test.ts | 55 ++++++++ .../test/http/snapshots/get.test.ts.md | 37 +++++ .../test/http/snapshots/get.test.ts.snap | Bin 0 -> 547 bytes packages/emeralt-server/test/http/sys.test.ts | 17 +++ packages/emeralt-server/test/publish.test.ts | 31 ----- .../emeralt-server/test/shortcuts/adduser.ts | 11 -- .../emeralt-server/test/shortcuts/index.ts | 2 - .../emeralt-server/test/shortcuts/publish.ts | 17 --- .../test/snapshots/get.test.ts.md | 130 ------------------ .../test/snapshots/get.test.ts.snap | Bin 999 -> 0 bytes packages/emeralt-server/test/sys.test.ts | 22 --- .../emeralt-server/test/utils/fixtures.ts | 46 +++++++ .../test/{fixtures => utils}/server.ts | 29 ++-- packages/emeralt-server/test/utils/test.ts | 32 +++++ packages/emeralt-types/src/emeralt/server.ts | 4 +- packages/emeralt-types/src/npm/metadata.ts | 8 +- yarn.lock | 77 ++++++++--- 40 files changed, 405 insertions(+), 564 deletions(-) delete mode 100644 packages/emeralt-server/test/adduser.test.ts delete mode 100644 packages/emeralt-server/test/disable-endoints.test.ts delete mode 100644 packages/emeralt-server/test/fixtures/client.ts delete mode 100644 packages/emeralt-server/test/fixtures/index.ts delete mode 100644 packages/emeralt-server/test/fixtures/packages/index.ts delete mode 100644 packages/emeralt-server/test/fixtures/packages/package-1/index.js delete mode 100644 packages/emeralt-server/test/fixtures/packages/package-1/package.json delete mode 100644 packages/emeralt-server/test/fixtures/packages/package-2/index.js delete mode 100644 packages/emeralt-server/test/fixtures/packages/package-2/package.json delete mode 100644 packages/emeralt-server/test/fixtures/user.ts delete mode 100644 packages/emeralt-server/test/get.test.ts create mode 100644 packages/emeralt-server/test/http/adduser.test.ts create mode 100644 packages/emeralt-server/test/http/disable-endpoint.test.ts create mode 100644 packages/emeralt-server/test/http/get.test.ts create mode 100644 packages/emeralt-server/test/http/ping.test.ts create mode 100644 packages/emeralt-server/test/http/publish.test.ts create mode 100644 packages/emeralt-server/test/http/snapshots/get.test.ts.md create mode 100644 packages/emeralt-server/test/http/snapshots/get.test.ts.snap create mode 100644 packages/emeralt-server/test/http/sys.test.ts delete mode 100644 packages/emeralt-server/test/publish.test.ts delete mode 100644 packages/emeralt-server/test/shortcuts/adduser.ts delete mode 100644 packages/emeralt-server/test/shortcuts/index.ts delete mode 100644 packages/emeralt-server/test/shortcuts/publish.ts delete mode 100644 packages/emeralt-server/test/snapshots/get.test.ts.md delete mode 100644 packages/emeralt-server/test/snapshots/get.test.ts.snap delete mode 100644 packages/emeralt-server/test/sys.test.ts create mode 100644 packages/emeralt-server/test/utils/fixtures.ts rename packages/emeralt-server/test/{fixtures => utils}/server.ts (51%) create mode 100644 packages/emeralt-server/test/utils/test.ts diff --git a/packages/emeralt-server/package.json b/packages/emeralt-server/package.json index 4a099d5..1593dc8 100644 --- a/packages/emeralt-server/package.json +++ b/packages/emeralt-server/package.json @@ -24,6 +24,7 @@ "compression": "^1.7.3", "deepmerge": "^3.0.0", "express": "^4.16.4", + "express-pino-logger": "^4.0.0", "jsonwebtoken": "^8.4.0", "libnpm": "^2.0.1", "morgan": "^1.9.1", @@ -41,7 +42,6 @@ "@types/npm-packlist": "^1.1.0", "@types/supertest": "2.0.7", "@types/tar": "^4.0.0", - "casual": "^1.6.0", "doasync": "^2.0.1", "node-fetch": "^2.3.0", "npm-packlist": "^1.2.0", diff --git a/packages/emeralt-server/src/config.ts b/packages/emeralt-server/src/config.ts index 0998a55..eb86edc 100644 --- a/packages/emeralt-server/src/config.ts +++ b/packages/emeralt-server/src/config.ts @@ -1,7 +1,13 @@ import { TEmeraltServerConfig } from '@emeralt/types' +const getLogLevel = () => { + if (process.env.NODE_ENV === 'test') return 'silent' + if (process.env.NODE_ENV === 'production') return 'production' + else return 'dev' +} + export const emeraltServerDefaultConfig: TEmeraltServerConfig = { - logLevel: 'dev', + logLevel: getLogLevel(), jwt: { secret: 'secret', }, diff --git a/packages/emeralt-server/src/handlers/adduser.ts b/packages/emeralt-server/src/handlers/adduser.ts index 4c77ea9..cdd4d79 100644 --- a/packages/emeralt-server/src/handlers/adduser.ts +++ b/packages/emeralt-server/src/handlers/adduser.ts @@ -8,6 +8,7 @@ import { useIf } from '@/utils' export const adduserHandler = ({ config, middlewares, + services, auth, }: TEmeraltHandlerParams) => useIf( @@ -16,14 +17,17 @@ export const adduserHandler = ({ endpoints.adduser, middlewares.json, async (req, res, next) => { - const { name, password }: TRegistryAuthenticateRequestBody = req.body + const { + name: username, + password, + }: TRegistryAuthenticateRequestBody = req.body - const valid = await auth.comparePassword(name, password) + const valid = await auth.comparePassword(username, password) return res.status(valid ? 201 : 401).json({ ok: valid, - id: name, - token: valid ? jwt.sign({ name }, 'secret') : null, + id: username, + token: valid ? services.jwt.sign({ username }) : null, }) }, ), diff --git a/packages/emeralt-server/src/handlers/packages/publish.ts b/packages/emeralt-server/src/handlers/packages/publish.ts index 25d971e..a5b19be 100644 --- a/packages/emeralt-server/src/handlers/packages/publish.ts +++ b/packages/emeralt-server/src/handlers/packages/publish.ts @@ -19,13 +19,13 @@ export const publishPackageHandler = ({ middlewares.verifyToken, middlewares.json, async (req, res) => { - const { name: username } = req.context.decodedToken - - const { metadata, version, tarball } = extractPackageData( - req.body as TMetadata, - ) + const { username } = req.context.decodedToken try { + const { metadata, version, tarball } = extractPackageData( + req.body as TMetadata, + ) + if (!metadata || !version || !tarball) { throw new Error('Missing package data') } diff --git a/packages/emeralt-server/src/middlewares/logger.ts b/packages/emeralt-server/src/middlewares/logger.ts index 3a59146..c854601 100644 --- a/packages/emeralt-server/src/middlewares/logger.ts +++ b/packages/emeralt-server/src/middlewares/logger.ts @@ -1,7 +1,16 @@ import { TEmeraltMiddlewareParams } from '@emeralt/types' import morgan from 'morgan' +import pino from 'express-pino-logger' -export const loggerMiddleware = (params: TEmeraltMiddlewareParams) => - params.config.logLevel !== 'silent' - ? morgan(params.config.logLevel) - : (req, res, next) => next() +export const loggerMiddleware = (params: TEmeraltMiddlewareParams) => { + switch (params.config.logLevel) { + case 'dev': + return morgan('dev') + + case 'production': + return pino() + + default: + return (req, res, next) => next() + } +} diff --git a/packages/emeralt-server/src/middlewares/verify-token.ts b/packages/emeralt-server/src/middlewares/verify-token.ts index 2d7b144..308b210 100644 --- a/packages/emeralt-server/src/middlewares/verify-token.ts +++ b/packages/emeralt-server/src/middlewares/verify-token.ts @@ -1,6 +1,6 @@ import { TEmeraltMiddlewareParams } from '@emeralt/types' -import { decodeAuthToken } from '../utils' +import { decodeAuthToken } from '@/utils' export const verifyTokenMiddleware = (params: TEmeraltMiddlewareParams) => ( req, diff --git a/packages/emeralt-server/src/services/__test__/jwt.test.ts b/packages/emeralt-server/src/services/__test__/jwt.test.ts index a39f38a..fffeef9 100644 --- a/packages/emeralt-server/src/services/__test__/jwt.test.ts +++ b/packages/emeralt-server/src/services/__test__/jwt.test.ts @@ -2,7 +2,7 @@ import test from 'ava' import { jwtService } from '../jwt' test('jwt', (t) => { - const name = 'tester' + const username = 'tester' // @ts-ignore const jwt = jwtService({ config: { @@ -12,7 +12,7 @@ test('jwt', (t) => { }, }) - const token = jwt.sign({ name }) + const token = jwt.sign({ username }) - t.deepEqual(jwt.verify(token).name, name) + t.deepEqual(jwt.verify(token).username, username) }) diff --git a/packages/emeralt-server/src/utils/extract-package-data.ts b/packages/emeralt-server/src/utils/extract-package-data.ts index 375a36e..e212c18 100644 --- a/packages/emeralt-server/src/utils/extract-package-data.ts +++ b/packages/emeralt-server/src/utils/extract-package-data.ts @@ -12,13 +12,7 @@ const extractMetadata = (pkg: TMetadata) => { /* remove first of versions array with modified tarball url */ const extractVersion = (pkg: TMetadata) => { - const version = Object.values(pkg.versions).shift() - - const encodedName = encodeURIComponent(version.name) - const encodedVersion = encodeURIComponent(version.version) - - // TODO: get address from config - // version.dist.tarball = `http://localhost:8080/-/tarball/${encodedName}/${encodedVersion}` + const version = Object.values(pkg.versions)[0] return version } diff --git a/packages/emeralt-server/test/adduser.test.ts b/packages/emeralt-server/test/adduser.test.ts deleted file mode 100644 index 9fd8f46..0000000 --- a/packages/emeralt-server/test/adduser.test.ts +++ /dev/null @@ -1,39 +0,0 @@ -import test from 'ava' -import { adduser } from './shortcuts' -import { createFixtures } from './fixtures' -import { createUser } from './fixtures/user' - -test('adduser', async (t) => { - const fixtures = await createFixtures() - - const res = await adduser(fixtures, fixtures.users[0]) - - t.true(res.ok) - t.is(res.id, fixtures.users[0].username) - t.is(res.username, fixtures.users[0].username) - t.truthy(res.token) -}) - -test('adduser nonexistent user', async (t) => { - const fixtures = await createFixtures() - - await t.throwsAsync(adduser(fixtures, createUser())) -}) - -test('adduser wrong password', async (t) => { - const fixtures = await createFixtures() - - await t.throwsAsync( - adduser(fixtures, { - ...fixtures.users[0], - password: 'wrong-password', - }), - ) -}) - -test('adduser empty', async (t) => { - const fixtures = await createFixtures() - - // @ts-ignore - await t.throwsAsync(adduser(fixtures, {})) -}) diff --git a/packages/emeralt-server/test/disable-endoints.test.ts b/packages/emeralt-server/test/disable-endoints.test.ts deleted file mode 100644 index 08eb0be..0000000 --- a/packages/emeralt-server/test/disable-endoints.test.ts +++ /dev/null @@ -1,15 +0,0 @@ -import test from 'ava' -import { adduser } from './shortcuts' -import { createFixtures } from './fixtures' - -test('disable adduser endpoint', async (t) => { - const fixtures = await createFixtures({ - serverConfig: { - endpoints: { - adduser: false, - }, - }, - }) - - await t.throwsAsync(adduser(fixtures, fixtures.users[0])) -}) diff --git a/packages/emeralt-server/test/fixtures/client.ts b/packages/emeralt-server/test/fixtures/client.ts deleted file mode 100644 index a17f735..0000000 --- a/packages/emeralt-server/test/fixtures/client.ts +++ /dev/null @@ -1,16 +0,0 @@ -import npmlog from 'npmlog' -import libnpm from 'libnpm' - -export const createClient = (address: string) => { - npmlog.level = 'silent' - - return (method: string, config = {}) => (...args) => { - return libnpm[method](...args, { - log: npmlog, - // @ts-ignore - registry: address, - 'fetch-retries': 0, - ...config, - }) - } -} diff --git a/packages/emeralt-server/test/fixtures/index.ts b/packages/emeralt-server/test/fixtures/index.ts deleted file mode 100644 index 45be3b3..0000000 --- a/packages/emeralt-server/test/fixtures/index.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { TUser, TMetadata, Unpack, TEmeraltServerConfig } from '@emeralt/types' -import { Readable } from 'stream' -import { Server } from 'http' -import { join } from 'path' - -import { createPackage } from './packages' -import { createServer } from './server' -import { createClient } from './client' -import { createUser } from './user' -import { AddressInfo } from 'net' - -export type TOptions = { - serverConfig?: TEmeraltServerConfig -} - -export type TFixtures = Unpack> - -export const createFixtures = async ({ serverConfig }: TOptions = {}): Promise<{ - address: string - server: Server - client: Unpack - users: TUser[] - packages: { - metadata: TMetadata - tarball: Readable - }[] -}> => { - // generate 3 users - const users = [1, 2, 3].map(createUser) - - // create fully in-memory server - const server = await createServer(serverConfig, users) - - // get server address - const address = `http://localhost:${(server.address() as AddressInfo).port}` - - // create libnpm wrapper - const client = await createClient(address) - - // generate two package (manifests + tarballs) - const packages = await Promise.all( - ['package-1', 'package-2'].map(createPackage), - ) - - return { - address, - server, - client, - users, - packages, - } -} diff --git a/packages/emeralt-server/test/fixtures/packages/index.ts b/packages/emeralt-server/test/fixtures/packages/index.ts deleted file mode 100644 index 60dfc3f..0000000 --- a/packages/emeralt-server/test/fixtures/packages/index.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { join } from 'path' -import { Readable } from 'stream' -import { readFile } from 'fs-extra' -import packlist from 'npm-packlist' -import tar from 'tar' - -const getPkgTarball = async (dir) => { - const files = await packlist({ path: dir }) - - const readable = tar.create( - { - cwd: dir, - gzip: true, - }, - files, - ) - - return new Readable().wrap(readable) -} - -const getPkgMetadata = async (dir) => - JSON.parse(await readFile(join(dir, 'package.json'), 'utf8')) - -export const createPackage = async (name: string) => ({ - metadata: await getPkgMetadata(join(__dirname, name)), - tarball: await getPkgTarball(join(__dirname, name)), -}) diff --git a/packages/emeralt-server/test/fixtures/packages/package-1/index.js b/packages/emeralt-server/test/fixtures/packages/package-1/index.js deleted file mode 100644 index e69de29..0000000 diff --git a/packages/emeralt-server/test/fixtures/packages/package-1/package.json b/packages/emeralt-server/test/fixtures/packages/package-1/package.json deleted file mode 100644 index 50cdd1e..0000000 --- a/packages/emeralt-server/test/fixtures/packages/package-1/package.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "name": "@test/package-1", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "keywords": [], - "author": "emeralt@emeralt.emeralt", - "license": "ISC" -} diff --git a/packages/emeralt-server/test/fixtures/packages/package-2/index.js b/packages/emeralt-server/test/fixtures/packages/package-2/index.js deleted file mode 100644 index 7403ca9..0000000 --- a/packages/emeralt-server/test/fixtures/packages/package-2/index.js +++ /dev/null @@ -1,7 +0,0 @@ -import React from 'react' - -export const Button = () => ( -
- BUTTON -
-) diff --git a/packages/emeralt-server/test/fixtures/packages/package-2/package.json b/packages/emeralt-server/test/fixtures/packages/package-2/package.json deleted file mode 100644 index 6b51709..0000000 --- a/packages/emeralt-server/test/fixtures/packages/package-2/package.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "name": "@test/package-2", - "version": "2.0.0", - "description": "", - "main": "index.js", - "keywords": [], - "author": "emeralt@emeralt.emeralt", - "license": "MIT" -} diff --git a/packages/emeralt-server/test/fixtures/user.ts b/packages/emeralt-server/test/fixtures/user.ts deleted file mode 100644 index 932b255..0000000 --- a/packages/emeralt-server/test/fixtures/user.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { TUser } from '@emeralt/types' -import casual from 'casual' - -export const createUser = (): TUser => ({ - username: casual.username, - password: casual.password, - email: casual.email, -}) diff --git a/packages/emeralt-server/test/get.test.ts b/packages/emeralt-server/test/get.test.ts deleted file mode 100644 index ef81037..0000000 --- a/packages/emeralt-server/test/get.test.ts +++ /dev/null @@ -1,98 +0,0 @@ -import test from 'ava' -import { createFixtures } from './fixtures' -import { publish } from './shortcuts' - -const getMetadataSnapshot = (metadata: any) => ({ - ...metadata, - _integrity: 'skipped', - _resolved: 'skipped', - _shasum: 'skipped', -}) - -const getPackumentSnapshot = (packument: any) => ({ - ...packument, - _owner: 'skipped', - versions: Object.keys(packument.versions).map((version) => ({ - ...packument.versions[version], - _nodeVersion: 'skipped', - dist: { - ...packument.versions[version].dist, - integrity: 'skipped', - shasum: 'skipped', - tarball: 'skipped', - }, - })), -}) - -test('get metadata', async (t) => { - const fixtures = await createFixtures() - - await publish(fixtures, fixtures.users[0], fixtures.packages[0], '1.0.0') - await publish(fixtures, fixtures.users[0], fixtures.packages[0], '2.0.0') - - t.snapshot( - getMetadataSnapshot( - await fixtures.client('manifest')(fixtures.packages[0].metadata.name), - ), - ) - - t.snapshot( - getMetadataSnapshot( - await fixtures.client('manifest')( - `${fixtures.packages[0].metadata.name}@1.0.0`, - ), - ), - ) - - t.snapshot( - getMetadataSnapshot( - await fixtures.client('manifest')( - `${fixtures.packages[0].metadata.name}@2.0.0`, - ), - ), - ) - - await t.throwsAsync( - fixtures.client('manifest')(`${fixtures.packages[0].metadata.name}@3.0.0`), - 'No matching version found for @test/package-1@3.0.0', - ) -}) - -test('get packument', async (t) => { - const fixtures = await createFixtures() - - await publish(fixtures, fixtures.users[0], fixtures.packages[0], '1.0.0') - await publish(fixtures, fixtures.users[0], fixtures.packages[0], '2.0.0') - - t.snapshot( - getPackumentSnapshot( - await fixtures.client('packument')(fixtures.packages[0].metadata.name), - ), - ) -}) - -test('get tarball', async (t) => { - const fixtures = await createFixtures() - - await publish(fixtures, fixtures.users[0], fixtures.packages[0], '1.0.0') - await publish(fixtures, fixtures.users[0], fixtures.packages[0], '2.0.0') - - t.true( - (await fixtures.client('tarball')( - fixtures.packages[0].metadata.name, - )) instanceof Buffer, - ) - - t.true( - (await fixtures.client('tarball')( - `${fixtures.packages[0].metadata.name}@2.0.0`, - )) instanceof Buffer, - ) - - await t.throwsAsync( - fixtures.client('tarball')(`${fixtures.packages[0].metadata.name}@3.0.0`), - ) - await t.throwsAsync( - fixtures.client('tarball')(fixtures.packages[1].metadata.name), - ) -}) diff --git a/packages/emeralt-server/test/http/adduser.test.ts b/packages/emeralt-server/test/http/adduser.test.ts new file mode 100644 index 0000000..0f820dc --- /dev/null +++ b/packages/emeralt-server/test/http/adduser.test.ts @@ -0,0 +1,45 @@ +import { createTest } from '../utils/test' + +const test = createTest() + +test('adduser', async (t) => { + const { username, password } = t.context.fixtures.users[0] + + const res = await t.context.http.put(`/-/user/${username}`).send({ + name: username, + password: password, + }) + + t.deepEqual(res.status, 201) + t.is(res.body.ok, true) + t.is(res.body.id, username) + t.truthy(res.body.token) +}) + +test('adduser malformed', async (t) => { + const { username } = t.context.fixtures.users[0] + + await t.throwsAsync( + t.context.http.put(`/-/user/${username}`).send({ + name: username, + password: 'wrong-password', + }), + ) +}) + +test('adduser nonexistent', async (t) => { + const { password } = t.context.fixtures.users[0] + + await t.throwsAsync( + t.context.http.put(`/-/user/wrong-username`).send({ + name: 'wrong-username', + password: password, + }), + ) +}) + +test('adduser empty', async (t) => { + const { username } = t.context.fixtures.users[0] + + await t.throwsAsync(t.context.http.put(`/-/user/${username}`).send({})) +}) diff --git a/packages/emeralt-server/test/http/disable-endpoint.test.ts b/packages/emeralt-server/test/http/disable-endpoint.test.ts new file mode 100644 index 0000000..4071ccf --- /dev/null +++ b/packages/emeralt-server/test/http/disable-endpoint.test.ts @@ -0,0 +1,13 @@ +import { createTest } from '../utils/test' + +const test = createTest({ + serverConfig: { + endpoints: { + ping: false, + }, + }, +}) + +test('disable endpoint', async (t) => { + await t.throwsAsync(t.context.http.get('/-/ping')) +}) diff --git a/packages/emeralt-server/test/http/get.test.ts b/packages/emeralt-server/test/http/get.test.ts new file mode 100644 index 0000000..4f21f99 --- /dev/null +++ b/packages/emeralt-server/test/http/get.test.ts @@ -0,0 +1,35 @@ +import { createTest } from '../utils/test' + +const test = createTest() + +test.serial('publish two versions', async (t) => { + const token = t.context.fixtures.tokens[0] + const pkg = t.context.fixtures.packages[0] + + await t.context.http + .put(`/${encodeURIComponent(pkg.name)}`) + .set('authorization', `Bearer ${token}`) + .send(pkg) + + pkg.versions['2.0.0'] = pkg.versions['1.0.0'] + delete pkg.versions['1.0.0'] + + pkg.version = '2.0.0' + pkg.versions['2.0.0'].version = '2.0.0' + + await t.context.http + .put(`/${encodeURIComponent(pkg.name)}`) + .set('authorization', `Bearer ${token}`) + .send(pkg) + + t.pass() +}) + +test.serial('get', async (t) => { + const pkg = t.context.fixtures.packages[0] + + const res = await t.context.http.get(`/${encodeURIComponent(pkg.name)}`) + + t.deepEqual(res.status, 200) + t.snapshot(res.body) +}) diff --git a/packages/emeralt-server/test/http/ping.test.ts b/packages/emeralt-server/test/http/ping.test.ts new file mode 100644 index 0000000..d7a2a5e --- /dev/null +++ b/packages/emeralt-server/test/http/ping.test.ts @@ -0,0 +1,10 @@ +import { createTest } from '../utils/test' + +const test = createTest() + +test('ping', async (t) => { + const res = await t.context.http.get('/-/ping') + + t.deepEqual(res.status, 200) + t.deepEqual(res.body, {}) +}) diff --git a/packages/emeralt-server/test/http/publish.test.ts b/packages/emeralt-server/test/http/publish.test.ts new file mode 100644 index 0000000..ac99fbd --- /dev/null +++ b/packages/emeralt-server/test/http/publish.test.ts @@ -0,0 +1,55 @@ +import { createTest } from '../utils/test' + +const test = createTest() + +test.serial('publish unauthenticated', async (t) => { + const pkg = t.context.fixtures.packages[0] + + await t.throwsAsync( + t.context.http.put(`/${encodeURIComponent(pkg.name)}`).send(pkg), + ) +}) + +test.serial('publish', async (t) => { + const token = t.context.fixtures.tokens[0] + const pkg = t.context.fixtures.packages[0] + + const res = await t.context.http + .put(`/${encodeURIComponent(pkg.name)}`) + .set('authorization', `Bearer ${token}`) + .send(pkg) + + t.deepEqual(res.status, 200) + t.deepEqual(res.body, {}) +}) + +test.serial('publish existing', async (t) => { + const token = t.context.fixtures.tokens[0] + const pkg = t.context.fixtures.packages[0] + + await t.throwsAsync( + t.context.http + .put(`/${encodeURIComponent(pkg.name)}`) + .set('authorization', `Bearer ${token}`) + .send(pkg), + ) +}) + +test.serial('publish new version', async (t) => { + const token = t.context.fixtures.tokens[0] + const pkg = t.context.fixtures.packages[0] + + pkg.versions['2.0.0'] = pkg.versions['1.0.0'] + delete pkg.versions['1.0.0'] + + pkg.version = '2.0.0' + pkg.versions['2.0.0'].version = '2.0.0' + + const res = await t.context.http + .put(`/${encodeURIComponent(pkg.name)}`) + .set('authorization', `Bearer ${token}`) + .send(pkg) + + t.deepEqual(res.status, 200) + t.deepEqual(res.body, {}) +}) diff --git a/packages/emeralt-server/test/http/snapshots/get.test.ts.md b/packages/emeralt-server/test/http/snapshots/get.test.ts.md new file mode 100644 index 0000000..423114e --- /dev/null +++ b/packages/emeralt-server/test/http/snapshots/get.test.ts.md @@ -0,0 +1,37 @@ +# Snapshot report for `test/http/get.test.ts` + +The actual snapshot is saved in `get.test.ts.snap`. + +Generated by [AVA](https://ava.li). + +## get + +> Snapshot 1 + + { + _owner: 'user_1', + author: 'stackdumper', + name: '@test/package-1', + versions: { + '1.0.0': { + author: 'stackdumper', + dist: { + integrity: 'sha512-3a81oZNherrMQXNJriBBMRLm+k6JqX6iCp7u5ktV05ohkpkqJ0/BqDa6PCOj/uu9RU1EI2Q86A4qmslPpUyknw==', + shasum: '', + tarball: 'http://localhost:8080/-/tarball/%40test%2Fpackage-1/1.0.0', + }, + name: '@test/package-1', + version: '1.0.0', + }, + '2.0.0': { + author: 'stackdumper', + dist: { + integrity: 'sha512-3a81oZNherrMQXNJriBBMRLm+k6JqX6iCp7u5ktV05ohkpkqJ0/BqDa6PCOj/uu9RU1EI2Q86A4qmslPpUyknw==', + shasum: '', + tarball: 'http://localhost:8080/-/tarball/%40test%2Fpackage-1/2.0.0', + }, + name: '@test/package-1', + version: '2.0.0', + }, + }, + } diff --git a/packages/emeralt-server/test/http/snapshots/get.test.ts.snap b/packages/emeralt-server/test/http/snapshots/get.test.ts.snap new file mode 100644 index 0000000000000000000000000000000000000000..04dd682a2d8a5d967f1e5af3f6ca192fa4d4155e GIT binary patch literal 547 zcmV+;0^I#URzVT8YAifRH6M!z00000000B! zk~?n`K@i7h@8JaTh!JTcMTk%U&fPh-<5-Fm9D;;Jo>GuSV{M$3?{bel-|ofAC!j>M zRFP6pAWAB}0FQ!-o-Yt79W7&HpUFl7fkeegKi$sUe|Km8bF%huk2!>m;|icfi_`kZhUH=Yd=WVgQ*!jW$hm zASQlp@m|D|EKCJUT8=8BsdRZJx-2AZ`}=7avqVuE5e?ZWm|BrcNGnD$?XUu#dX11T zSmQ`AdB_ss@ksQ$!4yCanITFS+J!E(!BHhLKFW0F?Rk5U?);oC{z#))FEM?Ld_=w? zS2X1s{rok!#X-p;LXjSFqHZyN@9(dy!(!iS<6@0{Psl$r^qh8LXs7DQUzGLjUzU~4 z#JH^k+(X_VpLE4sL!F0l%K*58yhc74iad8=7P?Z%B`=b!lX&uIlxYc { + const { status, body } = await t.context.http.get('/-/sys/healthz') + + t.is(status, 200) + t.deepEqual(body, { + ok: true, + healthz: { + auth: { ok: true }, + database: { ok: true }, + storage: { ok: true }, + }, + }) +}) diff --git a/packages/emeralt-server/test/publish.test.ts b/packages/emeralt-server/test/publish.test.ts deleted file mode 100644 index 3497882..0000000 --- a/packages/emeralt-server/test/publish.test.ts +++ /dev/null @@ -1,31 +0,0 @@ -import test from 'ava' -import { createFixtures } from './fixtures' -import { publish } from './shortcuts' - -test('publish', async (t) => { - const fixtures = await createFixtures() - - t.true(await publish(fixtures, fixtures.users[0], fixtures.packages[0])) - t.true(await publish(fixtures, fixtures.users[0], fixtures.packages[1])) -}) - -test('publish existing', async (t) => { - const fixtures = await createFixtures() - - t.true(await publish(fixtures, fixtures.users[0], fixtures.packages[0])) - await t.throwsAsync( - publish(fixtures, fixtures.users[1], fixtures.packages[0]), - ) -}) - -test('publish unauthenticated', async (t) => { - const fixtures = await createFixtures() - - await t.throwsAsync( - publish( - fixtures, - { ...fixtures.users[0], password: 'wrong-password' }, - fixtures.packages[0], - ), - ) -}) diff --git a/packages/emeralt-server/test/shortcuts/adduser.ts b/packages/emeralt-server/test/shortcuts/adduser.ts deleted file mode 100644 index e83fd85..0000000 --- a/packages/emeralt-server/test/shortcuts/adduser.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Unpack, TUser } from '@emeralt/types' -import { createFixtures } from '../fixtures' - -export const adduser = ( - fixtures: Unpack>, - user?: TUser, -) => - fixtures.client('adduser')( - async () => fixtures.address, - async () => user || {}, - ) diff --git a/packages/emeralt-server/test/shortcuts/index.ts b/packages/emeralt-server/test/shortcuts/index.ts deleted file mode 100644 index 2442c13..0000000 --- a/packages/emeralt-server/test/shortcuts/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './adduser' -export * from './publish' diff --git a/packages/emeralt-server/test/shortcuts/publish.ts b/packages/emeralt-server/test/shortcuts/publish.ts deleted file mode 100644 index cc2af84..0000000 --- a/packages/emeralt-server/test/shortcuts/publish.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { adduser } from './adduser' -import { TFixtures } from '../fixtures' - -export const publish = async ( - fixtures: TFixtures, - user: typeof fixtures.users[0], - pkg: typeof fixtures.packages[0], - version?, -) => { - const { token } = await adduser(fixtures, user) - - if (version) { - pkg.metadata.version = version - } - - return fixtures.client('publish', { token })(pkg.metadata, pkg.tarball) -} diff --git a/packages/emeralt-server/test/snapshots/get.test.ts.md b/packages/emeralt-server/test/snapshots/get.test.ts.md deleted file mode 100644 index 6e08caa..0000000 --- a/packages/emeralt-server/test/snapshots/get.test.ts.md +++ /dev/null @@ -1,130 +0,0 @@ -# Snapshot report for `test/get.test.ts` - -The actual snapshot is saved in `get.test.ts.snap`. - -Generated by [AVA](https://ava.li). - -## get metadata - -> Snapshot 1 - - { - _id: '@test/package-1@2.0.0', - _integrity: 'skipped', - _resolved: 'skipped', - _shasum: 'skipped', - _shrinkwrap: null, - bin: null, - bundleDependencies: false, - cpu: undefined, - dependencies: {}, - deprecated: false, - devDependencies: {}, - engines: undefined, - name: '@test/package-1', - optionalDependencies: {}, - os: undefined, - peerDependencies: {}, - version: '2.0.0', - } - -> Snapshot 2 - - { - _id: '@test/package-1@1.0.0', - _integrity: 'skipped', - _resolved: 'skipped', - _shasum: 'skipped', - _shrinkwrap: null, - bin: null, - bundleDependencies: false, - cpu: undefined, - dependencies: {}, - deprecated: false, - devDependencies: {}, - engines: undefined, - name: '@test/package-1', - optionalDependencies: {}, - os: undefined, - peerDependencies: {}, - version: '1.0.0', - } - -> Snapshot 3 - - { - _id: '@test/package-1@2.0.0', - _integrity: 'skipped', - _resolved: 'skipped', - _shasum: 'skipped', - _shrinkwrap: null, - bin: null, - bundleDependencies: false, - cpu: undefined, - dependencies: {}, - deprecated: false, - devDependencies: {}, - engines: undefined, - name: '@test/package-1', - optionalDependencies: {}, - os: undefined, - peerDependencies: {}, - version: '2.0.0', - } - -## get packument - -> Snapshot 1 - - { - _cached: false, - _contentLength: 0, - _id: '@test/package-1', - _owner: 'skipped', - description: '', - 'dist-tags': { - latest: '2.0.0', - }, - name: '@test/package-1', - readme: '', - versions: [ - { - _id: '@test/package-1@1.0.0', - _nodeVersion: 'skipped', - author: 'emeralt@emeralt.emeralt', - description: '', - dist: { - integrity: 'skipped', - shasum: 'skipped', - tarball: 'skipped', - }, - keywords: [], - license: 'ISC', - main: 'index.js', - name: '@test/package-1', - scripts: { - test: 'echo "Error: no test specified" && exit 1', - }, - version: '1.0.0', - }, - { - _id: '@test/package-1@2.0.0', - _nodeVersion: 'skipped', - author: 'emeralt@emeralt.emeralt', - description: '', - dist: { - integrity: 'skipped', - shasum: 'skipped', - tarball: 'skipped', - }, - keywords: [], - license: 'ISC', - main: 'index.js', - name: '@test/package-1', - scripts: { - test: 'echo "Error: no test specified" && exit 1', - }, - version: '2.0.0', - }, - ], - } diff --git a/packages/emeralt-server/test/snapshots/get.test.ts.snap b/packages/emeralt-server/test/snapshots/get.test.ts.snap deleted file mode 100644 index 191864d84b0fa3c8f513360b6460452a053c30f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 999 zcmV8b6AtZZnAsG!Amw|gGPdaN`*jQwifcsTd_=e6(Nd-K%o8eH}>f0r&gy=J9S zVSIw|JmY1^Xfs@A+??W;;|jMrV zPDR3Ph!vV!P(*W1xDk--Egm=gC?ZdhDtZ*V(vK2947z<-bCUCSu)iIlyywTsTq0It zMcW8OiwJBxgpS;Sr^8N-UW?E>v5jQp$~vDSaYHrEY}u>zRUx}xSeDa9t& zcUt9gIrRlst!aw3wL5>!#rf0orx`E6F^m^EKc=O@fL4H3TixcRyJ&t3wn0^A>@wH{ zH^Ck7J@^AW1HYXy6ypum_|g@K2=G4m8f=53CS!Bp1+WTkf-k{+Q<=^l2)E*pSUIBj zW@(|b-#&$s6NDaJ?zmw@+~mYsQV)C4b(C5pMKf9Ie&@U2gGSpUb2ku-cC@9vCvuta zXwc?HC_Oa-RJ8xNrU3n<|cShSR@W-2$gFVp1uG7U1<8&G%D zDJ=E!8(R?h1l$LIsp9!zD;CrhpT(2*oUKez9LNv4avXUd&&`VTlg&}l6xT(()*2yY zB|_FjvpFcXNBT9g$@e6=^{{&Uf|Q|rz8Zwp_Fy%R$n~%K1{~0XQdw$Th%ThNmI`b9u-KA#2 zG<%EYkoB}M&TjNXM!gad$zi7MmqCZuY5k-6&{4Ha8j^|+`z_k5#v0$E@h#e~N*v#! V@mn;$MgPsW=pO?wjJ1gp003-Y^H~4@ diff --git a/packages/emeralt-server/test/sys.test.ts b/packages/emeralt-server/test/sys.test.ts deleted file mode 100644 index 2b19cad..0000000 --- a/packages/emeralt-server/test/sys.test.ts +++ /dev/null @@ -1,22 +0,0 @@ -import test from 'ava' -import supertest from 'supertest' -import { createFixtures } from './fixtures' -import { endpoints } from '../src/constants' - -test('sys healthz', async (t) => { - const fixtures = await createFixtures() - - const { status, body } = await supertest(fixtures.server).get( - endpoints.sys.healthz, - ) - - t.is(status, 200) - t.deepEqual(body, { - ok: true, - healthz: { - auth: { ok: true }, - database: { ok: true }, - storage: { ok: true }, - }, - }) -}) diff --git a/packages/emeralt-server/test/utils/fixtures.ts b/packages/emeralt-server/test/utils/fixtures.ts new file mode 100644 index 0000000..90cc96e --- /dev/null +++ b/packages/emeralt-server/test/utils/fixtures.ts @@ -0,0 +1,46 @@ +import jwt from 'jsonwebtoken' +import ssri from 'ssri' + +import { TUser, TMetadata } from '@emeralt/types' + +export const createTestFixtures = (): { + users: TUser[] + packages: TMetadata[] + tokens: string[] +} => ({ + users: [1, 2].map((i) => ({ + username: `user_${i}`, + password: `password_${i}`, + email: `user_${i}@emeralt.org`, + })), + + tokens: [1, 2].map((i) => jwt.sign({ username: `user_${i}` }, 'secret')), + + // @ts-ignore + packages: [1, 2].map((i) => ({ + name: `@test/package-${i}`, + version: `1.0.0`, + author: 'stackdumper', + + versions: { + '1.0.0': { + name: `@test/package-${i}`, + version: `1.0.0`, + author: 'stackdumper', + + dist: { + shasum: '', + tarball: '', + integrity: ssri.fromData('abc').toString(), + }, + }, + }, + + _attachments: { + [`@test/package-${1}-1.0.0.tar.gz`]: { + content_type: 'application/octet-stream', + data: Buffer.from('abc').toString('base64'), + }, + }, + })), +}) diff --git a/packages/emeralt-server/test/fixtures/server.ts b/packages/emeralt-server/test/utils/server.ts similarity index 51% rename from packages/emeralt-server/test/fixtures/server.ts rename to packages/emeralt-server/test/utils/server.ts index f1530da..b9ce51a 100644 --- a/packages/emeralt-server/test/fixtures/server.ts +++ b/packages/emeralt-server/test/utils/server.ts @@ -1,32 +1,25 @@ import { TUser, TEmeraltServerConfig } from '@emeralt/types' -import { createEmeraltServer } from '../../src/server' +import deepmerge from 'deepmerge' + import { EmeraltAuthInMemory } from '@emeralt/auth-inmemory' import { EmeraltDatabaseInMemory } from '@emeralt/database-inmemory' import { EmeraltStorageInMemory } from '@emeralt/storage-inmemory' -export const createServer = ( - config: TEmeraltServerConfig = {}, - users: TUser[] = [], +import { createEmeraltServer } from '../../src' +import { emeraltServerDefaultConfig } from '../../src/config' + +export const createTestServer = ( + config: TEmeraltServerConfig, + users: TUser[], ) => createEmeraltServer({ - config: { - logLevel: 'silent', - ...config, - }, + config: deepmerge(emeraltServerDefaultConfig, config || {}), auth: EmeraltAuthInMemory({ users: users.reduce( - (acc, cur) => ({ - ...acc, - [cur.username]: cur.password, - }), + (acc, cur) => Object.assign({}, acc, { [cur.username]: cur.password }), {}, ), }), database: EmeraltDatabaseInMemory({}), storage: EmeraltStorageInMemory({}), - }).then((s) => - s.listen(() => { - // @ts-ignore - s._setConfig('url', `http://localhost:${s.address().port}`) - }), - ) + }).then((t) => t.listen()) diff --git a/packages/emeralt-server/test/utils/test.ts b/packages/emeralt-server/test/utils/test.ts new file mode 100644 index 0000000..3dd5ca7 --- /dev/null +++ b/packages/emeralt-server/test/utils/test.ts @@ -0,0 +1,32 @@ +import { Unpack, TEmeraltServerConfig } from '@emeralt/types' + +import { TestInterface } from 'ava' +import supertest from 'supertest' + +import { createTestServer } from './server' +import { createTestFixtures } from './fixtures' + +interface Options { + serverConfig?: TEmeraltServerConfig +} + +export const createTest = (options: Options = {}) => { + const test = require('ava') as TestInterface<{ + server: Unpack> + fixtures: ReturnType + http: ReturnType + }> + + test.before(async (t) => { + t.context.fixtures = createTestFixtures() + t.context.server = await createTestServer( + options.serverConfig, + t.context.fixtures.users, + ) + t.context.http = supertest(t.context.server) + + t.pass() + }) + + return test +} diff --git a/packages/emeralt-types/src/emeralt/server.ts b/packages/emeralt-types/src/emeralt/server.ts index b2bb326..dbb0e93 100644 --- a/packages/emeralt-types/src/emeralt/server.ts +++ b/packages/emeralt-types/src/emeralt/server.ts @@ -6,7 +6,7 @@ import { CEmeraltDatabase } from './database' import { CEmeraltStorage } from './storage' export type TEmeraltServerConfig = { - logLevel?: 'combined' | 'common' | 'dev' | 'short' | 'tiny' | 'silent' + logLevel?: 'silent' | 'dev' | 'production' jwt?: { secret?: string } @@ -61,7 +61,7 @@ export type TEmeraltHandlerParams = TEmeraltServerParamsInternal & { } export type TDecodedToken = { - name: string + username: string iat?: number exp?: number } diff --git a/packages/emeralt-types/src/npm/metadata.ts b/packages/emeralt-types/src/npm/metadata.ts index d4d5fdb..1b11107 100644 --- a/packages/emeralt-types/src/npm/metadata.ts +++ b/packages/emeralt-types/src/npm/metadata.ts @@ -3,10 +3,10 @@ import { TVersion } from './version' export type TMetadata = { name: string - author: Person version: string - - main: string + + author?: Person + main?: string // all versions versions?: { @@ -41,7 +41,7 @@ export type TMetadata = { } } - _owner: string // username (emeralt) + _owner?: string // username (emeralt) [key: string]: any } diff --git a/yarn.lock b/yarn.lock index f4fffb1..fed5399 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2247,14 +2247,6 @@ caseless@~0.12.0: resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= -casual@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/casual/-/casual-1.6.0.tgz#30dff7d3202a60ec5da9e36296a58dac62f14ae4" - integrity sha512-UmOIqc09KMrGIOKbLsb8GfPHDW8E+hdI1AjmJ8BYhQazTj8BHX3y6zEXj5lT7v7T4ZBkO180HXXF8ZACf3qANA== - dependencies: - mersenne-twister "^1.0.1" - moment "^2.15.2" - chalk@2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.1.tgz#523fe2678aec7b04e8041909292fe8b17059b796" @@ -3340,6 +3332,13 @@ expand-range@^1.8.1: dependencies: fill-range "^2.1.0" +express-pino-logger@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/express-pino-logger/-/express-pino-logger-4.0.0.tgz#775cf253a4e0e7ee2c24804f8a32900d6d0168ca" + integrity sha512-BTJwjQXMSR6tFiyvTOOr6aosJkJOuJpW0mXE+icv3ae/0WXBGnLaumINGHJvWMuDO1RSLHBLfRrJaghMjMhVrg== + dependencies: + pino-http "^4.0.0" + express@^4.16.4: version "4.16.4" resolved "https://registry.yarnpkg.com/express/-/express-4.16.4.tgz#fddef61926109e24c515ea97fd2f1bdbf62df12e" @@ -3463,6 +3462,16 @@ fast-json-stable-stringify@^2.0.0: resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= +fast-redact@^1.4.2: + version "1.4.4" + resolved "https://registry.npmjs.org/fast-redact/-/fast-redact-1.4.4.tgz#d29bd1d0cc3ab808a9d4f9870f6e27e85c750db4" + integrity sha512-QOQZ8sDDQPZMJ6x6zlm6hLZ2cjPDqfN3R/AYnAbM+yy8VNPvOnVXdUF/E/xbMv7g44c1krhWuzgjH2u0V5Vhsg== + +fast-safe-stringify@^2.0.6: + version "2.0.6" + resolved "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.6.tgz#04b26106cc56681f51a044cfc0d76cf0008ac2c2" + integrity sha512-q8BZ89jjc+mz08rSxROs8VsrBBcn1SIw1kq9NjolL509tkABRk9io01RAjSaEv1Xb2uFLt8VtRiZbGp5H8iDtg== + fast-text-encoding@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fast-text-encoding/-/fast-text-encoding-1.0.0.tgz#3e5ce8293409cfaa7177a71b9ca84e1b1e6f25ef" @@ -3563,6 +3572,11 @@ find-up@^3.0.0: dependencies: locate-path "^3.0.0" +flatstr@^1.0.9: + version "1.0.9" + resolved "https://registry.npmjs.org/flatstr/-/flatstr-1.0.9.tgz#0950d56fec02de1030c1311847ecd58c25690eb9" + integrity sha512-qFlJnOBWDfIaunF54/lBqNKmXOI0HqNhu+mHkLmbaBXlS71PUd9OjFOdyevHt/aHoHB1+eW7eKHgRKOG5aHSpw== + flexbuffer@0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/flexbuffer/-/flexbuffer-0.0.6.tgz#039fdf23f8823e440c38f3277e6fef1174215b30" @@ -5612,11 +5626,6 @@ merge2@^1.2.3: resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.2.3.tgz#7ee99dbd69bb6481689253f018488a1b902b0ed5" integrity sha512-gdUU1Fwj5ep4kplwcmftruWofEFt6lfpkkr3h860CXbAB9c3hGb55EOL2ali0Td5oebvW0E1+3Sr+Ur7XfKpRA== -mersenne-twister@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/mersenne-twister/-/mersenne-twister-1.1.0.tgz#f916618ee43d7179efcf641bec4531eb9670978a" - integrity sha1-+RZhjuQ9cXnvz2Qb7EUx65Zwl4o= - methods@^1.1.1, methods@^1.1.2, methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" @@ -5768,11 +5777,6 @@ modify-values@^1.0.0: resolved "https://registry.yarnpkg.com/modify-values/-/modify-values-1.0.1.tgz#b3939fa605546474e3e3e3c63d64bd43b4ee6022" integrity sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw== -moment@^2.15.2: - version "2.24.0" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.24.0.tgz#0d055d53f5052aa653c9f6eb68bb5d12bf5c2b5b" - integrity sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg== - mongodb-core@3.1.11: version "3.1.11" resolved "https://registry.yarnpkg.com/mongodb-core/-/mongodb-core-3.1.11.tgz#b253038dbb4d7329f3d1c2ee5400bb0c9221fde5" @@ -6592,6 +6596,31 @@ pinkie@^2.0.0: resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= +pino-http@^4.0.0: + version "4.1.0" + resolved "https://registry.npmjs.org/pino-http/-/pino-http-4.1.0.tgz#e2dca663712d1e437311be2d5796c76736744cfe" + integrity sha512-IRmQMLFK2M/N05T+yitm7IL1duTjs5YlsfVCV6Pm5akFl6mIbr/fx9K2F4JZtEiwRFfyGb1A9MRJ/YhKd+3TUw== + dependencies: + pino "^5.0.0" + pino-std-serializers "^2.1.0" + +pino-std-serializers@^2.1.0, pino-std-serializers@^2.3.0: + version "2.3.0" + resolved "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-2.3.0.tgz#34eeaab97c055c28e22c0542ae55978e7e427786" + integrity sha512-klfGoOsP6sJH7ON796G4xoUSx2fkpFgKHO4YVVO2zmz31jR+etzc/QzGJILaOIiCD6HTCFgkPx+XN8nk+ruqPw== + +pino@^5.0.0: + version "5.11.1" + resolved "https://registry.npmjs.org/pino/-/pino-5.11.1.tgz#2d6d8edb7ebc7c354be03bfa04fd436352e1d67b" + integrity sha512-NIua0mGb9Adknq35ONvQmvh93LCUVUjp2+1q1EcvIkJmpJnSd3E5rHVKlKNjzMXFl/z3fI+QA0xXCjPEKNiLvQ== + dependencies: + fast-redact "^1.4.2" + fast-safe-stringify "^2.0.6" + flatstr "^1.0.9" + pino-std-serializers "^2.3.0" + quick-format-unescaped "^3.0.0" + sonic-boom "^0.7.1" + pkg-conf@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pkg-conf/-/pkg-conf-3.0.0.tgz#41f836458fb83b080e08e62b2d63a68aa8c436df" @@ -6801,6 +6830,11 @@ qs@^6.6.0: resolved "https://registry.yarnpkg.com/qs/-/qs-6.6.0.tgz#a99c0f69a8d26bf7ef012f871cdabb0aee4424c2" integrity sha512-KIJqT9jQJDQx5h5uAVPimw6yVg2SekOKu959OCtktD3FjzbpvaPr8i4zzg07DOMz+igA4W/aNM7OV8H37pFYfA== +quick-format-unescaped@^3.0.0: + version "3.0.2" + resolved "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-3.0.2.tgz#0137e94d8fb37ffeb70040535111c378e75396fb" + integrity sha512-FXTaCkwvpIlkdKeGDNgcq07SXWS383noQUuZjvdE1QcTt+eLuqof6/BDiEPqB59FWLie/l91+HtlJSw7iCViSA== + quick-lru@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-1.1.0.tgz#4360b17c61136ad38078397ff11416e186dcfbb8" @@ -7577,6 +7611,13 @@ socks@~2.2.0: ip "^1.1.5" smart-buffer "4.0.2" +sonic-boom@^0.7.1: + version "0.7.3" + resolved "https://registry.npmjs.org/sonic-boom/-/sonic-boom-0.7.3.tgz#cbfc18e87c2b8078b00e38ad9475c05fce5ea696" + integrity sha512-A9EyoIeLD+g9vMLYQKjNCatJtAKdBQMW03+L8ZWWX/A6hq+srRCwdqHrBD1R8oSMLXov3oHN13dljtZf12q2Ow== + dependencies: + flatstr "^1.0.9" + sort-keys@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-2.0.0.tgz#658535584861ec97d730d6cf41822e1f56684128" From 037627c03bd2212adcc27d05e273cf9fd0577f81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C2=A0stackdumper?= Date: Fri, 22 Mar 2019 18:58:49 +0200 Subject: [PATCH 7/7] test(server): add tests for dist-tags --- .../test/http/dist-tags.test.ts | 65 ++++++++++++++++++ .../test/http/snapshots/get.test.ts.md | 3 + .../test/http/snapshots/get.test.ts.snap | Bin 547 -> 585 bytes .../emeralt-server/test/utils/fixtures.ts | 4 ++ packages/emeralt-types/src/npm/metadata.ts | 2 +- 5 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 packages/emeralt-server/test/http/dist-tags.test.ts diff --git a/packages/emeralt-server/test/http/dist-tags.test.ts b/packages/emeralt-server/test/http/dist-tags.test.ts new file mode 100644 index 0000000..6295516 --- /dev/null +++ b/packages/emeralt-server/test/http/dist-tags.test.ts @@ -0,0 +1,65 @@ +import { createTest } from '../utils/test' + +const test = createTest() + +test.serial('publish package', async (t) => { + const token = t.context.fixtures.tokens[0] + const pkg = t.context.fixtures.packages[0] + + const res = await t.context.http + .put(`/${encodeURIComponent(pkg.name)}`) + .set('authorization', `Bearer ${token}`) + .send(pkg) + + t.is(res.status, 200) +}) + +test.serial('create', async (t) => { + const token = t.context.fixtures.tokens[0] + const pkg = t.context.fixtures.packages[0] + + const res = await t.context.http + .put(`/-/package/${encodeURIComponent(pkg.name)}/dist-tags/test`) + .set('Content-Type', 'application/json') + .send('1.0.0-rc.1') + .set('authorization', `Bearer ${token}`) + + t.deepEqual(res.status, 200) + t.deepEqual(res.body, { ok: true }) +}) + +test.serial('get', async (t) => { + const token = t.context.fixtures.tokens[0] + const pkg = t.context.fixtures.packages[0] + + const res = await t.context.http + .get(`/-/package/${encodeURIComponent(pkg.name)}/dist-tags`) + .set('authorization', `Bearer ${token}`) + + t.deepEqual(res.status, 200) + t.deepEqual(res.body, { + latest: '1.0.0', + test: '1.0.0-rc.1', + }) +}) + +test.serial('delete', async (t) => { + const token = t.context.fixtures.tokens[0] + const pkg = t.context.fixtures.packages[0] + + const res = await t.context.http + .delete(`/-/package/${encodeURIComponent(pkg.name)}/dist-tags/test`) + .set('authorization', `Bearer ${token}`) + + t.deepEqual(res.status, 200) + t.deepEqual(res.body, { ok: true }) + + // check if dist-tag is deleted + const { body } = await t.context.http + .get(`/-/package/${encodeURIComponent(pkg.name)}/dist-tags`) + .set('authorization', `Bearer ${token}`) + + t.deepEqual(body, { + latest: '1.0.0', + }) +}) diff --git a/packages/emeralt-server/test/http/snapshots/get.test.ts.md b/packages/emeralt-server/test/http/snapshots/get.test.ts.md index 423114e..8d88e64 100644 --- a/packages/emeralt-server/test/http/snapshots/get.test.ts.md +++ b/packages/emeralt-server/test/http/snapshots/get.test.ts.md @@ -11,6 +11,9 @@ Generated by [AVA](https://ava.li). { _owner: 'user_1', author: 'stackdumper', + 'dist-tags': { + latest: '1.0.0', + }, name: '@test/package-1', versions: { '1.0.0': { diff --git a/packages/emeralt-server/test/http/snapshots/get.test.ts.snap b/packages/emeralt-server/test/http/snapshots/get.test.ts.snap index 04dd682a2d8a5d967f1e5af3f6ca192fa4d4155e..78d2486275b0465464f11ddd9f51881e8884f7ee 100644 GIT binary patch literal 585 zcmV-P0=E4@RzV_gUVJRv2;SI?a%}#RS~2QiKvgXQc=Vb-KJNu>t}qgTUBCbV&EYL z!~g=R8ymj^F(L5>n2;Fw0UVpyX>V9EFk$JFea`uO?sv{--$V#u^y$ajv-R%#)@Sah6_6fN3_o|&L7L=GQw97RuP^B zj&vQ%5J0&XocJ`#!p{8Xu{m8CKeW$|e?ulP(Td!g2_dW5839Do^YI zizB)uQIv(Mv8XTVDN{P9x`fqB5<+D_6VL%XmIOhHs9k*rlrz8= z!1shM3$GL=W>BWI$&|-pmBgm$9J;_Qj{Nz{!lsoq_?NPBPn1`1%p1TB1)*g{SgtDi zp}YjjYrs7GcMVmb7bm=s1tBxG&*>nt`DvEvF^klUYUMUDjo{I?MWbkIx4Yer>{e@Q zZ_~Tw)Z4>u-Chmv#5IRM)N6s|gwC+7YpvlLsdrX)jV{Rwh zKXv?*l@)R8a2$)hQHaDnaS|O6*UjRF#d+A&G&krI*9sVKn!2fL6>Y@R7MAp6@e9?B XeD&Jc^8a!A^vn7Utt@#HvIPJD*qa&a literal 547 zcmV+;0^I#URzVT8YAifRH6M!z00000000B! zk~?n`K@i7h@8JaTh!JTcMTk%U&fPh-<5-Fm9D;;Jo>GuSV{M$3?{bel-|ofAC!j>M zRFP6pAWAB}0FQ!-o-Yt79W7&HpUFl7fkeegKi$sUe|Km8bF%huk2!>m;|icfi_`kZhUH=Yd=WVgQ*!jW$hm zASQlp@m|D|EKCJUT8=8BsdRZJx-2AZ`}=7avqVuE5e?ZWm|BrcNGnD$?XUu#dX11T zSmQ`AdB_ss@ksQ$!4yCanITFS+J!E(!BHhLKFW0F?Rk5U?);oC{z#))FEM?Ld_=w? zS2X1s{rok!#X-p;LXjSFqHZyN@9(dy!(!iS<6@0{Psl$r^qh8LXs7DQUzGLjUzU~4 z#JH^k+(X_VpLE4sL!F0l%K*58yhc74iad8=7P?Z%B`=b!lX&uIlxYc