feat: migrate readme to fastify (#2613)

* feat: migrate readme to fastify

* Update readme.ts
This commit is contained in:
Diana Morales 2021-10-31 15:00:04 +01:00 committed by GitHub
parent d390a66158
commit 41475949ba
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 80 additions and 0 deletions

View File

@ -41,6 +41,7 @@
"@verdaccio/store": "workspace:6.0.0-6-next.15", "@verdaccio/store": "workspace:6.0.0-6-next.15",
"@verdaccio/tarball": "workspace:11.0.0-6-next.9", "@verdaccio/tarball": "workspace:11.0.0-6-next.9",
"@verdaccio/utils": "workspace:6.0.0-6-next.8", "@verdaccio/utils": "workspace:6.0.0-6-next.8",
"@verdaccio/readme": "workspace:11.0.0-6-next.4",
"abortcontroller-polyfill": "1.7.3", "abortcontroller-polyfill": "1.7.3",
"core-js": "3.17.2", "core-js": "3.17.2",
"debug": "4.3.2", "debug": "4.3.2",

View File

@ -0,0 +1,75 @@
import buildDebug from 'debug';
import { FastifyInstance } from 'fastify';
import _ from 'lodash';
import sanitizyReadme from '@verdaccio/readme';
const debug = buildDebug('verdaccio:api:whoami');
export const NOT_README_FOUND = 'ERROR: No README data found!';
function getReadme(fastify: FastifyInstance, request: any, packageName, callback) {
fastify.storage.getPackage({
name: packageName,
uplinksLook: true,
req: request.raw,
callback: function (err, readme): void {
debug('readme pkg %o', readme?.name);
if (err) {
callback(err);
return;
}
try {
const parsedReadme = parseReadme(readme.name, readme.readme);
callback(null, parsedReadme);
} catch {
callback(fastify.statusCode.NOT_FOUND).send(err);
}
},
});
}
async function readmeRoute(fastify: FastifyInstance) {
fastify.get('/package/readme/:packageName', async (request, reply) => {
// @ts-ignore
const { version, packageName } = request.params;
debug('readme name %s version: %s', packageName, version);
getReadme(fastify, request, packageName, (err, readme) => {
if (err) {
reply.send(err);
} else {
reply.code(fastify.statusCode.OK).send(readme);
}
});
});
fastify.get('/package/readme/:scope/:packageName', async (request, reply) => {
// @ts-ignore
const { scope, packageName } = request.params;
const packageNameScope = scope ? `${scope}/${packageName}` : packageName;
debug('readme name %s', packageName);
debug('readme endpoint scope:%s pkg: %s', scope, packageName);
getReadme(fastify, request, packageNameScope, (err, readme) => {
if (err) {
reply.send(err);
} else {
reply.code(fastify.statusCode.OK).send(readme);
}
});
});
}
export default readmeRoute;
/**
* parse package readme - markdown/ascii
* @param {String} packageName name of package
* @param {String} readme package readme
* @return {String} converted html template
*/
export function parseReadme(packageName: string, readme: string): string | void {
if (_.isEmpty(readme) === false) {
debug('sanizity readme');
return sanitizyReadme(readme);
}
throw new Error('ERROR: No README data found!');
}

View File

@ -13,6 +13,7 @@ import authPlugin from './plugins/auth';
import configPlugin from './plugins/config'; import configPlugin from './plugins/config';
import coreUtils from './plugins/coreUtils'; import coreUtils from './plugins/coreUtils';
import storagePlugin from './plugins/storage'; import storagePlugin from './plugins/storage';
import readme from './routes/web/api/readme';
const debug = buildDebug('verdaccio:fastify'); const debug = buildDebug('verdaccio:fastify');
@ -34,6 +35,7 @@ async function startServer({ logger, config }) {
instance.register(search); instance.register(search);
instance.register(whoami); instance.register(whoami);
instance.register(tarball); instance.register(tarball);
instance.register(readme, { prefix: '/-/verdaccio' });
done(); done();
}); });

View File

@ -356,6 +356,7 @@ importers:
'@verdaccio/config': workspace:6.0.0-6-next.10 '@verdaccio/config': workspace:6.0.0-6-next.10
'@verdaccio/core': workspace:6.0.0-6-next.3 '@verdaccio/core': workspace:6.0.0-6-next.3
'@verdaccio/logger': workspace:6.0.0-6-next.7 '@verdaccio/logger': workspace:6.0.0-6-next.7
'@verdaccio/readme': workspace:11.0.0-6-next.4
'@verdaccio/store': workspace:6.0.0-6-next.15 '@verdaccio/store': workspace:6.0.0-6-next.15
'@verdaccio/tarball': workspace:11.0.0-6-next.9 '@verdaccio/tarball': workspace:11.0.0-6-next.9
'@verdaccio/types': workspace:11.0.0-6-next.9 '@verdaccio/types': workspace:11.0.0-6-next.9
@ -373,6 +374,7 @@ importers:
'@verdaccio/config': link:../../config '@verdaccio/config': link:../../config
'@verdaccio/core': link:../core '@verdaccio/core': link:../core
'@verdaccio/logger': link:../../logger '@verdaccio/logger': link:../../logger
'@verdaccio/readme': link:../readme
'@verdaccio/store': link:../../store '@verdaccio/store': link:../../store
'@verdaccio/tarball': link:../tarball '@verdaccio/tarball': link:../tarball
'@verdaccio/utils': link:../../utils '@verdaccio/utils': link:../../utils