Skip to content
This repository was archived by the owner on Jun 2, 2024. It is now read-only.

feat: add missing abbreviated meta attibutes #1668

Merged
merged 8 commits into from
Sep 27, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions controllers/registry/package/list.js
Original file line number Diff line number Diff line change
Expand Up @@ -391,10 +391,14 @@ function* handleAbbreviatedMetaRequestWithFullMeta(ctx, name, modifiedTime, tags
devDependencies: row.package.devDependencies,
bundleDependencies: row.package.bundleDependencies,
peerDependencies: row.package.peerDependencies,
peerDependenciesMeta: row.package.peerDependenciesMeta,
bin: row.package.bin,
os: row.package.os,
cpu: row.package.cpu,
directories: row.package.directories,
dist: row.package.dist,
engines: row.package.engines,
workspaces: row.package.workspaces,
_hasShrinkwrap: row.package._hasShrinkwrap,
publish_time: row.package.publish_time || row.publish_time,
};
Expand Down
54 changes: 44 additions & 10 deletions controllers/sync_module_worker.js
Original file line number Diff line number Diff line change
Expand Up @@ -863,8 +863,26 @@ SyncModuleWorker.prototype._sync = function* (name, pkg) {
var versions = data && data.versions || {};
for (var version in versions) {
const item = versions[version];
if (item && typeof item._hasShrinkwrap === 'boolean') {
remoteAbbreviatedMetadatas[version] = { _hasShrinkwrap: item._hasShrinkwrap };
if (!item) {
continue;
}
let hasMetaData = false;
const metaData = {};
// _hasShrinkwrap maybe undefined, dont change it
if (typeof item._hasShrinkwrap === 'boolean') {
hasMetaData = true;
metaData._hasShrinkwrap = item._hasShrinkwrap;
}

const metaDataKeys = [ 'peerDependenciesMeta', 'os', 'cpu', 'workspaces' ];
for (const key of metaDataKeys) {
if (key in item) {
hasMetaData = true;
metaData[key] = item[key];
}
}
if (hasMetaData) {
remoteAbbreviatedMetadatas[version] = metaData;
}
}
}
Expand All @@ -884,7 +902,7 @@ SyncModuleWorker.prototype._sync = function* (name, pkg) {
var diffNpmMaintainers = [];

// [
// { name, version, _hasShrinkwrap }
// { name, version, _hasShrinkwrap(boolean), peerDependenciesMeta(object), os(array), cpu(array), workspaces(array) }
// ]
var missingAbbreviatedMetadatas = [];
// [
Expand Down Expand Up @@ -1056,16 +1074,32 @@ SyncModuleWorker.prototype._sync = function* (name, pkg) {
});
changedVersions[v] = 1;
}

