cnpmcore 0.0.2 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/History.md +7 -0
- package/LICENSE +1 -1
- package/README.md +13 -4
- package/dist/app/common/AbstractService.d.ts +5 -0
- package/dist/app/{port/type/BaseController.js → common/AbstractService.js} +11 -9
- package/dist/app/common/FileUtil.d.ts +15 -0
- package/dist/app/common/FileUtil.js +77 -0
- package/dist/app/common/PackageUtil.d.ts +9 -0
- package/dist/app/common/PackageUtil.js +38 -16
- package/dist/app/common/SyncUtil.d.ts +2 -0
- package/dist/app/common/SyncUtil.js +17 -0
- package/dist/app/common/UserUtil.d.ts +5 -0
- package/dist/app/common/UserUtil.js +72 -0
- package/dist/app/common/adapter/BugVersionStore.d.ts +7 -0
- package/dist/app/common/adapter/BugVersionStore.js +28 -0
- package/dist/app/common/adapter/CacheAdapter.d.ts +13 -0
- package/dist/app/common/adapter/CacheAdapter.js +78 -0
- package/dist/app/common/adapter/NFSAdapter.d.ts +16 -0
- package/dist/app/common/adapter/NFSAdapter.js +62 -22
- package/dist/app/common/adapter/NPMRegistry.d.ts +78 -0
- package/dist/app/common/adapter/NPMRegistry.js +98 -0
- package/dist/app/common/adapter/QueueAdapter.d.ts +7 -0
- package/dist/app/common/adapter/QueueAdapter.js +37 -0
- package/dist/app/common/adapter/binary/AbstractBinary.d.ts +33 -0
- package/dist/app/common/adapter/binary/AbstractBinary.js +76 -0
- package/dist/app/common/adapter/binary/ApiBinary.d.ts +8 -0
- package/dist/app/common/adapter/binary/ApiBinary.js +31 -0
- package/dist/app/common/adapter/binary/BucketBinary.d.ts +5 -0
- package/dist/app/common/adapter/binary/BucketBinary.js +77 -0
- package/dist/app/common/adapter/binary/CypressBinary.d.ts +5 -0
- package/dist/app/common/adapter/binary/CypressBinary.js +63 -0
- package/dist/app/common/adapter/binary/ElectronBinary.d.ts +5 -0
- package/dist/app/common/adapter/binary/ElectronBinary.js +44 -0
- package/dist/app/common/adapter/binary/GithubBinary.d.ts +7 -0
- package/dist/app/common/adapter/binary/GithubBinary.js +93 -0
- package/dist/app/common/adapter/binary/ImageminBinary.d.ts +5 -0
- package/dist/app/common/adapter/binary/ImageminBinary.js +96 -0
- package/dist/app/common/adapter/binary/NodeBinary.d.ts +4 -0
- package/dist/app/common/adapter/binary/NodeBinary.js +41 -0
- package/dist/app/common/adapter/binary/NodePreGypBinary.d.ts +5 -0
- package/dist/app/common/adapter/binary/NodePreGypBinary.js +136 -0
- package/dist/app/common/adapter/binary/NwjsBinary.d.ts +6 -0
- package/dist/app/common/adapter/binary/NwjsBinary.js +47 -0
- package/dist/app/common/adapter/binary/PlaywrightBinary.d.ts +5 -0
- package/dist/app/common/adapter/binary/PlaywrightBinary.js +214 -0
- package/dist/app/common/adapter/binary/PuppeteerBinary.d.ts +6 -0
- package/dist/app/common/adapter/binary/PuppeteerBinary.js +125 -0
- package/dist/app/common/adapter/binary/SqlcipherBinary.d.ts +5 -0
- package/dist/app/common/adapter/binary/SqlcipherBinary.js +78 -0
- package/dist/app/common/aop/AsyncTimer.d.ts +9 -0
- package/dist/app/common/aop/AsyncTimer.js +36 -0
- package/dist/app/common/constants.d.ts +2 -0
- package/dist/app/common/constants.js +6 -0
- package/dist/app/common/dayjs.d.ts +2 -0
- package/dist/app/common/dayjs.js +10 -0
- package/dist/app/common/enum/Task.d.ts +12 -0
- package/dist/app/common/enum/Task.js +18 -0
- package/dist/app/common/enum/User.d.ts +5 -0
- package/dist/app/common/enum/User.js +10 -0
- package/dist/app/common/typing.d.ts +28 -0
- package/dist/app/common/typing.js +3 -0
- package/dist/app/core/entity/Binary.d.ts +28 -0
- package/dist/app/core/entity/Binary.js +29 -0
- package/dist/app/core/entity/BugVersion.d.ts +14 -0
- package/dist/app/core/entity/BugVersion.js +43 -0
- package/dist/app/core/entity/Change.d.ts +17 -0
- package/dist/app/core/entity/Change.js +20 -0
- package/dist/app/core/entity/Dist.d.ts +21 -0
- package/dist/app/core/entity/Dist.js +1 -2
- package/dist/app/core/entity/Entity.d.ts +11 -0
- package/dist/app/core/entity/Entity.js +3 -3
- package/dist/app/core/entity/Package.d.ts +45 -0
- package/dist/app/core/entity/Package.js +33 -25
- package/dist/app/core/entity/PackageTag.d.ts +17 -0
- package/dist/app/core/entity/PackageVersion.d.ts +26 -0
- package/dist/app/core/entity/PackageVersionBlock.d.ts +17 -0
- package/dist/app/core/entity/PackageVersionBlock.js +20 -0
- package/dist/app/core/entity/PackageVersionManifest.d.ts +17 -0
- package/dist/app/core/entity/PackageVersionManifest.js +20 -0
- package/dist/app/core/entity/Task.d.ts +43 -0
- package/dist/app/core/entity/Task.js +94 -0
- package/dist/app/core/entity/Token.d.ts +24 -0
- package/dist/app/core/entity/Token.js +23 -0
- package/dist/app/core/entity/User.d.ts +25 -0
- package/dist/app/core/entity/User.js +24 -0
- package/dist/app/core/event/BugVersionFixHandler.d.ts +6 -0
- package/dist/app/core/event/BugVersionFixHandler.js +42 -0
- package/dist/app/core/event/CacheCleaner.d.ts +38 -0
- package/dist/app/core/event/CacheCleaner.js +119 -0
- package/dist/app/core/event/ChangesStream.d.ts +32 -0
- package/dist/app/core/event/ChangesStream.js +106 -0
- package/dist/app/core/event/StoreManifest.d.ts +11 -0
- package/dist/app/core/event/StoreManifest.js +54 -0
- package/dist/app/core/event/index.d.ts +27 -0
- package/dist/app/core/event/index.js +11 -3
- package/dist/app/core/service/BinarySyncerService.d.ts +23 -0
- package/dist/app/core/service/BinarySyncerService.js +281 -0
- package/dist/app/core/service/BugVersionService.d.ts +11 -0
- package/dist/app/core/service/BugVersionService.js +86 -0
- package/dist/app/core/service/CacheService.d.ts +33 -0
- package/dist/app/core/service/CacheService.js +75 -0
- package/dist/app/core/service/ChangesStreamService.d.ts +11 -0
- package/dist/app/core/service/ChangesStreamService.js +186 -0
- package/dist/app/core/service/PackageManagerService.d.ts +83 -0
- package/dist/app/core/service/PackageManagerService.js +675 -78
- package/dist/app/core/service/PackageSyncerService.d.ts +24 -0
- package/dist/app/core/service/PackageSyncerService.js +667 -0
- package/dist/app/core/service/TaskService.d.ts +22 -0
- package/dist/app/core/service/TaskService.js +142 -0
- package/dist/app/core/service/UserService.d.ts +36 -0
- package/dist/app/core/service/UserService.js +120 -0
- package/dist/app/core/util/EntityUtil.d.ts +8 -0
- package/dist/app/core/util/EntityUtil.js +3 -3
- package/dist/app/infra/NFSClientAdapter.d.ts +18 -0
- package/dist/app/infra/NFSClientAdapter.js +74 -0
- package/dist/app/infra/package.json +6 -0
- package/dist/app/port/UserRoleManager.d.ts +24 -0
- package/dist/app/port/UserRoleManager.js +146 -0
- package/dist/app/port/controller/AbstractController.d.ts +32 -0
- package/dist/app/port/controller/AbstractController.js +112 -0
- package/dist/app/port/controller/BinarySyncController.d.ts +36 -0
- package/dist/app/port/controller/BinarySyncController.js +123 -0
- package/dist/app/port/controller/ChangesStreamController.d.ts +13 -0
- package/dist/app/port/controller/ChangesStreamController.js +53 -0
- package/dist/app/port/controller/DownloadController.d.ts +18 -0
- package/dist/app/port/controller/DownloadController.js +134 -0
- package/dist/app/port/controller/HomeController.d.ts +37 -0
- package/dist/app/port/controller/HomeController.js +72 -0
- package/dist/app/port/controller/PackageBlockController.d.ts +24 -0
- package/dist/app/port/controller/PackageBlockController.js +108 -0
- package/dist/app/port/controller/PackageSyncController.d.ts +35 -0
- package/dist/app/port/controller/PackageSyncController.js +205 -0
- package/dist/app/port/controller/PackageTagController.d.ts +12 -0
- package/dist/app/port/controller/PackageTagController.js +88 -0
- package/dist/app/port/controller/TokenController.d.ts +38 -0
- package/dist/app/port/controller/TokenController.js +125 -0
- package/dist/app/port/controller/UserController.d.ts +39 -0
- package/dist/app/port/controller/UserController.js +223 -0
- package/dist/app/port/controller/package/DownloadPackageVersionTar.d.ts +9 -0
- package/dist/app/port/controller/package/DownloadPackageVersionTar.js +82 -0
- package/dist/app/port/controller/package/RemovePackageVersionController.d.ts +8 -0
- package/dist/app/port/controller/package/RemovePackageVersionController.js +56 -0
- package/dist/app/port/controller/package/SavePackageVersionController.d.ts +48 -0
- package/dist/app/port/controller/package/SavePackageVersionController.js +221 -0
- package/dist/app/port/controller/package/ShowPackageController.d.ts +8 -0
- package/dist/app/port/controller/package/ShowPackageController.js +99 -0
- package/dist/app/port/controller/package/ShowPackageVersionController.d.ts +6 -0
- package/dist/app/port/controller/package/ShowPackageVersionController.js +55 -0
- package/dist/app/port/controller/package/UpdatePackageController.d.ts +17 -0
- package/dist/app/port/controller/package/UpdatePackageController.js +68 -0
- package/dist/app/port/middleware/AlwaysAuth.d.ts +2 -0
- package/dist/app/port/middleware/AlwaysAuth.js +17 -0
- package/dist/app/port/middleware/ErrorHandler.d.ts +2 -0
- package/dist/app/port/middleware/ErrorHandler.js +27 -5
- package/dist/app/port/middleware/Tracing.d.ts +2 -0
- package/dist/app/port/middleware/Tracing.js +22 -0
- package/dist/app/port/middleware/index.d.ts +2 -0
- package/dist/app/port/middleware/index.js +22 -0
- package/dist/app/port/typebox.d.ts +29 -0
- package/dist/app/port/typebox.js +71 -0
- package/dist/app/repository/AbstractRepository.d.ts +4 -0
- package/dist/app/repository/AbstractRepository.js +17 -0
- package/dist/app/repository/BinaryRepository.d.ts +7 -0
- package/dist/app/repository/BinaryRepository.js +45 -0
- package/dist/app/repository/ChangeRepository.d.ts +8 -0
- package/dist/app/repository/ChangeRepository.js +31 -0
- package/dist/app/repository/DistRepository.d.ts +15 -0
- package/dist/app/repository/DistRepository.js +69 -0
- package/dist/app/repository/PackageRepository.d.ts +39 -0
- package/dist/app/repository/PackageRepository.js +223 -36
- package/dist/app/repository/PackageVersionBlockRepository.d.ts +10 -0
- package/dist/app/repository/PackageVersionBlockRepository.js +51 -0
- package/dist/app/repository/PackageVersionDownloadRepository.d.ts +7 -0
- package/dist/app/repository/PackageVersionDownloadRepository.js +77 -0
- package/dist/app/repository/TaskRepository.d.ts +10 -0
- package/dist/app/repository/TaskRepository.js +82 -0
- package/dist/app/repository/UserRepository.d.ts +15 -0
- package/dist/app/repository/UserRepository.js +81 -0
- package/dist/app/repository/model/Binary.d.ts +13 -0
- package/dist/app/repository/model/Binary.js +53 -0
- package/dist/app/repository/model/Change.d.ts +10 -0
- package/dist/app/repository/model/Change.js +44 -0
- package/dist/app/repository/model/Dist.d.ts +12 -0
- package/dist/app/repository/model/Dist.js +10 -13
- package/dist/app/repository/model/HistoryTask.d.ts +18 -0
- package/dist/app/repository/model/HistoryTask.js +65 -0
- package/dist/app/repository/model/Maintainer.d.ts +8 -0
- package/dist/app/repository/model/Maintainer.js +36 -0
- package/dist/app/repository/model/Package.d.ts +13 -0
- package/dist/app/repository/model/Package.js +18 -9
- package/dist/app/repository/model/PackageDep.d.ts +11 -0
- package/dist/app/repository/model/PackageDep.js +9 -9
- package/dist/app/repository/model/PackageTag.d.ts +10 -0
- package/dist/app/repository/model/PackageTag.js +9 -9
- package/dist/app/repository/model/PackageVersion.d.ts +14 -0
- package/dist/app/repository/model/PackageVersion.js +9 -9
- package/dist/app/repository/model/PackageVersionBlock.d.ts +10 -0
- package/dist/app/repository/model/PackageVersionBlock.js +44 -0
- package/dist/app/repository/model/PackageVersionDownload.d.ts +40 -0
- package/dist/app/repository/model/PackageVersionDownload.js +132 -0
- package/dist/app/repository/model/PackageVersionManifest.d.ts +10 -0
- package/dist/app/repository/model/PackageVersionManifest.js +46 -0
- package/dist/app/repository/model/Task.d.ts +18 -0
- package/dist/app/repository/model/Task.js +65 -0
- package/dist/app/repository/model/Token.d.ts +13 -0
- package/dist/app/repository/model/Token.js +55 -0
- package/dist/app/repository/model/User.d.ts +14 -0
- package/dist/app/repository/model/User.js +56 -0
- package/dist/app/repository/util/EntityProperty.d.ts +1 -0
- package/dist/app/repository/util/ModelConvertor.d.ts +7 -0
- package/dist/app/repository/util/ModelConvertor.js +35 -2
- package/dist/app/repository/util/ModelConvertorUtil.d.ts +8 -0
- package/dist/app/schedule/ChangesStreamWorker.d.ts +8 -0
- package/dist/app/schedule/ChangesStreamWorker.js +27 -0
- package/dist/app/schedule/CheckRecentlyUpdatedPackages.d.ts +8 -0
- package/dist/app/schedule/CheckRecentlyUpdatedPackages.js +66 -0
- package/dist/app/schedule/CleanTempDir.d.ts +8 -0
- package/dist/app/schedule/CleanTempDir.js +48 -0
- package/dist/app/schedule/CreateSyncBinaryTask.d.ts +8 -0
- package/dist/app/schedule/CreateSyncBinaryTask.js +34 -0
- package/dist/app/schedule/SavePackageVersionDownloadCounter.d.ts +8 -0
- package/dist/app/schedule/SavePackageVersionDownloadCounter.js +21 -0
- package/dist/app/schedule/SyncBinaryWorker.d.ts +8 -0
- package/dist/app/schedule/SyncBinaryWorker.js +30 -0
- package/dist/app/schedule/SyncPackageWorker.d.ts +8 -0
- package/dist/app/schedule/SyncPackageWorker.js +44 -0
- package/dist/app/schedule/TaskTimeoutHandler.d.ts +9 -0
- package/dist/app/schedule/TaskTimeoutHandler.js +27 -0
- package/dist/app/schedule/UpdateTotalData.d.ts +9 -0
- package/dist/app/schedule/UpdateTotalData.js +103 -0
- package/dist/app.d.ts +11 -0
- package/dist/app.js +22 -0
- package/dist/config/binaries.d.ts +38 -0
- package/dist/config/binaries.js +810 -0
- package/dist/config/config.default.d.ts +3 -0
- package/dist/config/config.default.js +128 -9
- package/dist/config/config.unittest.d.ts +3 -0
- package/dist/config/config.unittest.js +18 -0
- package/dist/config/plugin.d.ts +3 -0
- package/dist/config/plugin.js +19 -3
- package/package.json +57 -21
- package/dist/app/common/adapter/NFSClientAdapter.js +0 -43
- package/dist/app/port/controller/PackageController.js +0 -273
|
@@ -5,19 +5,30 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
5
5
|
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
6
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
7
|
};
|
|
8
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
9
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
10
|
+
};
|
|
11
|
+
var PackageManagerService_1;
|
|
8
12
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
13
|
exports.PackageManagerService = void 0;
|
|
10
14
|
const promises_1 = require("fs/promises");
|
|
11
15
|
const tegg_1 = require("@eggjs/tegg");
|
|
12
16
|
const egg_errors_1 = require("egg-errors");
|
|
17
|
+
const semver_1 = __importDefault(require("semver"));
|
|
13
18
|
const PackageUtil_1 = require("../../common/PackageUtil");
|
|
19
|
+
const AbstractService_1 = require("../../common/AbstractService");
|
|
20
|
+
const constants_1 = require("../../common/constants");
|
|
14
21
|
const Package_1 = require("../entity/Package");
|
|
15
22
|
const PackageVersion_1 = require("../entity/PackageVersion");
|
|
23
|
+
const PackageVersionBlock_1 = require("../entity/PackageVersionBlock");
|
|
16
24
|
const PackageTag_1 = require("../entity/PackageTag");
|
|
17
25
|
const event_1 = require("../event");
|
|
18
|
-
|
|
26
|
+
const BugVersion_1 = require("../entity/BugVersion");
|
|
27
|
+
const TOTAL = '@@TOTAL@@';
|
|
28
|
+
const SCOPE_TOTAL_PREFIX = '@@SCOPE@@:';
|
|
29
|
+
let PackageManagerService = PackageManagerService_1 = class PackageManagerService extends AbstractService_1.AbstractService {
|
|
19
30
|
// support user publish private package and sync worker publish public package
|
|
20
|
-
async publish(cmd) {
|
|
31
|
+
async publish(cmd, publisher) {
|
|
21
32
|
let pkg = await this.packageRepository.findPackage(cmd.scope, cmd.name);
|
|
22
33
|
if (!pkg) {
|
|
23
34
|
pkg = Package_1.Package.create({
|
|
@@ -26,29 +37,62 @@ let PackageManagerService = class PackageManagerService {
|
|
|
26
37
|
isPrivate: cmd.isPrivate,
|
|
27
38
|
description: cmd.description,
|
|
28
39
|
});
|
|
29
|
-
await this.packageRepository.createPackage(pkg);
|
|
30
40
|
}
|
|
31
41
|
else {
|
|
32
42
|
// update description
|
|
33
43
|
// will read database twice to update description by model to entity and entity to model
|
|
34
44
|
if (pkg.description !== cmd.description) {
|
|
35
45
|
pkg.description = cmd.description;
|
|
36
|
-
await this.packageRepository.savePackage(pkg);
|
|
37
46
|
}
|
|
38
47
|
}
|
|
48
|
+
await this.packageRepository.savePackage(pkg);
|
|
49
|
+
// create maintainer
|
|
50
|
+
await this.packageRepository.savePackageMaintainer(pkg.packageId, publisher.userId);
|
|
39
51
|
let pkgVersion = await this.packageRepository.findPackageVersion(pkg.packageId, cmd.version);
|
|
40
52
|
if (pkgVersion) {
|
|
41
|
-
throw new egg_errors_1.ForbiddenError(`
|
|
53
|
+
throw new egg_errors_1.ForbiddenError(`Can't modify pre-existing version: ${pkg.fullname}@${pkgVersion.version}`);
|
|
54
|
+
}
|
|
55
|
+
// make sure cmd.packageJson.readme is deleted
|
|
56
|
+
if ('readme' in cmd.packageJson) {
|
|
57
|
+
delete cmd.packageJson.readme;
|
|
58
|
+
}
|
|
59
|
+
// add _cnpmcore_publish_time field to cmd.packageJson
|
|
60
|
+
if (!cmd.packageJson._cnpmcore_publish_time) {
|
|
61
|
+
cmd.packageJson._cnpmcore_publish_time = new Date();
|
|
42
62
|
}
|
|
43
63
|
// https://github.com/npm/registry/blob/master/docs/responses/package-metadata.md#abbreviated-version-object
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
64
|
+
const hasInstallScript = (0, PackageUtil_1.detectInstallScript)(cmd.packageJson) ? true : undefined;
|
|
65
|
+
let tarDistIntegrity;
|
|
66
|
+
let tarDistSize = 0;
|
|
67
|
+
if (cmd.dist.content) {
|
|
68
|
+
const tarDistBytes = cmd.dist.content;
|
|
69
|
+
tarDistIntegrity = await (0, PackageUtil_1.calculateIntegrity)(tarDistBytes);
|
|
70
|
+
tarDistSize = tarDistBytes.length;
|
|
71
|
+
}
|
|
72
|
+
else if (cmd.dist.localFile) {
|
|
73
|
+
const localFile = cmd.dist.localFile;
|
|
74
|
+
const fileStat = await (0, promises_1.stat)(localFile);
|
|
75
|
+
tarDistIntegrity = await (0, PackageUtil_1.calculateIntegrity)(localFile);
|
|
76
|
+
tarDistSize = fileStat.size;
|
|
77
|
+
}
|
|
78
|
+
const tarDist = pkg.createTar(cmd.version, {
|
|
79
|
+
size: tarDistSize,
|
|
80
|
+
shasum: tarDistIntegrity.shasum,
|
|
81
|
+
integrity: tarDistIntegrity.integrity,
|
|
82
|
+
});
|
|
83
|
+
if (cmd.dist.content) {
|
|
84
|
+
await this.distRepository.saveDist(tarDist, cmd.dist.content);
|
|
51
85
|
}
|
|
86
|
+
else if (cmd.dist.localFile) {
|
|
87
|
+
await this.distRepository.saveDist(tarDist, cmd.dist.localFile);
|
|
88
|
+
}
|
|
89
|
+
cmd.packageJson.dist = {
|
|
90
|
+
...cmd.packageJson.dist,
|
|
91
|
+
tarball: (0, PackageUtil_1.formatTarball)(this.config.cnpmcore.registry, pkg.scope, pkg.name, cmd.version),
|
|
92
|
+
size: tarDistSize,
|
|
93
|
+
shasum: tarDistIntegrity.shasum,
|
|
94
|
+
integrity: tarDistIntegrity.integrity,
|
|
95
|
+
};
|
|
52
96
|
const abbreviated = JSON.stringify({
|
|
53
97
|
name: cmd.packageJson.name,
|
|
54
98
|
version: cmd.packageJson.version,
|
|
@@ -58,12 +102,14 @@ let PackageManagerService = class PackageManagerService {
|
|
|
58
102
|
devDependencies: cmd.packageJson.devDependencies,
|
|
59
103
|
bundleDependencies: cmd.packageJson.bundleDependencies,
|
|
60
104
|
peerDependencies: cmd.packageJson.peerDependencies,
|
|
105
|
+
peerDependenciesMeta: cmd.packageJson.peerDependenciesMeta,
|
|
61
106
|
bin: cmd.packageJson.bin,
|
|
62
107
|
os: cmd.packageJson.os,
|
|
63
108
|
cpu: cmd.packageJson.cpu,
|
|
109
|
+
libc: cmd.packageJson.libc,
|
|
64
110
|
workspaces: cmd.packageJson.workspaces,
|
|
65
111
|
directories: cmd.packageJson.directories,
|
|
66
|
-
|
|
112
|
+
dist: cmd.packageJson.dist,
|
|
67
113
|
engines: cmd.packageJson.engines,
|
|
68
114
|
_hasShrinkwrap: cmd.packageJson._hasShrinkwrap,
|
|
69
115
|
hasInstallScript,
|
|
@@ -74,34 +120,10 @@ let PackageManagerService = class PackageManagerService {
|
|
|
74
120
|
const readmeDistIntegrity = await (0, PackageUtil_1.calculateIntegrity)(readmeDistBytes);
|
|
75
121
|
const manifestDistBytes = Buffer.from(JSON.stringify(cmd.packageJson));
|
|
76
122
|
const manifestDistIntegrity = await (0, PackageUtil_1.calculateIntegrity)(manifestDistBytes);
|
|
77
|
-
let tarDistIntegrity;
|
|
78
|
-
let tarDistSize = 0;
|
|
79
|
-
if (cmd.dist.content) {
|
|
80
|
-
const tarDistBytes = cmd.dist.content;
|
|
81
|
-
tarDistIntegrity = await (0, PackageUtil_1.calculateIntegrity)(tarDistBytes);
|
|
82
|
-
tarDistSize = tarDistBytes.length;
|
|
83
|
-
}
|
|
84
|
-
else if (cmd.dist.localFile) {
|
|
85
|
-
const localFile = cmd.dist.localFile;
|
|
86
|
-
const fileStat = await (0, promises_1.stat)(localFile);
|
|
87
|
-
tarDistIntegrity = await (0, PackageUtil_1.calculateIntegrity)(localFile);
|
|
88
|
-
tarDistSize = fileStat.size;
|
|
89
|
-
}
|
|
90
|
-
const tarDist = pkg.createTar(cmd.version, {
|
|
91
|
-
size: tarDistSize,
|
|
92
|
-
shasum: tarDistIntegrity.shasum,
|
|
93
|
-
integrity: tarDistIntegrity.integrity,
|
|
94
|
-
});
|
|
95
|
-
if (cmd.dist.content) {
|
|
96
|
-
await this.nfsAdapter.uploadBytes(tarDist.path, cmd.dist.content);
|
|
97
|
-
}
|
|
98
|
-
else if (cmd.dist.localFile) {
|
|
99
|
-
await this.nfsAdapter.uploadFile(tarDist.path, cmd.dist.localFile);
|
|
100
|
-
}
|
|
101
123
|
pkgVersion = PackageVersion_1.PackageVersion.create({
|
|
102
124
|
packageId: pkg.packageId,
|
|
103
125
|
version: cmd.version,
|
|
104
|
-
publishTime: new Date(),
|
|
126
|
+
publishTime: cmd.publishTime || new Date(),
|
|
105
127
|
manifestDist: pkg.createManifest(cmd.version, {
|
|
106
128
|
size: manifestDistBytes.length,
|
|
107
129
|
shasum: manifestDistIntegrity.shasum,
|
|
@@ -120,73 +142,636 @@ let PackageManagerService = class PackageManagerService {
|
|
|
120
142
|
tarDist,
|
|
121
143
|
});
|
|
122
144
|
await Promise.all([
|
|
123
|
-
this.
|
|
124
|
-
this.
|
|
125
|
-
this.
|
|
145
|
+
this.distRepository.saveDist(pkgVersion.abbreviatedDist, abbreviatedDistBytes),
|
|
146
|
+
this.distRepository.saveDist(pkgVersion.manifestDist, manifestDistBytes),
|
|
147
|
+
this.distRepository.saveDist(pkgVersion.readmeDist, readmeDistBytes),
|
|
126
148
|
]);
|
|
127
149
|
await this.packageRepository.createPackageVersion(pkgVersion);
|
|
128
|
-
|
|
150
|
+
if (cmd.skipRefreshPackageManifests !== true) {
|
|
151
|
+
await this.refreshPackageChangeVersionsToDists(pkg, [pkgVersion.version]);
|
|
152
|
+
}
|
|
129
153
|
if (cmd.tag) {
|
|
130
|
-
await this.savePackageTag(pkg
|
|
154
|
+
await this.savePackageTag(pkg, cmd.tag, cmd.version, true);
|
|
131
155
|
}
|
|
156
|
+
this.eventBus.emit(event_1.PACKAGE_VERSION_ADDED, pkg.fullname, pkgVersion.version);
|
|
132
157
|
return pkgVersion;
|
|
133
158
|
}
|
|
134
|
-
async
|
|
135
|
-
let
|
|
159
|
+
async blockPackage(pkg, reason) {
|
|
160
|
+
let block = await this.packageVersionBlockRepository.findPackageBlock(pkg.packageId);
|
|
161
|
+
if (block) {
|
|
162
|
+
block.reason = reason;
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
block = PackageVersionBlock_1.PackageVersionBlock.create({
|
|
166
|
+
packageId: pkg.packageId,
|
|
167
|
+
version: '*',
|
|
168
|
+
reason,
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
await this.packageVersionBlockRepository.savePackageVersionBlock(block);
|
|
172
|
+
if (pkg.manifestsDist && pkg.abbreviatedsDist) {
|
|
173
|
+
const fullManifests = await this.distRepository.readDistBytesToJSON(pkg.manifestsDist);
|
|
174
|
+
if (fullManifests) {
|
|
175
|
+
fullManifests.block = reason;
|
|
176
|
+
}
|
|
177
|
+
const abbreviatedManifests = await this.distRepository.readDistBytesToJSON(pkg.abbreviatedsDist);
|
|
178
|
+
if (abbreviatedManifests) {
|
|
179
|
+
abbreviatedManifests.block = reason;
|
|
180
|
+
}
|
|
181
|
+
await this._updatePackageManifestsToDists(pkg, fullManifests, abbreviatedManifests);
|
|
182
|
+
this.eventBus.emit(event_1.PACKAGE_BLOCKED, pkg.fullname);
|
|
183
|
+
this.logger.info('[packageManagerService.blockPackage:success] packageId: %s, reason: %j', pkg.packageId, reason);
|
|
184
|
+
}
|
|
185
|
+
return block;
|
|
186
|
+
}
|
|
187
|
+
async unblockPackage(pkg) {
|
|
188
|
+
const block = await this.packageVersionBlockRepository.findPackageVersionBlock(pkg.packageId, '*');
|
|
189
|
+
if (block) {
|
|
190
|
+
await this.packageVersionBlockRepository.removePackageVersionBlock(block.packageVersionBlockId);
|
|
191
|
+
}
|
|
192
|
+
if (pkg.manifestsDist && pkg.abbreviatedsDist) {
|
|
193
|
+
const fullManifests = await this.distRepository.readDistBytesToJSON(pkg.manifestsDist);
|
|
194
|
+
if (fullManifests) {
|
|
195
|
+
fullManifests.block = undefined;
|
|
196
|
+
}
|
|
197
|
+
const abbreviatedManifests = await this.distRepository.readDistBytesToJSON(pkg.abbreviatedsDist);
|
|
198
|
+
if (abbreviatedManifests) {
|
|
199
|
+
abbreviatedManifests.block = undefined;
|
|
200
|
+
}
|
|
201
|
+
await this._updatePackageManifestsToDists(pkg, fullManifests, abbreviatedManifests);
|
|
202
|
+
this.eventBus.emit(event_1.PACKAGE_UNBLOCKED, pkg.fullname);
|
|
203
|
+
this.logger.info('[packageManagerService.unblockPackage:success] packageId: %s', pkg.packageId);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
async replacePackageMaintainers(pkg, maintainers) {
|
|
207
|
+
await this.packageRepository.replacePackageMaintainers(pkg.packageId, maintainers.map(m => m.userId));
|
|
208
|
+
await this._refreshPackageManifestRootAttributeOnlyToDists(pkg, 'maintainers');
|
|
209
|
+
this.eventBus.emit(event_1.PACKAGE_MAINTAINER_CHANGED, pkg.fullname);
|
|
210
|
+
}
|
|
211
|
+
async savePackageMaintainers(pkg, maintainers) {
|
|
212
|
+
let hasNewRecord = false;
|
|
213
|
+
for (const maintainer of maintainers) {
|
|
214
|
+
const newRecord = await this.packageRepository.savePackageMaintainer(pkg.packageId, maintainer.userId);
|
|
215
|
+
if (newRecord) {
|
|
216
|
+
hasNewRecord = true;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
if (hasNewRecord) {
|
|
220
|
+
await this._refreshPackageManifestRootAttributeOnlyToDists(pkg, 'maintainers');
|
|
221
|
+
this.eventBus.emit(event_1.PACKAGE_MAINTAINER_CHANGED, pkg.fullname);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
async removePackageMaintainer(pkg, maintainer) {
|
|
225
|
+
await this.packageRepository.removePackageMaintainer(pkg.packageId, maintainer.userId);
|
|
226
|
+
await this._refreshPackageManifestRootAttributeOnlyToDists(pkg, 'maintainers');
|
|
227
|
+
this.eventBus.emit(event_1.PACKAGE_MAINTAINER_REMOVED, pkg.fullname, maintainer.name);
|
|
228
|
+
}
|
|
229
|
+
async refreshPackageMaintainersToDists(pkg) {
|
|
230
|
+
await this._refreshPackageManifestRootAttributeOnlyToDists(pkg, 'maintainers');
|
|
231
|
+
}
|
|
232
|
+
async refreshPackageDistTagsToDists(pkg) {
|
|
233
|
+
await this._refreshPackageManifestRootAttributeOnlyToDists(pkg, 'dist-tags');
|
|
234
|
+
}
|
|
235
|
+
async listPackageFullManifests(scope, name, isSync = false) {
|
|
236
|
+
return await this._listPackageFullOrAbbreviatedManifests(scope, name, true, isSync);
|
|
237
|
+
}
|
|
238
|
+
async listPackageAbbreviatedManifests(scope, name, isSync = false) {
|
|
239
|
+
return await this._listPackageFullOrAbbreviatedManifests(scope, name, false, isSync);
|
|
240
|
+
}
|
|
241
|
+
async showPackageVersionManifest(scope, name, versionOrTag, isSync = false) {
|
|
242
|
+
let blockReason = '';
|
|
243
|
+
let manifest;
|
|
244
|
+
const pkg = await this.packageRepository.findPackage(scope, name);
|
|
245
|
+
const pkgId = pkg === null || pkg === void 0 ? void 0 : pkg.packageId;
|
|
246
|
+
if (!pkg)
|
|
247
|
+
return { manifest: null, blockReason, pkgId };
|
|
248
|
+
const block = await this.packageVersionBlockRepository.findPackageBlock(pkg.packageId);
|
|
249
|
+
if (block) {
|
|
250
|
+
blockReason = block.reason;
|
|
251
|
+
return {
|
|
252
|
+
blockReason,
|
|
253
|
+
manifest,
|
|
254
|
+
pkgId,
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
let version = versionOrTag;
|
|
258
|
+
if (!semver_1.default.valid(versionOrTag)) {
|
|
259
|
+
// invalid version, versionOrTag is a tag
|
|
260
|
+
const packageTag = await this.packageRepository.findPackageTag(pkg.packageId, versionOrTag);
|
|
261
|
+
if (packageTag) {
|
|
262
|
+
version = packageTag.version;
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
const packageVersion = await this.packageRepository.findPackageVersion(pkg.packageId, version);
|
|
266
|
+
if (!packageVersion)
|
|
267
|
+
return { manifest: null, blockReason, pkgId };
|
|
268
|
+
manifest = await this.distRepository.findPackageVersionManifest(packageVersion.packageId, version);
|
|
269
|
+
let bugVersion;
|
|
270
|
+
// sync mode response no bug version fixed
|
|
271
|
+
if (!isSync) {
|
|
272
|
+
bugVersion = await this.getBugVersion();
|
|
273
|
+
}
|
|
274
|
+
if (bugVersion) {
|
|
275
|
+
const fullname = (0, PackageUtil_1.getFullname)(scope, name);
|
|
276
|
+
manifest = await this.bugVersionService.fixPackageBugVersion(bugVersion, fullname, manifest);
|
|
277
|
+
}
|
|
278
|
+
return { manifest, blockReason, pkgId };
|
|
279
|
+
}
|
|
280
|
+
async downloadPackageVersionTar(packageVersion) {
|
|
281
|
+
return await this.distRepository.downloadDist(packageVersion.tarDist);
|
|
282
|
+
}
|
|
283
|
+
plusPackageVersionCounter(fullname, version) {
|
|
284
|
+
// set counter + 1, schedule will store them into database
|
|
285
|
+
const counters = PackageManagerService_1.downloadCounters;
|
|
286
|
+
if (!counters[fullname])
|
|
287
|
+
counters[fullname] = {};
|
|
288
|
+
counters[fullname][version] = (counters[fullname][version] || 0) + 1;
|
|
289
|
+
// Total
|
|
290
|
+
const ALL = '*';
|
|
291
|
+
if (!counters[TOTAL])
|
|
292
|
+
counters[TOTAL] = {};
|
|
293
|
+
counters[TOTAL][ALL] = (counters[TOTAL][ALL] || 0) + 1;
|
|
294
|
+
// scope total
|
|
295
|
+
const scope = (0, PackageUtil_1.getScopeAndName)(fullname)[0];
|
|
296
|
+
if (scope) {
|
|
297
|
+
const scopeKey = `${SCOPE_TOTAL_PREFIX}${scope}`;
|
|
298
|
+
if (!counters[scopeKey])
|
|
299
|
+
counters[scopeKey] = {};
|
|
300
|
+
counters[scopeKey][ALL] = (counters[scopeKey][ALL] || 0) + 1;
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
// will be call by schedule/SavePackageVersionDownloadCounter.ts
|
|
304
|
+
async savePackageVersionCounters() {
|
|
305
|
+
// { [fullname]: { [version]: number } }
|
|
306
|
+
const counters = PackageManagerService_1.downloadCounters;
|
|
307
|
+
const fullnames = Object.keys(counters);
|
|
308
|
+
if (fullnames.length === 0)
|
|
309
|
+
return;
|
|
310
|
+
PackageManagerService_1.downloadCounters = {};
|
|
311
|
+
this.logger.info('[packageManagerService.savePackageVersionCounters:saving] %d fullnames', fullnames.length);
|
|
312
|
+
let total = 0;
|
|
313
|
+
for (const fullname in counters) {
|
|
314
|
+
const versions = counters[fullname];
|
|
315
|
+
let packageId = null;
|
|
316
|
+
if (fullname === TOTAL) {
|
|
317
|
+
packageId = 'total';
|
|
318
|
+
}
|
|
319
|
+
else if (fullname.startsWith(SCOPE_TOTAL_PREFIX)) {
|
|
320
|
+
packageId = fullname.replace(SCOPE_TOTAL_PREFIX, '');
|
|
321
|
+
}
|
|
322
|
+
else {
|
|
323
|
+
// find packageId from fullname
|
|
324
|
+
const [scope, name] = (0, PackageUtil_1.getScopeAndName)(fullname);
|
|
325
|
+
packageId = await this.packageRepository.findPackageId(scope, name);
|
|
326
|
+
}
|
|
327
|
+
if (!packageId)
|
|
328
|
+
continue;
|
|
329
|
+
for (const version in versions) {
|
|
330
|
+
const counter = versions[version];
|
|
331
|
+
await this.packageVersionDownloadRepository.plus(packageId, version, counter);
|
|
332
|
+
total += counter;
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
this.logger.info('[packageManagerService.savePackageVersionCounters:saved] %d total', total);
|
|
336
|
+
}
|
|
337
|
+
async saveDeprecatedVersions(pkg, deprecateds) {
|
|
338
|
+
const updateVersions = [];
|
|
339
|
+
for (const { version, deprecated } of deprecateds) {
|
|
340
|
+
const pkgVersion = await this.packageRepository.findPackageVersion(pkg.packageId, version);
|
|
341
|
+
if (!pkgVersion)
|
|
342
|
+
continue;
|
|
343
|
+
const message = deprecated === '' ? undefined : deprecated;
|
|
344
|
+
await this._mergeManifestDist(pkgVersion.manifestDist, { deprecated: message });
|
|
345
|
+
await this._mergeManifestDist(pkgVersion.abbreviatedDist, { deprecated: message });
|
|
346
|
+
await this.packageRepository.savePackageVersion(pkgVersion);
|
|
347
|
+
updateVersions.push(version);
|
|
348
|
+
}
|
|
349
|
+
await this.refreshPackageChangeVersionsToDists(pkg, updateVersions);
|
|
350
|
+
this.eventBus.emit(event_1.PACKAGE_META_CHANGED, pkg.fullname, { deprecateds });
|
|
351
|
+
}
|
|
352
|
+
async savePackageVersionManifest(pkgVersion, mergeManifest, mergeAbbreviated) {
|
|
353
|
+
await this._mergeManifestDist(pkgVersion.manifestDist, mergeManifest);
|
|
354
|
+
await this._mergeManifestDist(pkgVersion.abbreviatedDist, mergeAbbreviated);
|
|
355
|
+
}
|
|
356
|
+
async _removePackageVersionAndDist(pkgVersion) {
|
|
357
|
+
// remove nfs dists
|
|
358
|
+
await Promise.all([
|
|
359
|
+
this.distRepository.destroyDist(pkgVersion.abbreviatedDist),
|
|
360
|
+
this.distRepository.destroyDist(pkgVersion.manifestDist),
|
|
361
|
+
this.distRepository.destroyDist(pkgVersion.readmeDist),
|
|
362
|
+
this.distRepository.destroyDist(pkgVersion.tarDist),
|
|
363
|
+
]);
|
|
364
|
+
// remove from repository
|
|
365
|
+
await this.packageRepository.removePackageVersion(pkgVersion);
|
|
366
|
+
}
|
|
367
|
+
async unpublishPackage(pkg) {
|
|
368
|
+
const pkgVersions = await this.packageRepository.listPackageVersions(pkg.packageId);
|
|
369
|
+
for (const pkgVersion of pkgVersions) {
|
|
370
|
+
await this._removePackageVersionAndDist(pkgVersion);
|
|
371
|
+
}
|
|
372
|
+
// set unpublished dist to package's manifestDist and abbreviatedDist
|
|
373
|
+
const unpublishedInfo = {
|
|
374
|
+
_id: pkg.fullname,
|
|
375
|
+
name: pkg.fullname,
|
|
376
|
+
time: {
|
|
377
|
+
created: pkg.createdAt,
|
|
378
|
+
modified: pkg.updatedAt,
|
|
379
|
+
unpublished: new Date(),
|
|
380
|
+
},
|
|
381
|
+
// keep this property exists for forward compatibility
|
|
382
|
+
// https://github.com/cnpm/cnpmjs.org/blob/ad622d55e384743b48e79bb6aec574a7f354ee9f/controllers/sync_module_worker.js#L828
|
|
383
|
+
'dist-tags': {},
|
|
384
|
+
};
|
|
385
|
+
await this._mergeManifestDist(pkg.manifestsDist, undefined, unpublishedInfo);
|
|
386
|
+
await this._mergeManifestDist(pkg.abbreviatedsDist, undefined, unpublishedInfo);
|
|
387
|
+
this.eventBus.emit(event_1.PACKAGE_UNPUBLISHED, pkg.fullname);
|
|
388
|
+
}
|
|
389
|
+
async removePackageVersion(pkg, pkgVersion, skipRefreshPackageManifests = false) {
|
|
390
|
+
await this._removePackageVersionAndDist(pkgVersion);
|
|
391
|
+
// all versions removed
|
|
392
|
+
const versions = await this.packageRepository.listPackageVersionNames(pkg.packageId);
|
|
393
|
+
if (versions.length > 0) {
|
|
394
|
+
// make sure latest tag exists
|
|
395
|
+
const latestTag = await this.packageRepository.findPackageTag(pkg.packageId, 'latest');
|
|
396
|
+
if ((latestTag === null || latestTag === void 0 ? void 0 : latestTag.version) === pkgVersion.version) {
|
|
397
|
+
// change latest version
|
|
398
|
+
// https://github.com/npm/libnpmpublish/blob/main/unpublish.js#L62
|
|
399
|
+
const latestVersion = versions.sort(semver_1.default.compareLoose).pop();
|
|
400
|
+
if (latestVersion) {
|
|
401
|
+
await this.savePackageTag(pkg, latestTag.tag, latestVersion, true);
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
if (skipRefreshPackageManifests !== true) {
|
|
405
|
+
await this.refreshPackageChangeVersionsToDists(pkg, undefined, [pkgVersion.version]);
|
|
406
|
+
this.eventBus.emit(event_1.PACKAGE_VERSION_REMOVED, pkg.fullname, pkgVersion.version);
|
|
407
|
+
}
|
|
408
|
+
return;
|
|
409
|
+
}
|
|
410
|
+
// unpublish
|
|
411
|
+
await this.unpublishPackage(pkg);
|
|
412
|
+
}
|
|
413
|
+
async savePackageTag(pkg, tag, version, skipEvent = false) {
|
|
414
|
+
let tagEntity = await this.packageRepository.findPackageTag(pkg.packageId, tag);
|
|
136
415
|
if (!tagEntity) {
|
|
137
416
|
tagEntity = PackageTag_1.PackageTag.create({
|
|
138
|
-
packageId,
|
|
417
|
+
packageId: pkg.packageId,
|
|
139
418
|
tag,
|
|
140
419
|
version,
|
|
141
420
|
});
|
|
142
421
|
await this.packageRepository.savePackageTag(tagEntity);
|
|
143
|
-
this.
|
|
144
|
-
|
|
422
|
+
await this._refreshPackageManifestRootAttributeOnlyToDists(pkg, 'dist-tags');
|
|
423
|
+
if (!skipEvent) {
|
|
424
|
+
this.eventBus.emit(event_1.PACKAGE_TAG_ADDED, pkg.fullname, tagEntity.tag);
|
|
425
|
+
}
|
|
426
|
+
return true;
|
|
145
427
|
}
|
|
146
428
|
if (tagEntity.version === version) {
|
|
147
429
|
// nothing change
|
|
148
|
-
return;
|
|
430
|
+
return false;
|
|
149
431
|
}
|
|
150
432
|
tagEntity.version = version;
|
|
151
433
|
await this.packageRepository.savePackageTag(tagEntity);
|
|
152
|
-
this.
|
|
434
|
+
await this._refreshPackageManifestRootAttributeOnlyToDists(pkg, 'dist-tags');
|
|
435
|
+
if (!skipEvent) {
|
|
436
|
+
this.eventBus.emit(event_1.PACKAGE_TAG_CHANGED, pkg.fullname, tagEntity.tag);
|
|
437
|
+
}
|
|
438
|
+
return true;
|
|
439
|
+
}
|
|
440
|
+
async removePackageTag(pkg, tag) {
|
|
441
|
+
const tagEntity = await this.packageRepository.findPackageTag(pkg.packageId, tag);
|
|
442
|
+
if (!tagEntity)
|
|
443
|
+
return false;
|
|
444
|
+
await this.packageRepository.removePackageTag(tagEntity);
|
|
445
|
+
await this._refreshPackageManifestRootAttributeOnlyToDists(pkg, 'dist-tags');
|
|
446
|
+
this.eventBus.emit(event_1.PACKAGE_TAG_REMOVED, pkg.fullname, tagEntity.tag);
|
|
447
|
+
return true;
|
|
448
|
+
}
|
|
449
|
+
async refreshPackageChangeVersionsToDists(pkg, updateVersions, removeVersions) {
|
|
450
|
+
var _a, _b;
|
|
451
|
+
if (!((_a = pkg.manifestsDist) === null || _a === void 0 ? void 0 : _a.distId) || !((_b = pkg.abbreviatedsDist) === null || _b === void 0 ? void 0 : _b.distId)) {
|
|
452
|
+
return await this._refreshPackageManifestsToDists(pkg);
|
|
453
|
+
}
|
|
454
|
+
const fullManifests = await this.distRepository.readDistBytesToJSON(pkg.manifestsDist);
|
|
455
|
+
const abbreviatedManifests = await this.distRepository.readDistBytesToJSON(pkg.abbreviatedsDist);
|
|
456
|
+
if (!fullManifests.versions || !abbreviatedManifests.versions) {
|
|
457
|
+
// is unpublished, refresh all again
|
|
458
|
+
return await this._refreshPackageManifestsToDists(pkg);
|
|
459
|
+
}
|
|
460
|
+
if (updateVersions) {
|
|
461
|
+
for (const version of updateVersions) {
|
|
462
|
+
const packageVersion = await this.packageRepository.findPackageVersion(pkg.packageId, version);
|
|
463
|
+
if (packageVersion) {
|
|
464
|
+
const manifest = await this.distRepository.readDistBytesToJSON(packageVersion.manifestDist);
|
|
465
|
+
if (!manifest)
|
|
466
|
+
continue;
|
|
467
|
+
if ('readme' in manifest) {
|
|
468
|
+
delete manifest.readme;
|
|
469
|
+
}
|
|
470
|
+
fullManifests.versions[packageVersion.version] = manifest;
|
|
471
|
+
fullManifests.time[packageVersion.version] = packageVersion.publishTime;
|
|
472
|
+
const abbreviatedManifest = await this.distRepository.readDistBytesToJSON(packageVersion.abbreviatedDist);
|
|
473
|
+
abbreviatedManifests.versions[packageVersion.version] = abbreviatedManifest;
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
if (removeVersions) {
|
|
478
|
+
for (const version of removeVersions) {
|
|
479
|
+
delete fullManifests.versions[version];
|
|
480
|
+
delete fullManifests.time[version];
|
|
481
|
+
delete abbreviatedManifests.versions[version];
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
// update dist-tags
|
|
485
|
+
await this._setPackageDistTagsAndLatestInfos(pkg, fullManifests, abbreviatedManifests);
|
|
486
|
+
// store to nfs dist
|
|
487
|
+
await this._updatePackageManifestsToDists(pkg, fullManifests, abbreviatedManifests);
|
|
488
|
+
}
|
|
489
|
+
async getBugVersion() {
|
|
490
|
+
// TODO performance problem, cache bugVersion and update with schedule
|
|
491
|
+
const pkg = await this.packageRepository.findPackage('', constants_1.BUG_VERSIONS);
|
|
492
|
+
if (!pkg)
|
|
493
|
+
return;
|
|
494
|
+
const tag = await this.packageRepository.findPackageTag(pkg.packageId, constants_1.LATEST_TAG);
|
|
495
|
+
if (!tag)
|
|
496
|
+
return;
|
|
497
|
+
let bugVersion = this.bugVersionStore.getBugVersion(tag.version);
|
|
498
|
+
if (!bugVersion) {
|
|
499
|
+
const packageVersionJson = await this.distRepository.findPackageVersionManifest(pkg.packageId, tag.version);
|
|
500
|
+
if (!packageVersionJson)
|
|
501
|
+
return;
|
|
502
|
+
const data = packageVersionJson.config['bug-versions'];
|
|
503
|
+
bugVersion = new BugVersion_1.BugVersion(data);
|
|
504
|
+
this.bugVersionStore.setBugVersion(bugVersion, tag.version);
|
|
505
|
+
}
|
|
506
|
+
return bugVersion;
|
|
507
|
+
}
|
|
508
|
+
async _listPackageDistTags(pkg) {
|
|
509
|
+
const tags = await this.packageRepository.listPackageTags(pkg.packageId);
|
|
510
|
+
const distTags = {};
|
|
511
|
+
for (const tag of tags) {
|
|
512
|
+
distTags[tag.tag] = tag.version;
|
|
513
|
+
}
|
|
514
|
+
return distTags;
|
|
515
|
+
}
|
|
516
|
+
// refresh package full manifests and abbreviated manifests to NFS
|
|
517
|
+
async _refreshPackageManifestsToDists(pkg) {
|
|
518
|
+
const [fullManifests, abbreviatedManifests,] = await Promise.all([
|
|
519
|
+
await this._listPackageFullManifests(pkg),
|
|
520
|
+
await this._listPackageAbbreviatedManifests(pkg),
|
|
521
|
+
]);
|
|
522
|
+
await this._updatePackageManifestsToDists(pkg, fullManifests, abbreviatedManifests);
|
|
523
|
+
}
|
|
524
|
+
// only refresh root attributes only, e.g.: dist-tags, maintainers
|
|
525
|
+
async _refreshPackageManifestRootAttributeOnlyToDists(pkg, refreshAttr) {
|
|
526
|
+
if (refreshAttr === 'maintainers') {
|
|
527
|
+
const fullManifests = await this.distRepository.readDistBytesToJSON(pkg.manifestsDist);
|
|
528
|
+
const maintainers = await this._listPackageMaintainers(pkg);
|
|
529
|
+
fullManifests.maintainers = maintainers;
|
|
530
|
+
await this._updatePackageManifestsToDists(pkg, fullManifests, null);
|
|
531
|
+
}
|
|
532
|
+
else if (refreshAttr === 'dist-tags') {
|
|
533
|
+
const fullManifests = await this.distRepository.readDistBytesToJSON(pkg.manifestsDist);
|
|
534
|
+
const abbreviatedManifests = await this.distRepository.readDistBytesToJSON(pkg.abbreviatedsDist);
|
|
535
|
+
await this._setPackageDistTagsAndLatestInfos(pkg, fullManifests, abbreviatedManifests);
|
|
536
|
+
await this._updatePackageManifestsToDists(pkg, fullManifests, abbreviatedManifests);
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
_mergeLatestManifestFields(fullManifests, latestManifest) {
|
|
540
|
+
if (!latestManifest)
|
|
541
|
+
return;
|
|
542
|
+
// https://github.com/npm/registry/blob/master/docs/responses/package-metadata.md#full-metadata-format
|
|
543
|
+
const fieldsFromLatestManifest = [
|
|
544
|
+
'author', 'bugs', 'contributors', 'description', 'homepage', 'keywords', 'license',
|
|
545
|
+
'readmeFilename', 'repository',
|
|
546
|
+
];
|
|
547
|
+
// the latest version metas
|
|
548
|
+
for (const field of fieldsFromLatestManifest) {
|
|
549
|
+
fullManifests[field] = latestManifest[field];
|
|
550
|
+
}
|
|
551
|
+
}
|
|
552
|
+
async _setPackageDistTagsAndLatestInfos(pkg, fullManifests, abbreviatedManifests) {
|
|
553
|
+
const distTags = await this._listPackageDistTags(pkg);
|
|
554
|
+
if (distTags.latest) {
|
|
555
|
+
const packageVersion = await this.packageRepository.findPackageVersion(pkg.packageId, distTags.latest);
|
|
556
|
+
if (packageVersion) {
|
|
557
|
+
fullManifests.readme = await this.distRepository.readDistBytesToString(packageVersion.readmeDist);
|
|
558
|
+
const latestManifest = await this.distRepository.readDistBytesToJSON(packageVersion.manifestDist);
|
|
559
|
+
this._mergeLatestManifestFields(fullManifests, latestManifest);
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
fullManifests['dist-tags'] = distTags;
|
|
563
|
+
abbreviatedManifests['dist-tags'] = distTags;
|
|
153
564
|
}
|
|
154
|
-
async
|
|
565
|
+
async _mergeManifestDist(manifestDist, mergeData, replaceData) {
|
|
566
|
+
let manifest = await this.distRepository.readDistBytesToJSON(manifestDist);
|
|
567
|
+
if (mergeData) {
|
|
568
|
+
Object.assign(manifest, mergeData);
|
|
569
|
+
}
|
|
570
|
+
if (replaceData) {
|
|
571
|
+
manifest = replaceData;
|
|
572
|
+
}
|
|
573
|
+
const manifestBytes = Buffer.from(JSON.stringify(manifest));
|
|
574
|
+
const manifestIntegrity = await (0, PackageUtil_1.calculateIntegrity)(manifestBytes);
|
|
575
|
+
manifestDist.size = manifestBytes.length;
|
|
576
|
+
manifestDist.shasum = manifestIntegrity.shasum;
|
|
577
|
+
manifestDist.integrity = manifestIntegrity.integrity;
|
|
578
|
+
await this.distRepository.saveDist(manifestDist, manifestBytes);
|
|
579
|
+
}
|
|
580
|
+
async _updatePackageManifestsToDists(pkg, fullManifests, abbreviatedManifests) {
|
|
581
|
+
var _a, _b;
|
|
582
|
+
const modified = new Date();
|
|
583
|
+
if (fullManifests) {
|
|
584
|
+
fullManifests.time.modified = modified;
|
|
585
|
+
// same to dist
|
|
586
|
+
const fullManifestsDistBytes = Buffer.from(JSON.stringify(fullManifests));
|
|
587
|
+
const fullManifestsDistIntegrity = await (0, PackageUtil_1.calculateIntegrity)(fullManifestsDistBytes);
|
|
588
|
+
if ((_a = pkg.manifestsDist) === null || _a === void 0 ? void 0 : _a.distId) {
|
|
589
|
+
pkg.manifestsDist.size = fullManifestsDistBytes.length;
|
|
590
|
+
pkg.manifestsDist.shasum = fullManifestsDistIntegrity.shasum;
|
|
591
|
+
pkg.manifestsDist.integrity = fullManifestsDistIntegrity.integrity;
|
|
592
|
+
}
|
|
593
|
+
else {
|
|
594
|
+
pkg.manifestsDist = pkg.createFullManifests({
|
|
595
|
+
size: fullManifestsDistBytes.length,
|
|
596
|
+
shasum: fullManifestsDistIntegrity.shasum,
|
|
597
|
+
integrity: fullManifestsDistIntegrity.integrity,
|
|
598
|
+
});
|
|
599
|
+
}
|
|
600
|
+
await this.distRepository.saveDist(pkg.manifestsDist, fullManifestsDistBytes);
|
|
601
|
+
await this.packageRepository.savePackageDist(pkg, true);
|
|
602
|
+
}
|
|
603
|
+
if (abbreviatedManifests) {
|
|
604
|
+
abbreviatedManifests.modified = modified;
|
|
605
|
+
const abbreviatedManifestsDistBytes = Buffer.from(JSON.stringify(abbreviatedManifests));
|
|
606
|
+
const abbreviatedManifestsDistIntegrity = await (0, PackageUtil_1.calculateIntegrity)(abbreviatedManifestsDistBytes);
|
|
607
|
+
if ((_b = pkg.abbreviatedsDist) === null || _b === void 0 ? void 0 : _b.distId) {
|
|
608
|
+
pkg.abbreviatedsDist.size = abbreviatedManifestsDistBytes.length;
|
|
609
|
+
pkg.abbreviatedsDist.shasum = abbreviatedManifestsDistIntegrity.shasum;
|
|
610
|
+
pkg.abbreviatedsDist.integrity = abbreviatedManifestsDistIntegrity.integrity;
|
|
611
|
+
}
|
|
612
|
+
else {
|
|
613
|
+
pkg.abbreviatedsDist = pkg.createAbbreviatedManifests({
|
|
614
|
+
size: abbreviatedManifestsDistBytes.length,
|
|
615
|
+
shasum: abbreviatedManifestsDistIntegrity.shasum,
|
|
616
|
+
integrity: abbreviatedManifestsDistIntegrity.integrity,
|
|
617
|
+
});
|
|
618
|
+
}
|
|
619
|
+
await this.distRepository.saveDist(pkg.abbreviatedsDist, abbreviatedManifestsDistBytes);
|
|
620
|
+
await this.packageRepository.savePackageDist(pkg, false);
|
|
621
|
+
}
|
|
622
|
+
}
|
|
623
|
+
async _listPackageFullOrAbbreviatedManifests(scope, name, isFullManifests, isSync) {
|
|
624
|
+
let etag = '';
|
|
625
|
+
let blockReason = '';
|
|
155
626
|
const pkg = await this.packageRepository.findPackage(scope, name);
|
|
156
627
|
if (!pkg)
|
|
628
|
+
return { etag, data: null, blockReason };
|
|
629
|
+
const block = await this.packageVersionBlockRepository.findPackageBlock(pkg.packageId);
|
|
630
|
+
if (block) {
|
|
631
|
+
blockReason = block.reason;
|
|
632
|
+
}
|
|
633
|
+
let bugVersion;
|
|
634
|
+
// sync mode response no bug version fixed
|
|
635
|
+
if (!isSync) {
|
|
636
|
+
bugVersion = await this.getBugVersion();
|
|
637
|
+
}
|
|
638
|
+
const fullname = (0, PackageUtil_1.getFullname)(scope, name);
|
|
639
|
+
let dist = isFullManifests ? pkg.manifestsDist : pkg.abbreviatedsDist;
|
|
640
|
+
// read from dist
|
|
641
|
+
if (dist === null || dist === void 0 ? void 0 : dist.distId) {
|
|
642
|
+
etag = `"${dist.shasum}"`;
|
|
643
|
+
const data = await this.distRepository.readDistBytesToJSON(dist);
|
|
644
|
+
if (bugVersion) {
|
|
645
|
+
await this.bugVersionService.fixPackageBugVersions(bugVersion, fullname, data.versions);
|
|
646
|
+
const distBytes = Buffer.from(JSON.stringify(data));
|
|
647
|
+
const distIntegrity = await (0, PackageUtil_1.calculateIntegrity)(distBytes);
|
|
648
|
+
etag = `"${distIntegrity.shasum}"`;
|
|
649
|
+
}
|
|
650
|
+
return { etag, data, blockReason };
|
|
651
|
+
}
|
|
652
|
+
// read from database
|
|
653
|
+
const fullManifests = isFullManifests ? await this._listPackageFullManifests(pkg) : null;
|
|
654
|
+
const abbreviatedManifests = isFullManifests ? null : await this._listPackageAbbreviatedManifests(pkg);
|
|
655
|
+
if (!fullManifests && !abbreviatedManifests) {
|
|
656
|
+
// not exists
|
|
657
|
+
return { etag, data: null, blockReason };
|
|
658
|
+
}
|
|
659
|
+
await this._updatePackageManifestsToDists(pkg, fullManifests, abbreviatedManifests);
|
|
660
|
+
const manifests = (fullManifests || abbreviatedManifests);
|
|
661
|
+
if (bugVersion) {
|
|
662
|
+
await this.bugVersionService.fixPackageBugVersions(bugVersion, fullname, manifests.versions);
|
|
663
|
+
const distBytes = Buffer.from(JSON.stringify(manifests));
|
|
664
|
+
const distIntegrity = await (0, PackageUtil_1.calculateIntegrity)(distBytes);
|
|
665
|
+
etag = `"${distIntegrity.shasum}"`;
|
|
666
|
+
}
|
|
667
|
+
else {
|
|
668
|
+
dist = isFullManifests ? pkg.manifestsDist : pkg.abbreviatedsDist;
|
|
669
|
+
etag = `"${dist.shasum}"`;
|
|
670
|
+
}
|
|
671
|
+
return { etag, data: manifests, blockReason };
|
|
672
|
+
}
|
|
673
|
+
async _listPackageMaintainers(pkg) {
|
|
674
|
+
const maintainers = [];
|
|
675
|
+
const users = await this.packageRepository.listPackageMaintainers(pkg.packageId);
|
|
676
|
+
for (const user of users) {
|
|
677
|
+
const name = user.name.startsWith('npm:') ? user.name.replace('npm:', '') : user.name;
|
|
678
|
+
maintainers.push({ name, email: user.email });
|
|
679
|
+
}
|
|
680
|
+
return maintainers;
|
|
681
|
+
}
|
|
682
|
+
async _listPackageFullManifests(pkg) {
|
|
683
|
+
// read all verions from db
|
|
684
|
+
const packageVersions = await this.packageRepository.listPackageVersions(pkg.packageId);
|
|
685
|
+
if (packageVersions.length === 0)
|
|
157
686
|
return null;
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
687
|
+
const distTags = await this._listPackageDistTags(pkg);
|
|
688
|
+
const maintainers = await this._listPackageMaintainers(pkg);
|
|
689
|
+
// https://github.com/npm/registry/blob/master/docs/responses/package-metadata.md#full-metadata-format
|
|
690
|
+
const data = {
|
|
691
|
+
_id: `${pkg.fullname}`,
|
|
162
692
|
_rev: `${pkg.id}-${pkg.packageId}`,
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
maintainers: [],
|
|
168
|
-
name: pkg.name,
|
|
169
|
-
readme: '',
|
|
170
|
-
readmeFilename: '',
|
|
693
|
+
'dist-tags': distTags,
|
|
694
|
+
// the package name
|
|
695
|
+
name: pkg.fullname,
|
|
696
|
+
// an object mapping versions to the time published, along with created and modified timestamps
|
|
171
697
|
time: {
|
|
172
|
-
'1.0.0': '',
|
|
173
|
-
created: pkg.
|
|
174
|
-
modified: pkg.
|
|
698
|
+
// '1.0.0': '2012-09-18T14:46:08.346Z',
|
|
699
|
+
created: pkg.createdAt,
|
|
700
|
+
modified: pkg.updatedAt,
|
|
175
701
|
},
|
|
702
|
+
// a mapping of semver-compliant version numbers to version data
|
|
176
703
|
versions: {},
|
|
704
|
+
// The following fields are hoisted to the top-level of the package json from the latest version published:
|
|
705
|
+
// human object
|
|
706
|
+
author: undefined,
|
|
707
|
+
bugs: undefined,
|
|
708
|
+
description: pkg.description,
|
|
709
|
+
homepage: undefined,
|
|
710
|
+
keywords: undefined,
|
|
711
|
+
// the SPDX identifier of the package's license
|
|
712
|
+
license: undefined,
|
|
713
|
+
// array of human objects for people with permission to publish this package; not authoritative but informational
|
|
714
|
+
maintainers,
|
|
715
|
+
// contributors: array of human objects
|
|
716
|
+
// the first 64K of the README data for the most-recently published version of the package
|
|
717
|
+
readme: '',
|
|
718
|
+
// The name of the file from which the readme data was taken
|
|
719
|
+
readmeFilename: undefined,
|
|
720
|
+
// as given in package.json, for the latest version
|
|
721
|
+
repository: undefined,
|
|
722
|
+
// users: an object whose keys are the npm user names of people who have starred this package
|
|
177
723
|
};
|
|
724
|
+
let lastestTagVersion = '';
|
|
725
|
+
if (distTags.latest) {
|
|
726
|
+
lastestTagVersion = distTags.latest;
|
|
727
|
+
}
|
|
728
|
+
let latestManifest;
|
|
729
|
+
let latestPackageVersion = packageVersions[0];
|
|
730
|
+
// https://github.com/npm/registry/blob/master/docs/responses/package-metadata.md#package-metadata
|
|
731
|
+
for (const packageVersion of packageVersions) {
|
|
732
|
+
const manifest = await this.distRepository.readDistBytesToJSON(packageVersion.manifestDist);
|
|
733
|
+
if (!manifest)
|
|
734
|
+
continue;
|
|
735
|
+
if ('readme' in manifest) {
|
|
736
|
+
delete manifest.readme;
|
|
737
|
+
}
|
|
738
|
+
if (lastestTagVersion && packageVersion.version === lastestTagVersion) {
|
|
739
|
+
latestManifest = manifest;
|
|
740
|
+
latestPackageVersion = packageVersion;
|
|
741
|
+
}
|
|
742
|
+
data.versions[packageVersion.version] = manifest;
|
|
743
|
+
data.time[packageVersion.version] = packageVersion.publishTime;
|
|
744
|
+
}
|
|
745
|
+
// the latest version readme
|
|
746
|
+
data.readme = await this.distRepository.readDistBytesToString(latestPackageVersion.readmeDist);
|
|
747
|
+
if (!latestManifest) {
|
|
748
|
+
latestManifest = data.versions[latestPackageVersion.version];
|
|
749
|
+
}
|
|
750
|
+
this._mergeLatestManifestFields(data, latestManifest);
|
|
751
|
+
return data;
|
|
178
752
|
}
|
|
179
|
-
async
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
753
|
+
async _listPackageAbbreviatedManifests(pkg) {
|
|
754
|
+
// read all verions from db
|
|
755
|
+
const packageVersions = await this.packageRepository.listPackageVersions(pkg.packageId);
|
|
756
|
+
if (packageVersions.length === 0)
|
|
757
|
+
return null;
|
|
758
|
+
const distTags = await this._listPackageDistTags(pkg);
|
|
759
|
+
// https://github.com/npm/registry/blob/master/docs/responses/package-metadata.md#package-metadata
|
|
760
|
+
// tiny-tarball is a small package with only one version and no dependencies.
|
|
761
|
+
const data = {
|
|
762
|
+
'dist-tags': distTags,
|
|
763
|
+
modified: pkg.updatedAt,
|
|
764
|
+
name: pkg.fullname,
|
|
765
|
+
versions: {},
|
|
766
|
+
};
|
|
767
|
+
for (const packageVersion of packageVersions) {
|
|
768
|
+
const manifest = await this.distRepository.readDistBytesToJSON(packageVersion.abbreviatedDist);
|
|
769
|
+
data.versions[packageVersion.version] = manifest;
|
|
770
|
+
}
|
|
771
|
+
return data;
|
|
188
772
|
}
|
|
189
773
|
};
|
|
774
|
+
PackageManagerService.downloadCounters = {};
|
|
190
775
|
__decorate([
|
|
191
776
|
(0, tegg_1.Inject)()
|
|
192
777
|
], PackageManagerService.prototype, "eventBus", void 0);
|
|
@@ -195,11 +780,23 @@ __decorate([
|
|
|
195
780
|
], PackageManagerService.prototype, "packageRepository", void 0);
|
|
196
781
|
__decorate([
|
|
197
782
|
(0, tegg_1.Inject)()
|
|
198
|
-
], PackageManagerService.prototype, "
|
|
199
|
-
|
|
783
|
+
], PackageManagerService.prototype, "packageVersionBlockRepository", void 0);
|
|
784
|
+
__decorate([
|
|
785
|
+
(0, tegg_1.Inject)()
|
|
786
|
+
], PackageManagerService.prototype, "packageVersionDownloadRepository", void 0);
|
|
787
|
+
__decorate([
|
|
788
|
+
(0, tegg_1.Inject)()
|
|
789
|
+
], PackageManagerService.prototype, "bugVersionService", void 0);
|
|
790
|
+
__decorate([
|
|
791
|
+
(0, tegg_1.Inject)()
|
|
792
|
+
], PackageManagerService.prototype, "bugVersionStore", void 0);
|
|
793
|
+
__decorate([
|
|
794
|
+
(0, tegg_1.Inject)()
|
|
795
|
+
], PackageManagerService.prototype, "distRepository", void 0);
|
|
796
|
+
PackageManagerService = PackageManagerService_1 = __decorate([
|
|
200
797
|
(0, tegg_1.ContextProto)({
|
|
201
798
|
accessLevel: tegg_1.AccessLevel.PUBLIC,
|
|
202
799
|
})
|
|
203
800
|
], PackageManagerService);
|
|
204
801
|
exports.PackageManagerService = PackageManagerService;
|
|
205
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGFja2FnZU1hbmFnZXJTZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vYXBwL2NvcmUvc2VydmljZS9QYWNrYWdlTWFuYWdlclNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsMENBQW1DO0FBRW5DLHNDQUEwRTtBQUMxRSwyQ0FBNEM7QUFHNUMsMERBQThEO0FBRTlELCtDQUE0QztBQUM1Qyw2REFBMEQ7QUFDMUQscURBQWtEO0FBQ2xELG9DQUlrQjtBQTBCbEIsSUFBYSxxQkFBcUIsR0FBbEMsTUFBYSxxQkFBcUI7SUFRaEMsOEVBQThFO0lBQzlFLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBc0I7UUFDbEMsSUFBSSxHQUFHLEdBQUcsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hFLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDUixHQUFHLEdBQUcsaUJBQU8sQ0FBQyxNQUFNLENBQUM7Z0JBQ25CLEtBQUssRUFBRSxHQUFHLENBQUMsS0FBSztnQkFDaEIsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJO2dCQUNkLFNBQVMsRUFBRSxHQUFHLENBQUMsU0FBUztnQkFDeEIsV0FBVyxFQUFFLEdBQUcsQ0FBQyxXQUFXO2FBQzdCLENBQUMsQ0FBQztZQUNILE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNqRDthQUFNO1lBQ0wscUJBQXFCO1lBQ3JCLHdGQUF3RjtZQUN4RixJQUFJLEdBQUcsQ0FBQyxXQUFXLEtBQUssR0FBRyxDQUFDLFdBQVcsRUFBRTtnQkFDdkMsR0FBRyxDQUFDLFdBQVcsR0FBRyxHQUFHLENBQUMsV0FBVyxDQUFDO2dCQUNsQyxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFD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
|
|
802
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGFja2FnZU1hbmFnZXJTZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vYXBwL2NvcmUvc2VydmljZS9QYWNrYWdlTWFuYWdlclNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUFBLDBDQUFtQztBQUNuQyxzQ0FLcUI7QUFDckIsMkNBQTRDO0FBRTVDLG9EQUE0QjtBQUM1QiwwREFBZ0k7QUFDaEksa0VBQStEO0FBRS9ELHNEQUFrRTtBQUtsRSwrQ0FBNEM7QUFDNUMsNkRBQTBEO0FBQzFELHVFQUFvRTtBQUNwRSxxREFBa0Q7QUFHbEQsb0NBWWtCO0FBRWxCLHFEQUFrRDtBQTBCbEQsTUFBTSxLQUFLLEdBQUcsV0FBVyxDQUFDO0FBQzFCLE1BQU0sa0JBQWtCLEdBQUcsWUFBWSxDQUFDO0FBS3hDLElBQWEscUJBQXFCLDZCQUFsQyxNQUFhLHFCQUFzQixTQUFRLGlDQUFlO0lBa0J4RCw4RUFBOEU7SUFDOUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFzQixFQUFFLFNBQWU7UUFDbkQsSUFBSSxHQUFHLEdBQUcsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hFLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDUixHQUFHLEdBQUcsaUJBQU8sQ0FBQyxNQUFNLENBQUM7Z0JBQ25CLEtBQUssRUFBRSxHQUFHLENBQUMsS0FBSztnQkFDaEIsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJO2dCQUNkLFNBQVMsRUFBRSxHQUFHLENBQUMsU0FBUztnQkFDeEIsV0FBVyxFQUFFLEdBQUcsQ0FBQyxXQUFXO2FBQzdCLENBQUMsQ0FBQztTQUNKO2FBQU07WUFDTCxxQkFBcUI7WUFDckIsd0ZBQXdGO1lBQ3hGLElBQUksR0FBRyxDQUFDLFdBQVcsS0FBSyxHQUFHLENBQUMsV0FBVyxFQUFFO2dC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
|