Skip to content

Commit

Permalink
Merge branch 'master' into fix/proxy-mode
Browse files Browse the repository at this point in the history
  • Loading branch information
hezhengxu2018 authored Nov 4, 2024
2 parents 1f1c9ad + 2edbec6 commit c24cc61
Show file tree
Hide file tree
Showing 4 changed files with 78 additions and 2 deletions.
7 changes: 7 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,12 @@
# Changelog

## [3.66.0](https://github.com/cnpm/cnpmcore/compare/v3.65.0...v3.66.0) (2024-11-03)


### Features

* compatible verdaccio path style ([#723](https://github.com/cnpm/cnpmcore/issues/723)) ([7158e66](https://github.com/cnpm/cnpmcore/commit/7158e66c9f09af76144beff28aa1899510080f4b))

## [3.65.0](https://github.com/cnpm/cnpmcore/compare/v3.64.0...v3.65.0) (2024-10-26)


Expand Down
20 changes: 20 additions & 0 deletions app/port/controller/package/DownloadPackageVersionTar.ts
Original file line number Diff line number Diff line change
Expand Up @@ -133,4 +133,24 @@ export class DownloadPackageVersionTarController extends AbstractController {
});
return res;
}

// Compatible Verdaccio path style

@HTTPMethod({
// GET /:fullname/-/:scope/:filenameWithVersion.tgz
path: `/:fullname(${FULLNAME_REG_STRING})/-/:scope/:filenameWithVersion.tgz`,
method: HTTPMethodEnum.OPTIONS,
})
async downloadVerdaccioPathStyleorOptions(@Context() ctx: EggContext) {
return this.downloadForOptions(ctx);
}

@HTTPMethod({
// GET /:fullname/-/:scope/:filenameWithVersion.tgz
path: `/:fullname(${FULLNAME_REG_STRING})/-/:scope/:filenameWithVersion.tgz`,
method: HTTPMethodEnum.GET,
})
async downloadVerdaccioPathStyle(@Context() ctx: EggContext, @HTTPParam() fullname: string, @HTTPParam() filenameWithVersion: string) {
return this.download(ctx, fullname, filenameWithVersion);
}
}
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "cnpmcore",
"version": "3.65.0",
"version": "3.66.0",
"description": "npm core",
"files": [
"dist/**/*"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,9 @@ describe('test/port/controller/package/DownloadPackageVersionTarController.test.
nfsClientAdapter = await app.getEggObject(NFSClientAdapter);
});

const scopedName = '@cnpm/testmodule-download-version-tar';
const scope = '@cnpm';
const name = 'testmodule-download-version-tar';
const scopedName = `${scope}/${name}`;
beforeEach(async () => {
mock(app.config.cnpmcore, 'allowPublishNonScopePackage', true);
let pkg = await TestUtil.getFullPackage({ name, version: '1.0.0' });
Expand Down Expand Up @@ -367,4 +368,52 @@ describe('test/port/controller/package/DownloadPackageVersionTarController.test.
assert(res.body.error === `[NOT_FOUND] "${name}-1.0.0.tgz" not found`);
});
});

describe('[GET /:fullname/-/:scope/:name-:version.tgz] download()', () => {
it('should download a version tar redirect to mock cdn success', async () => {
mock(nfsClientAdapter, 'url', async (storeKey: string) => {
// console.log('call url: ', storeKey);
return `https://cdn.mock.com${storeKey}`;
});
let res = await app.httpRequest()
.get(`/${name}/-/${scope}/${name}-1.0.0.tgz`);
assert(res.status === 302);
assert(res.headers.location === `https://cdn.mock.com/packages/${name}/1.0.0/${name}-1.0.0.tgz`);
res = await app.httpRequest()
.get(`/${scopedName}/-/${scope}/${name}-1.0.0.tgz`);
assert(res.status === 302);
assert(res.headers.location === `https://cdn.mock.com/packages/${scopedName}/1.0.0/${name}-1.0.0.tgz`);
});

it('should download a version tar with streaming success', async () => {
mock(nfsClientAdapter, 'url', 'not-function');
const res = await app.httpRequest()
.get(`/${name}/-/${scope}/${name}-1.0.0.tgz`);
assert(res.status === 200);
assert(res.headers['content-type'] === 'application/octet-stream');
assert(res.headers['content-disposition'] === `attachment; filename="${name}-1.0.0.tgz"`);

await app.httpRequest()
.get(`/${scopedName}/-/${scope}/${name}-1.0.0.tgz`);
assert(res.status === 200);
assert(res.headers['content-type'] === 'application/octet-stream');
assert(res.headers['content-disposition'] === `attachment; filename="${name}-1.0.0.tgz"`);
});

it('should mock getDownloadUrlOrStream return undefined', async () => {
mock(nfsClientAdapter, 'createDownloadStream', async () => {
return undefined;
});
if (process.env.CNPMCORE_NFS_TYPE === 'oss') {
mock(nfsClientAdapter, 'url', async () => {
return undefined;
});
}
const res = await app.httpRequest()
.get(`/${name}/-/${scope}/${name}-1.0.0.tgz`);
assert(res.status === 404);
assert(res.headers['content-type'] === 'application/json; charset=utf-8');
assert(res.body.error === `[NOT_FOUND] "${name}-1.0.0.tgz" not found`);
});
});
});

0 comments on commit c24cc61

Please sign in to comment.