// find missing abbreviatedMetadata
if (abbreviatedMetadata) {
for (var key in abbreviatedMetadata) {
if (!(key in exists.package) || abbreviatedMetadata[key] !== exists.package[key]) {
missingAbbreviatedMetadatas.push(Object.assign({
id: exists.id,
name: exists.package.name,
version: exists.package.version,
}, abbreviatedMetadata));
break;
const value = abbreviatedMetadata[key];
// boolean: _hasShrinkwrap
if (key === '_hasShrinkwrap' && typeof value === 'boolean') {
if (!(key in exists.package) || abbreviatedMetadata[key] !== exists.package[key]) {
missingAbbreviatedMetadatas.push(Object.assign({
id: exists.id,
name: exists.package.name,
version: exists.package.version,
}, abbreviatedMetadata));
break;
}
} else if (Array.isArray(value) || (typeof value === 'object' && value)) {
// array: os, cpu, workspaces
// object: peerDependenciesMeta
if (existsModuleAbbreviated && !(key in existsModuleAbbreviated.package)) {
missingAbbreviatedMetadatas.push(Object.assign({
id: exists.id,
name: exists.package.name,
version: exists.package.version,
}, abbreviatedMetadata));
break;
}
}
}
}
Expand Down
22 changes: 5 additions & 17 deletions services/package.js
Original file line number Diff line number Diff line change
Expand Up @@ -356,22 +356,10 @@ exports.findAllModuleAbbreviateds = function* (where, order, limit, offset) {

// https://github.com/npm/registry/blob/master/docs/responses/package-metadata.md#abbreviated-version-object
exports.saveModuleAbbreviated = function* (mod) {
var pkg = JSON.stringify({
name: mod.package.name,
version: mod.package.version,
deprecated: mod.package.deprecated,
dependencies: mod.package.dependencies,
optionalDependencies: mod.package.optionalDependencies,
devDependencies: mod.package.devDependencies,
bundleDependencies: mod.package.bundleDependencies,
peerDependencies: mod.package.peerDependencies,
bin: mod.package.bin,
directories: mod.package.directories,
dist: mod.package.dist,
engines: mod.package.engines,
_hasShrinkwrap: mod.package._hasShrinkwrap,
_publish_on_cnpm: mod.package._publish_on_cnpm,
});
var pkg = JSON.stringify(Object.assign({}, mod.package, {
// ignore readme force
readme: undefined,
}));
var publish_time = mod.publish_time || Date.now();
var item = yield models.ModuleAbbreviated.findByNameAndVersion(mod.name, mod.version);
if (!item) {
Expand Down Expand Up @@ -417,7 +405,7 @@ exports.updateModulePackageFields = function* (id, fields) {
};

exports.updateModuleAbbreviatedPackage = function* (item) {
// item => { id, name, version, _hasShrinkwrap }
// item => { id, name, version, _hasShrinkwrap, os, cpu, peerDependenciesMeta, workspaces }
var mod = yield models.ModuleAbbreviated.findByNameAndVersion(item.name, item.version);
if (!mod) {
return null;
Expand Down
100 changes: 100 additions & 0 deletions test/controllers/sync_module_worker.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,106 @@ describe('test/controllers/sync_module_worker.test.js', () => {
yield end();
});

it('should sync mk2test-module-cnpmsync add os, cpu success', function* () {
mm(config, 'enableAbbreviatedMetadata', true);
mm(config, 'sourceNpmRegistry', 'https://registry.npmjs.com');
var log = yield logService.create({
name: 'mk2test-module-cnpmsync',
username: 'fengmk2',
});
log.id.should.above(0);
var worker = new SyncModuleWorker({
logId: log.id,
name: 'mk2test-module-cnpmsync',
username: 'fengmk2',
noDep: true,
});
worker.start();
var end = thunkify.event(worker, 'end');
yield end();

let pkg;
let pkgV2;
let pkgV3;
function checkResult() {
return function (done) {
request(app)
.get('/mk2test-module-cnpmsync')
.set('accept', 'application/vnd.npm.install-v1+json')
.expect(function (res) {
// console.log(JSON.stringify(res.body, null, 2));
pkg = res.body.versions['1.0.0'];
assert(pkg.os[0] === 'linux');
assert(pkg.cpu[0] === 'x64');
assert(!pkg.peerDependenciesMeta);
pkgV2 = res.body.versions['2.0.0'];
assert(pkgV2.os[0] === 'linux');
assert(pkgV2.cpu[0] === 'x64');
assert(pkgV2.peerDependenciesMeta);
pkgV3 = res.body.versions['3.0.0'];
assert(!pkgV3.os);
assert(!pkgV3.cpu);
assert(pkgV3.peerDependenciesMeta);
})
.expect(200, done);
};
}
yield checkResult();

// modify result
yield packageService.updateModuleAbbreviatedPackage({
name: pkg.name,
version: pkg.version,
os: undefined,
cpu: undefined,
peerDependenciesMeta: undefined,
});

yield packageService.updateModuleAbbreviatedPackage({
name: pkgV2.name,
version: pkgV2.version,
os: undefined,
cpu: undefined,
peerDependenciesMeta: undefined,
});
yield packageService.updateModuleAbbreviatedPackage({
name: pkgV3.name,
version: pkgV3.version,
peerDependenciesMeta: undefined,
});

function checkModifiyResult() {
return function (done) {
request(app)
.get('/mk2test-module-cnpmsync')
.set('accept', 'application/vnd.npm.install-v1+json')
.expect(function (res) {
// console.log(JSON.stringify(res.body, null, 2));
assert(!res.body.versions['1.0.0'].os);
assert(!res.body.versions['1.0.0'].cpu);
assert(!res.body.versions['2.0.0'].peerDependenciesMeta);
assert(!res.body.versions['3.0.0'].peerDependenciesMeta);
})
.expect(200, done);
};
}
yield checkModifiyResult();

// sync again
worker = new SyncModuleWorker({
logId: log.id,
name: 'mk2test-module-cnpmsync',
username: 'fengmk2',
noDep: true,
});
worker.start();
end = thunkify.event(worker, 'end');
yield end();

// check again still work
yield checkResult();
});

it('should sync upstream first', function* () {
mm(config, 'sourceNpmRegistryIsCNpm', true);
var log = yield logService.create({
Expand Down