cnpmcore 0.0.2 → 1.2.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.
Files changed (243) hide show
  1. package/History.md +19 -0
  2. package/LICENSE +1 -1
  3. package/README.md +13 -4
  4. package/dist/app/common/AbstractService.d.ts +5 -0
  5. package/dist/app/{port/type/BaseController.js → common/AbstractService.js} +11 -9
  6. package/dist/app/common/FileUtil.d.ts +15 -0
  7. package/dist/app/common/FileUtil.js +77 -0
  8. package/dist/app/common/PackageUtil.d.ts +9 -0
  9. package/dist/app/common/PackageUtil.js +38 -16
  10. package/dist/app/common/SyncUtil.d.ts +2 -0
  11. package/dist/app/common/SyncUtil.js +17 -0
  12. package/dist/app/common/UserUtil.d.ts +5 -0
  13. package/dist/app/common/UserUtil.js +72 -0
  14. package/dist/app/common/adapter/BugVersionStore.d.ts +7 -0
  15. package/dist/app/common/adapter/BugVersionStore.js +28 -0
  16. package/dist/app/common/adapter/CacheAdapter.d.ts +13 -0
  17. package/dist/app/common/adapter/CacheAdapter.js +78 -0
  18. package/dist/app/common/adapter/NFSAdapter.d.ts +16 -0
  19. package/dist/app/common/adapter/NFSAdapter.js +62 -22
  20. package/dist/app/common/adapter/NPMRegistry.d.ts +78 -0
  21. package/dist/app/common/adapter/NPMRegistry.js +98 -0
  22. package/dist/app/common/adapter/QueueAdapter.d.ts +7 -0
  23. package/dist/app/common/adapter/QueueAdapter.js +37 -0
  24. package/dist/app/common/adapter/binary/AbstractBinary.d.ts +33 -0
  25. package/dist/app/common/adapter/binary/AbstractBinary.js +76 -0
  26. package/dist/app/common/adapter/binary/ApiBinary.d.ts +8 -0
  27. package/dist/app/common/adapter/binary/ApiBinary.js +31 -0
  28. package/dist/app/common/adapter/binary/BucketBinary.d.ts +5 -0
  29. package/dist/app/common/adapter/binary/BucketBinary.js +77 -0
  30. package/dist/app/common/adapter/binary/CypressBinary.d.ts +5 -0
  31. package/dist/app/common/adapter/binary/CypressBinary.js +63 -0
  32. package/dist/app/common/adapter/binary/ElectronBinary.d.ts +5 -0
  33. package/dist/app/common/adapter/binary/ElectronBinary.js +44 -0
  34. package/dist/app/common/adapter/binary/GithubBinary.d.ts +7 -0
  35. package/dist/app/common/adapter/binary/GithubBinary.js +93 -0
  36. package/dist/app/common/adapter/binary/ImageminBinary.d.ts +5 -0
  37. package/dist/app/common/adapter/binary/ImageminBinary.js +96 -0
  38. package/dist/app/common/adapter/binary/NodeBinary.d.ts +4 -0
  39. package/dist/app/common/adapter/binary/NodeBinary.js +41 -0
  40. package/dist/app/common/adapter/binary/NodePreGypBinary.d.ts +5 -0
  41. package/dist/app/common/adapter/binary/NodePreGypBinary.js +136 -0
  42. package/dist/app/common/adapter/binary/NwjsBinary.d.ts +6 -0
  43. package/dist/app/common/adapter/binary/NwjsBinary.js +47 -0
  44. package/dist/app/common/adapter/binary/PlaywrightBinary.d.ts +5 -0
  45. package/dist/app/common/adapter/binary/PlaywrightBinary.js +214 -0
  46. package/dist/app/common/adapter/binary/PuppeteerBinary.d.ts +6 -0
  47. package/dist/app/common/adapter/binary/PuppeteerBinary.js +125 -0
  48. package/dist/app/common/adapter/binary/SqlcipherBinary.d.ts +5 -0
  49. package/dist/app/common/adapter/binary/SqlcipherBinary.js +78 -0
  50. package/dist/app/common/aop/AsyncTimer.d.ts +9 -0
  51. package/dist/app/common/aop/AsyncTimer.js +36 -0
  52. package/dist/app/common/constants.d.ts +2 -0
  53. package/dist/app/common/constants.js +6 -0
  54. package/dist/app/common/dayjs.d.ts +2 -0
  55. package/dist/app/common/dayjs.js +10 -0
  56. package/dist/app/common/enum/Task.d.ts +12 -0
  57. package/dist/app/common/enum/Task.js +18 -0
  58. package/dist/app/common/enum/User.d.ts +5 -0
  59. package/dist/app/common/enum/User.js +10 -0
  60. package/dist/app/common/typing.d.ts +28 -0
  61. package/dist/app/common/typing.js +3 -0
  62. package/dist/app/core/entity/Binary.d.ts +28 -0
  63. package/dist/app/core/entity/Binary.js +29 -0
  64. package/dist/app/core/entity/BugVersion.d.ts +14 -0
  65. package/dist/app/core/entity/BugVersion.js +43 -0
  66. package/dist/app/core/entity/Change.d.ts +17 -0
  67. package/dist/app/core/entity/Change.js +20 -0
  68. package/dist/app/core/entity/Dist.d.ts +21 -0
  69. package/dist/app/core/entity/Dist.js +1 -2
  70. package/dist/app/core/entity/Entity.d.ts +11 -0
  71. package/dist/app/core/entity/Entity.js +3 -3
  72. package/dist/app/core/entity/Package.d.ts +45 -0
  73. package/dist/app/core/entity/Package.js +33 -25
  74. package/dist/app/core/entity/PackageTag.d.ts +17 -0
  75. package/dist/app/core/entity/PackageVersion.d.ts +26 -0
  76. package/dist/app/core/entity/PackageVersionBlock.d.ts +17 -0
  77. package/dist/app/core/entity/PackageVersionBlock.js +20 -0
  78. package/dist/app/core/entity/PackageVersionManifest.d.ts +17 -0
  79. package/dist/app/core/entity/PackageVersionManifest.js +20 -0
  80. package/dist/app/core/entity/Task.d.ts +43 -0
  81. package/dist/app/core/entity/Task.js +94 -0
  82. package/dist/app/core/entity/Token.d.ts +24 -0
  83. package/dist/app/core/entity/Token.js +23 -0
  84. package/dist/app/core/entity/User.d.ts +25 -0
  85. package/dist/app/core/entity/User.js +24 -0
  86. package/dist/app/core/event/BugVersionFixHandler.d.ts +6 -0
  87. package/dist/app/core/event/BugVersionFixHandler.js +42 -0
  88. package/dist/app/core/event/CacheCleaner.d.ts +38 -0
  89. package/dist/app/core/event/CacheCleaner.js +119 -0
  90. package/dist/app/core/event/ChangesStream.d.ts +32 -0
  91. package/dist/app/core/event/ChangesStream.js +106 -0
  92. package/dist/app/core/event/StoreManifest.d.ts +11 -0
  93. package/dist/app/core/event/StoreManifest.js +54 -0
  94. package/dist/app/core/event/index.d.ts +27 -0
  95. package/dist/app/core/event/index.js +11 -3
  96. package/dist/app/core/service/BinarySyncerService.d.ts +23 -0
  97. package/dist/app/core/service/BinarySyncerService.js +281 -0
  98. package/dist/app/core/service/BugVersionService.d.ts +11 -0
  99. package/dist/app/core/service/BugVersionService.js +86 -0
  100. package/dist/app/core/service/CacheService.d.ts +33 -0
  101. package/dist/app/core/service/CacheService.js +75 -0
  102. package/dist/app/core/service/ChangesStreamService.d.ts +11 -0
  103. package/dist/app/core/service/ChangesStreamService.js +186 -0
  104. package/dist/app/core/service/PackageManagerService.d.ts +83 -0
  105. package/dist/app/core/service/PackageManagerService.js +675 -78
  106. package/dist/app/core/service/PackageSyncerService.d.ts +24 -0
  107. package/dist/app/core/service/PackageSyncerService.js +667 -0
  108. package/dist/app/core/service/TaskService.d.ts +22 -0
  109. package/dist/app/core/service/TaskService.js +142 -0
  110. package/dist/app/core/service/UserService.d.ts +36 -0
  111. package/dist/app/core/service/UserService.js +120 -0
  112. package/dist/app/core/util/EntityUtil.d.ts +8 -0
  113. package/dist/app/core/util/EntityUtil.js +3 -3
  114. package/dist/app/infra/NFSClientAdapter.d.ts +18 -0
  115. package/dist/app/infra/NFSClientAdapter.js +74 -0
  116. package/dist/app/infra/package.json +6 -0
  117. package/dist/app/port/UserRoleManager.d.ts +24 -0
  118. package/dist/app/port/UserRoleManager.js +146 -0
  119. package/dist/app/port/controller/AbstractController.d.ts +32 -0
  120. package/dist/app/port/controller/AbstractController.js +112 -0
  121. package/dist/app/port/controller/BinarySyncController.d.ts +36 -0
  122. package/dist/app/port/controller/BinarySyncController.js +123 -0
  123. package/dist/app/port/controller/ChangesStreamController.d.ts +13 -0
  124. package/dist/app/port/controller/ChangesStreamController.js +53 -0
  125. package/dist/app/port/controller/DownloadController.d.ts +18 -0
  126. package/dist/app/port/controller/DownloadController.js +134 -0
  127. package/dist/app/port/controller/HomeController.d.ts +37 -0
  128. package/dist/app/port/controller/HomeController.js +72 -0
  129. package/dist/app/port/controller/PackageBlockController.d.ts +24 -0
  130. package/dist/app/port/controller/PackageBlockController.js +108 -0
  131. package/dist/app/port/controller/PackageSyncController.d.ts +35 -0
  132. package/dist/app/port/controller/PackageSyncController.js +205 -0
  133. package/dist/app/port/controller/PackageTagController.d.ts +12 -0
  134. package/dist/app/port/controller/PackageTagController.js +88 -0
  135. package/dist/app/port/controller/TokenController.d.ts +38 -0
  136. package/dist/app/port/controller/TokenController.js +125 -0
  137. package/dist/app/port/controller/UserController.d.ts +39 -0
  138. package/dist/app/port/controller/UserController.js +223 -0
  139. package/dist/app/port/controller/package/DownloadPackageVersionTar.d.ts +9 -0
  140. package/dist/app/port/controller/package/DownloadPackageVersionTar.js +82 -0
  141. package/dist/app/port/controller/package/RemovePackageVersionController.d.ts +8 -0
  142. package/dist/app/port/controller/package/RemovePackageVersionController.js +56 -0
  143. package/dist/app/port/controller/package/SavePackageVersionController.d.ts +48 -0
  144. package/dist/app/port/controller/package/SavePackageVersionController.js +221 -0
  145. package/dist/app/port/controller/package/ShowPackageController.d.ts +8 -0
  146. package/dist/app/port/controller/package/ShowPackageController.js +99 -0
  147. package/dist/app/port/controller/package/ShowPackageVersionController.d.ts +6 -0
  148. package/dist/app/port/controller/package/ShowPackageVersionController.js +55 -0
  149. package/dist/app/port/controller/package/UpdatePackageController.d.ts +17 -0
  150. package/dist/app/port/controller/package/UpdatePackageController.js +68 -0
  151. package/dist/app/port/middleware/AlwaysAuth.d.ts +2 -0
  152. package/dist/app/port/middleware/AlwaysAuth.js +17 -0
  153. package/dist/app/port/middleware/ErrorHandler.d.ts +2 -0
  154. package/dist/app/port/middleware/ErrorHandler.js +27 -5
  155. package/dist/app/port/middleware/Tracing.d.ts +2 -0
  156. package/dist/app/port/middleware/Tracing.js +22 -0
  157. package/dist/app/port/middleware/index.d.ts +2 -0
  158. package/dist/app/port/middleware/index.js +22 -0
  159. package/dist/app/port/typebox.d.ts +29 -0
  160. package/dist/app/port/typebox.js +71 -0
  161. package/dist/app/repository/AbstractRepository.d.ts +4 -0
  162. package/dist/app/repository/AbstractRepository.js +17 -0
  163. package/dist/app/repository/BinaryRepository.d.ts +7 -0
  164. package/dist/app/repository/BinaryRepository.js +45 -0
  165. package/dist/app/repository/ChangeRepository.d.ts +8 -0
  166. package/dist/app/repository/ChangeRepository.js +31 -0
  167. package/dist/app/repository/DistRepository.d.ts +15 -0
  168. package/dist/app/repository/DistRepository.js +69 -0
  169. package/dist/app/repository/PackageRepository.d.ts +39 -0
  170. package/dist/app/repository/PackageRepository.js +223 -36
  171. package/dist/app/repository/PackageVersionBlockRepository.d.ts +10 -0
  172. package/dist/app/repository/PackageVersionBlockRepository.js +51 -0
  173. package/dist/app/repository/PackageVersionDownloadRepository.d.ts +7 -0
  174. package/dist/app/repository/PackageVersionDownloadRepository.js +77 -0
  175. package/dist/app/repository/TaskRepository.d.ts +10 -0
  176. package/dist/app/repository/TaskRepository.js +82 -0
  177. package/dist/app/repository/UserRepository.d.ts +15 -0
  178. package/dist/app/repository/UserRepository.js +81 -0
  179. package/dist/app/repository/model/Binary.d.ts +13 -0
  180. package/dist/app/repository/model/Binary.js +53 -0
  181. package/dist/app/repository/model/Change.d.ts +10 -0
  182. package/dist/app/repository/model/Change.js +44 -0
  183. package/dist/app/repository/model/Dist.d.ts +12 -0
  184. package/dist/app/repository/model/Dist.js +10 -13
  185. package/dist/app/repository/model/HistoryTask.d.ts +18 -0
  186. package/dist/app/repository/model/HistoryTask.js +65 -0
  187. package/dist/app/repository/model/Maintainer.d.ts +8 -0
  188. package/dist/app/repository/model/Maintainer.js +36 -0
  189. package/dist/app/repository/model/Package.d.ts +13 -0
  190. package/dist/app/repository/model/Package.js +18 -9
  191. package/dist/app/repository/model/PackageDep.d.ts +11 -0
  192. package/dist/app/repository/model/PackageDep.js +9 -9
  193. package/dist/app/repository/model/PackageTag.d.ts +10 -0
  194. package/dist/app/repository/model/PackageTag.js +9 -9
  195. package/dist/app/repository/model/PackageVersion.d.ts +14 -0
  196. package/dist/app/repository/model/PackageVersion.js +9 -9
  197. package/dist/app/repository/model/PackageVersionBlock.d.ts +10 -0
  198. package/dist/app/repository/model/PackageVersionBlock.js +44 -0
  199. package/dist/app/repository/model/PackageVersionDownload.d.ts +40 -0
  200. package/dist/app/repository/model/PackageVersionDownload.js +132 -0
  201. package/dist/app/repository/model/PackageVersionManifest.d.ts +10 -0
  202. package/dist/app/repository/model/PackageVersionManifest.js +46 -0
  203. package/dist/app/repository/model/Task.d.ts +18 -0
  204. package/dist/app/repository/model/Task.js +65 -0
  205. package/dist/app/repository/model/Token.d.ts +13 -0
  206. package/dist/app/repository/model/Token.js +55 -0
  207. package/dist/app/repository/model/User.d.ts +14 -0
  208. package/dist/app/repository/model/User.js +56 -0
  209. package/dist/app/repository/util/EntityProperty.d.ts +1 -0
  210. package/dist/app/repository/util/ModelConvertor.d.ts +7 -0
  211. package/dist/app/repository/util/ModelConvertor.js +35 -2
  212. package/dist/app/repository/util/ModelConvertorUtil.d.ts +8 -0
  213. package/dist/app/schedule/ChangesStreamWorker.d.ts +8 -0
  214. package/dist/app/schedule/ChangesStreamWorker.js +27 -0
  215. package/dist/app/schedule/CheckRecentlyUpdatedPackages.d.ts +8 -0
  216. package/dist/app/schedule/CheckRecentlyUpdatedPackages.js +66 -0
  217. package/dist/app/schedule/CleanTempDir.d.ts +8 -0
  218. package/dist/app/schedule/CleanTempDir.js +48 -0
  219. package/dist/app/schedule/CreateSyncBinaryTask.d.ts +8 -0
  220. package/dist/app/schedule/CreateSyncBinaryTask.js +34 -0
  221. package/dist/app/schedule/SavePackageVersionDownloadCounter.d.ts +8 -0
  222. package/dist/app/schedule/SavePackageVersionDownloadCounter.js +21 -0
  223. package/dist/app/schedule/SyncBinaryWorker.d.ts +8 -0
  224. package/dist/app/schedule/SyncBinaryWorker.js +30 -0
  225. package/dist/app/schedule/SyncPackageWorker.d.ts +8 -0
  226. package/dist/app/schedule/SyncPackageWorker.js +44 -0
  227. package/dist/app/schedule/TaskTimeoutHandler.d.ts +9 -0
  228. package/dist/app/schedule/TaskTimeoutHandler.js +27 -0
  229. package/dist/app/schedule/UpdateTotalData.d.ts +9 -0
  230. package/dist/app/schedule/UpdateTotalData.js +103 -0
  231. package/dist/app.d.ts +11 -0
  232. package/dist/app.js +22 -0
  233. package/dist/config/binaries.d.ts +38 -0
  234. package/dist/config/binaries.js +810 -0
  235. package/dist/config/config.default.d.ts +3 -0
  236. package/dist/config/config.default.js +128 -9
  237. package/dist/config/config.unittest.d.ts +3 -0
  238. package/dist/config/config.unittest.js +18 -0
  239. package/dist/config/plugin.d.ts +3 -0
  240. package/dist/config/plugin.js +19 -3
  241. package/package.json +76 -21
  242. package/dist/app/common/adapter/NFSClientAdapter.js +0 -43
  243. package/dist/app/port/controller/PackageController.js +0 -273
@@ -0,0 +1,8 @@
1
+ import { EggContext } from '@eggjs/tegg';
2
+ import { AbstractController } from '../AbstractController';
3
+ export declare class RemovePackageVersionController extends AbstractController {
4
+ private packageManagerService;
5
+ remove(ctx: EggContext, fullname: string, filenameWithVersion: string): Promise<{
6
+ ok: boolean;
7
+ }>;
8
+ }
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
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
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
9
+ return function (target, key) { decorator(target, key, paramIndex); }
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.RemovePackageVersionController = void 0;
13
+ const egg_errors_1 = require("egg-errors");
14
+ const tegg_1 = require("@eggjs/tegg");
15
+ const AbstractController_1 = require("../AbstractController");
16
+ const PackageUtil_1 = require("../../../common/PackageUtil");
17
+ let RemovePackageVersionController = class RemovePackageVersionController extends AbstractController_1.AbstractController {
18
+ // https://github.com/npm/cli/blob/latest/lib/commands/unpublish.js#L101
19
+ // https://github.com/npm/libnpmpublish/blob/main/unpublish.js#L43
20
+ async remove(ctx, fullname, filenameWithVersion) {
21
+ const npmCommand = ctx.get('npm-command');
22
+ if (npmCommand !== 'unpublish') {
23
+ throw new egg_errors_1.BadRequestError('Only allow "unpublish" npm-command');
24
+ }
25
+ const pkg = await this.getPackageEntityAndRequiredMaintainer(ctx, fullname);
26
+ const version = this.getAndCheckVersionFromFilename(ctx, fullname, filenameWithVersion);
27
+ const packageVersion = await this.getPackageVersionEntity(pkg, version);
28
+ // https://docs.npmjs.com/policies/unpublish
29
+ // can unpublish anytime within the first 72 hours after publishing
30
+ if (pkg.isPrivate && Date.now() - packageVersion.publishTime.getTime() >= 3600000 * 72) {
31
+ throw new egg_errors_1.ForbiddenError(`${pkg.fullname}@${version} unpublish is not allowed after 72 hours of released`);
32
+ }
33
+ ctx.logger.info('[PackageController:removeVersion] %s@%s, packageVersionId: %s', pkg.fullname, version, packageVersion.packageVersionId);
34
+ await this.packageManagerService.removePackageVersion(pkg, packageVersion);
35
+ return { ok: true };
36
+ }
37
+ };
38
+ __decorate([
39
+ (0, tegg_1.Inject)()
40
+ ], RemovePackageVersionController.prototype, "packageManagerService", void 0);
41
+ __decorate([
42
+ (0, tegg_1.HTTPMethod)({
43
+ // DELETE /@cnpm/foo/-/foo-4.0.0.tgz/-rev/61af62d6295fcbd9f8f1c08f
44
+ // DELETE /:fullname/-/:filenameWithVersion.tgz/-rev/:rev
45
+ path: `/:fullname(${PackageUtil_1.FULLNAME_REG_STRING})/-/:filenameWithVersion.tgz/-rev/:rev`,
46
+ method: tegg_1.HTTPMethodEnum.DELETE,
47
+ }),
48
+ __param(0, (0, tegg_1.Context)()),
49
+ __param(1, (0, tegg_1.HTTPParam)()),
50
+ __param(2, (0, tegg_1.HTTPParam)())
51
+ ], RemovePackageVersionController.prototype, "remove", null);
52
+ RemovePackageVersionController = __decorate([
53
+ (0, tegg_1.HTTPController)()
54
+ ], RemovePackageVersionController);
55
+ exports.RemovePackageVersionController = RemovePackageVersionController;
56
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVtb3ZlUGFja2FnZVZlcnNpb25Db250cm9sbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vYXBwL3BvcnQvY29udHJvbGxlci9wYWNrYWdlL1JlbW92ZVBhY2thZ2VWZXJzaW9uQ29udHJvbGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQSwyQ0FHb0I7QUFDcEIsc0NBUXFCO0FBQ3JCLDhEQUEyRDtBQUMzRCw2REFBa0U7QUFJbEUsSUFBYSw4QkFBOEIsR0FBM0MsTUFBYSw4QkFBK0IsU0FBUSx1Q0FBa0I7SUFJcEUsd0VBQXdFO0lBQ3hFLGtFQUFrRTtJQU9sRSxLQUFLLENBQUMsTUFBTSxDQUFZLEdBQWUsRUFBZSxRQUFnQixFQUFlLG1CQUEyQjtRQUM5RyxNQUFNLFVBQVUsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzFDLElBQUksVUFBVSxLQUFLLFdBQVcsRUFBRTtZQUM5QixNQUFNLElBQUksNEJBQWUsQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDO1NBQ2pFO1FBQ0QsTUFBTSxHQUFHLEdBQUcsTUFBTSxJQUFJLENBQUMscUNBQXFDLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQzVFLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxHQUFHLEVBQUUsUUFBUSxFQUFFLG1CQUFtQixDQUFDLENBQUM7UUFDeEYsTUFBTSxjQUFjLEdBQUcsTUFBTSxJQUFJLENBQUMsdUJBQXVCLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3hFLDRDQUE0QztRQUM1QyxtRUFBbUU7UUFDbkUsSUFBSSxHQUFHLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxjQUFjLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxJQUFJLE9BQU8sR0FBRyxFQUFFLEVBQUU7WUFDdEYsTUFBTSxJQUFJLDJCQUFjLENBQUMsR0FBRyxHQUFHLENBQUMsUUFBUSxJQUFJLE9BQU8sc0RBQXNELENBQUMsQ0FBQztTQUM1RztRQUNELEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLCtEQUErRCxFQUM3RSxHQUFHLENBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRSxjQUFjLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUMxRCxNQUFNLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFDM0UsT0FBTyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUN0QixDQUFDO0NBQ0YsQ0FBQTtBQTVCQztJQURDLElBQUEsYUFBTSxHQUFFOzZFQUM0QztBQVVyRDtJQU5DLElBQUEsaUJBQVUsRUFBQztRQUNWLGtFQUFrRTtRQUNsRSx5REFBeUQ7UUFDekQsSUFBSSxFQUFFLGNBQWMsaUNBQW1CLHdDQUF3QztRQUMvRSxNQUFNLEVBQUUscUJBQWMsQ0FBQyxNQUFNO0tBQzlCLENBQUM7SUFDWSxXQUFBLElBQUEsY0FBTyxHQUFFLENBQUE7SUFBbUIsV0FBQSxJQUFBLGdCQUFTLEdBQUUsQ0FBQTtJQUFvQixXQUFBLElBQUEsZ0JBQVMsR0FBRSxDQUFBOzREQWlCbkY7QUE3QlUsOEJBQThCO0lBRDFDLElBQUEscUJBQWMsR0FBRTtHQUNKLDhCQUE4QixDQThCMUM7QUE5Qlksd0VBQThCIn0=
@@ -0,0 +1,48 @@
1
+ import { PackageJson, Simplify } from 'type-fest';
2
+ import { EggContext } from '@eggjs/tegg';
3
+ import { Static } from '@sinclair/typebox';
4
+ import { AbstractController } from '../AbstractController';
5
+ declare type PackageVersion = Simplify<PackageJson.PackageJsonStandard & {
6
+ name: 'string';
7
+ version: 'string';
8
+ deprecated?: 'string';
9
+ readme?: 'string';
10
+ dist?: {
11
+ shasum: string;
12
+ integrity: string;
13
+ [key: string]: string | number;
14
+ };
15
+ }>;
16
+ declare const FullPackageRule: import("@sinclair/typebox").TObject<{
17
+ name: import("@sinclair/typebox").TString;
18
+ versions: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TAny>;
19
+ _attachments: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TAny>;
20
+ description: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
21
+ 'dist-tags': import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TRecord<import("@sinclair/typebox").TString, import("@sinclair/typebox").TString>>;
22
+ readme: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
23
+ }>;
24
+ declare type FullPackage = Omit<Static<typeof FullPackageRule>, 'versions' | '_attachments'> & {
25
+ versions: {
26
+ [key: string]: PackageVersion;
27
+ };
28
+ } & {
29
+ _attachments: {
30
+ [key: string]: {
31
+ content_type: string;
32
+ data: string;
33
+ length: number;
34
+ };
35
+ };
36
+ };
37
+ export declare class SavePackageVersionController extends AbstractController {
38
+ private packageManagerService;
39
+ save(ctx: EggContext, fullname: string, pkg: FullPackage): Promise<{
40
+ ok: boolean;
41
+ } | {
42
+ ok: boolean;
43
+ rev: string;
44
+ }>;
45
+ private saveDeprecatedVersions;
46
+ private validateNpmCommand;
47
+ }
48
+ export {};
@@ -0,0 +1,221 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
19
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
20
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
21
+ 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;
22
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
23
+ };
24
+ var __importStar = (this && this.__importStar) || function (mod) {
25
+ if (mod && mod.__esModule) return mod;
26
+ var result = {};
27
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
28
+ __setModuleDefault(result, mod);
29
+ return result;
30
+ };
31
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
32
+ return function (target, key) { decorator(target, key, paramIndex); }
33
+ };
34
+ var __importDefault = (this && this.__importDefault) || function (mod) {
35
+ return (mod && mod.__esModule) ? mod : { "default": mod };
36
+ };
37
+ Object.defineProperty(exports, "__esModule", { value: true });
38
+ exports.SavePackageVersionController = void 0;
39
+ const egg_errors_1 = require("egg-errors");
40
+ const tegg_1 = require("@eggjs/tegg");
41
+ const ssri = __importStar(require("ssri"));
42
+ const validate_npm_package_name_1 = __importDefault(require("validate-npm-package-name"));
43
+ const typebox_1 = require("@sinclair/typebox");
44
+ const AbstractController_1 = require("../AbstractController");
45
+ const PackageUtil_1 = require("../../../common/PackageUtil");
46
+ const typebox_2 = require("../../typebox");
47
+ const FullPackageRule = typebox_1.Type.Object({
48
+ name: typebox_2.Name,
49
+ // Since we don't validate versions & _attachments previous, here we use Type.Any() just for object validate
50
+ versions: typebox_1.Type.Optional(typebox_1.Type.Any()),
51
+ _attachments: typebox_1.Type.Optional(typebox_1.Type.Any()),
52
+ description: typebox_1.Type.Optional(typebox_2.Description),
53
+ 'dist-tags': typebox_1.Type.Optional(typebox_1.Type.Record(typebox_1.Type.String(), typebox_1.Type.String())),
54
+ readme: typebox_1.Type.Optional(typebox_1.Type.String({ transform: ['trim'] })),
55
+ });
56
+ // base64 regex https://stackoverflow.com/questions/475074/regex-to-parse-or-validate-base64-data/475217#475217
57
+ const PACKAGE_ATTACH_DATA_RE = /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/;
58
+ let SavePackageVersionController = class SavePackageVersionController extends AbstractController_1.AbstractController {
59
+ // https://github.com/cnpm/cnpmjs.org/blob/master/docs/registry-api.md#publish-a-new-package
60
+ // https://github.com/npm/libnpmpublish/blob/main/publish.js#L43
61
+ async save(ctx, fullname, pkg) {
62
+ var _a, _b, _c, _d;
63
+ this.validateNpmCommand(ctx);
64
+ ctx.tValidate(FullPackageRule, pkg);
65
+ fullname = fullname.trim();
66
+ if (fullname !== pkg.name) {
67
+ throw new egg_errors_1.UnprocessableEntityError(`fullname(${fullname}) not match package.name(${pkg.name})`);
68
+ }
69
+ // Using https://github.com/npm/validate-npm-package-name to validate package name
70
+ const validateResult = (0, validate_npm_package_name_1.default)(pkg.name);
71
+ if (!validateResult.validForNewPackages) {
72
+ const errors = (validateResult.errors || validateResult.warnings).join(', ');
73
+ throw new egg_errors_1.UnprocessableEntityError(`package.name invalid, errors: ${errors}`);
74
+ }
75
+ const versions = Object.values(pkg.versions);
76
+ if (versions.length === 0) {
77
+ throw new egg_errors_1.UnprocessableEntityError('versions is empty');
78
+ }
79
+ // auth maintainter
80
+ const attachments = (_a = pkg._attachments) !== null && _a !== void 0 ? _a : {};
81
+ const attachmentFilename = Object.keys(attachments)[0];
82
+ if (!attachmentFilename) {
83
+ // `deprecated: ''` meaning remove deprecated message
84
+ const isDeprecatedRequest = versions.some(version => 'deprecated' in version);
85
+ // handle deprecated request
86
+ // PUT /:fullname?write=true
87
+ // https://github.com/npm/cli/blob/latest/lib/commands/deprecate.js#L48
88
+ if (isDeprecatedRequest) {
89
+ return await this.saveDeprecatedVersions(ctx, pkg.name, versions);
90
+ }
91
+ // invalid attachments
92
+ throw new egg_errors_1.UnprocessableEntityError('_attachments is empty');
93
+ }
94
+ // handle add new version
95
+ const packageVersion = versions[0];
96
+ // check version format
97
+ ctx.tValidate(typebox_2.VersionRule, packageVersion);
98
+ const attachment = attachments[attachmentFilename];
99
+ const distTags = (_b = pkg['dist-tags']) !== null && _b !== void 0 ? _b : {};
100
+ const tagName = Object.keys(distTags)[0];
101
+ if (!tagName) {
102
+ throw new egg_errors_1.UnprocessableEntityError('dist-tags is empty');
103
+ }
104
+ const tagWithVersion = { tag: tagName, version: distTags[tagName] };
105
+ ctx.tValidate(typebox_2.TagWithVersionRule, tagWithVersion);
106
+ if (tagWithVersion.version !== packageVersion.version) {
107
+ throw new egg_errors_1.UnprocessableEntityError(`dist-tags version "${tagWithVersion.version}" not match package version "${packageVersion.version}"`);
108
+ }
109
+ // check attachment data format and size
110
+ if (!attachment.data || typeof attachment.data !== 'string' || !PACKAGE_ATTACH_DATA_RE.test(attachment.data)) {
111
+ throw new egg_errors_1.UnprocessableEntityError('attachment.data format invalid');
112
+ }
113
+ const tarballBytes = Buffer.from(attachment.data, 'base64');
114
+ if (tarballBytes.length !== attachment.length) {
115
+ throw new egg_errors_1.UnprocessableEntityError(`attachment size ${attachment.length} not match download size ${tarballBytes.length}`);
116
+ }
117
+ // check integrity or shasum
118
+ const integrity = (_c = packageVersion.dist) === null || _c === void 0 ? void 0 : _c.integrity;
119
+ // for content security reason
120
+ // check integrity
121
+ if (integrity) {
122
+ const algorithm = ssri.checkData(tarballBytes, integrity);
123
+ if (!algorithm) {
124
+ throw new egg_errors_1.UnprocessableEntityError('dist.integrity invalid');
125
+ }
126
+ }
127
+ else {
128
+ const integrityObj = ssri.fromData(tarballBytes, {
129
+ algorithms: ['sha1'],
130
+ });
131
+ const shasum = integrityObj.sha1[0].hexDigest();
132
+ if (((_d = packageVersion.dist) === null || _d === void 0 ? void 0 : _d.shasum) && packageVersion.dist.shasum !== shasum) {
133
+ // if integrity not exists, check shasum
134
+ throw new egg_errors_1.UnprocessableEntityError('dist.shasum invalid');
135
+ }
136
+ }
137
+ const authorizedUser = await this.userRoleManager.requiredAuthorizedUser(ctx, 'publish');
138
+ const [scope, name] = (0, PackageUtil_1.getScopeAndName)(fullname);
139
+ // check scope white list
140
+ await this.userRoleManager.requiredPackageScope(scope, authorizedUser);
141
+ // FIXME: maybe better code style?
142
+ let existsPackage = null;
143
+ try {
144
+ existsPackage = await this.getPackageEntityByFullname(fullname);
145
+ }
146
+ catch (err) {
147
+ if (err instanceof egg_errors_1.NotFoundError) {
148
+ existsPackage = null;
149
+ }
150
+ }
151
+ if (existsPackage) {
152
+ await this.userRoleManager.requiredPackageMaintainer(existsPackage, authorizedUser);
153
+ }
154
+ // make sure readme is string
155
+ const readme = typeof packageVersion.readme === 'string' ? packageVersion.readme : '';
156
+ // remove readme
157
+ packageVersion.readme = undefined;
158
+ // make sure description is string
159
+ if (typeof packageVersion.description !== 'string') {
160
+ packageVersion.description = '';
161
+ }
162
+ const packageVersionEntity = await this.packageManagerService.publish({
163
+ scope,
164
+ name,
165
+ version: packageVersion.version,
166
+ description: packageVersion.description,
167
+ packageJson: packageVersion,
168
+ readme,
169
+ dist: {
170
+ content: tarballBytes,
171
+ },
172
+ tag: tagWithVersion.tag,
173
+ isPrivate: true,
174
+ }, authorizedUser);
175
+ this.logger.info('[package:version:add] %s@%s, packageVersionId: %s, tag: %s, userId: %s', packageVersion.name, packageVersion.version, packageVersionEntity.packageVersionId, tagWithVersion.tag, authorizedUser.userId);
176
+ ctx.status = 201;
177
+ return {
178
+ ok: true,
179
+ rev: `${packageVersionEntity.id}-${packageVersionEntity.packageVersionId}`,
180
+ };
181
+ }
182
+ // https://github.com/cnpm/cnpmjs.org/issues/415
183
+ async saveDeprecatedVersions(ctx, fullname, versions) {
184
+ const pkg = await this.getPackageEntityAndRequiredMaintainer(ctx, fullname);
185
+ await this.packageManagerService.saveDeprecatedVersions(pkg, versions.map(v => {
186
+ return { version: v.version, deprecated: v.deprecated };
187
+ }));
188
+ return { ok: true };
189
+ }
190
+ validateNpmCommand(ctx) {
191
+ // forbidden star/unstar request
192
+ // npm@6: referer: 'star [REDACTED]'
193
+ // npm@>=7: 'npm-command': 'star'
194
+ let command = ctx.get('npm-command');
195
+ if (!command) {
196
+ command = ctx.get('referer').split(' ', 1)[0];
197
+ }
198
+ if (command === 'star' || command === 'unstar') {
199
+ throw new egg_errors_1.ForbiddenError(`npm ${command} is not allowed`);
200
+ }
201
+ }
202
+ };
203
+ __decorate([
204
+ (0, tegg_1.Inject)()
205
+ ], SavePackageVersionController.prototype, "packageManagerService", void 0);
206
+ __decorate([
207
+ (0, tegg_1.HTTPMethod)({
208
+ // PUT /:fullname
209
+ // https://www.npmjs.com/package/path-to-regexp#custom-matching-parameters
210
+ path: `/:fullname(${PackageUtil_1.FULLNAME_REG_STRING})`,
211
+ method: tegg_1.HTTPMethodEnum.PUT,
212
+ }),
213
+ __param(0, (0, tegg_1.Context)()),
214
+ __param(1, (0, tegg_1.HTTPParam)()),
215
+ __param(2, (0, tegg_1.HTTPBody)())
216
+ ], SavePackageVersionController.prototype, "save", null);
217
+ SavePackageVersionController = __decorate([
218
+ (0, tegg_1.HTTPController)()
219
+ ], SavePackageVersionController);
220
+ exports.SavePackageVersionController = SavePackageVersionController;
221
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2F2ZVBhY2thZ2VWZXJzaW9uQ29udHJvbGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2FwcC9wb3J0L2NvbnRyb2xsZXIvcGFja2FnZS9TYXZlUGFja2FnZVZlcnNpb25Db250cm9sbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQ0EsMkNBSW9CO0FBQ3BCLHNDQVNxQjtBQUNyQiwyQ0FBNkI7QUFDN0IsMEZBQStEO0FBQy9ELCtDQUFpRDtBQUNqRCw4REFBMkQ7QUFDM0QsNkRBQW1GO0FBR25GLDJDQUt1QjtBQWN2QixNQUFNLGVBQWUsR0FBRyxjQUFJLENBQUMsTUFBTSxDQUFDO0lBQ2xDLElBQUksRUFBRSxjQUFRO0lBQ2QsNEdBQTRHO0lBQzVHLFFBQVEsRUFBRSxjQUFJLENBQUMsUUFBUSxDQUFDLGNBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUNuQyxZQUFZLEVBQUUsY0FBSSxDQUFDLFFBQVEsQ0FBQyxjQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDdkMsV0FBVyxFQUFFLGNBQUksQ0FBQyxRQUFRLENBQUMscUJBQWUsQ0FBQztJQUMzQyxXQUFXLEVBQUUsY0FBSSxDQUFDLFFBQVEsQ0FBQyxjQUFJLENBQUMsTUFBTSxDQUFDLGNBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxjQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUNyRSxNQUFNLEVBQUUsY0FBSSxDQUFDLFFBQVEsQ0FBQyxjQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsU0FBUyxFQUFFLENBQUUsTUFBTSxDQUFFLEVBQUUsQ0FBQyxDQUFDO0NBQzlELENBQUMsQ0FBQztBQVlILCtHQUErRztBQUMvRyxNQUFNLHNCQUFzQixHQUFHLGtFQUFrRSxDQUFDO0FBR2xHLElBQWEsNEJBQTRCLEdBQXpDLE1BQWEsNEJBQTZCLFNBQVEsdUNBQWtCO0lBSWxFLDRGQUE0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
@@ -0,0 +1,8 @@
1
+ /// <reference types="node" />
2
+ import { EggContext } from '@eggjs/tegg';
3
+ import { AbstractController } from '../AbstractController';
4
+ export declare class ShowPackageController extends AbstractController {
5
+ private packageManagerService;
6
+ private cacheService;
7
+ show(ctx: EggContext, fullname: string): Promise<Buffer | undefined>;
8
+ }
@@ -0,0 +1,99 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
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
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
9
+ return function (target, key) { decorator(target, key, paramIndex); }
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.ShowPackageController = void 0;
13
+ const tegg_1 = require("@eggjs/tegg");
14
+ const AbstractController_1 = require("../AbstractController");
15
+ const PackageUtil_1 = require("../../../common/PackageUtil");
16
+ const SyncUtil_1 = require("../../../common/SyncUtil");
17
+ let ShowPackageController = class ShowPackageController extends AbstractController_1.AbstractController {
18
+ async show(ctx, fullname) {
19
+ const [scope, name] = (0, PackageUtil_1.getScopeAndName)(fullname);
20
+ const isSync = (0, SyncUtil_1.isSyncWorkerRequest)(ctx);
21
+ const abbreviatedMetaType = 'application/vnd.npm.install-v1+json';
22
+ const isFullManifests = ctx.accepts(['json', abbreviatedMetaType]) !== abbreviatedMetaType;
23
+ // handle cache
24
+ const cacheEtag = await this.cacheService.getPackageEtag(fullname, isFullManifests);
25
+ if (cacheEtag) {
26
+ let requestEtag = ctx.request.get('if-none-match');
27
+ if (requestEtag.startsWith('W/')) {
28
+ requestEtag = requestEtag.substring(2);
29
+ }
30
+ if (requestEtag === cacheEtag) {
31
+ // make sure CDN cache header set here
32
+ this.setCDNHeaders(ctx);
33
+ // match etag, set status 304
34
+ ctx.status = 304;
35
+ return;
36
+ }
37
+ // get cache pkg data
38
+ const cacheBytes = await this.cacheService.getPackageManifests(fullname, isFullManifests);
39
+ if (cacheBytes && cacheBytes.length > 0) {
40
+ ctx.set('etag', `W/${cacheEtag}`);
41
+ ctx.type = 'json';
42
+ this.setCDNHeaders(ctx);
43
+ return cacheBytes;
44
+ }
45
+ }
46
+ // handle cache miss
47
+ let result;
48
+ if (isFullManifests) {
49
+ result = await this.packageManagerService.listPackageFullManifests(scope, name, isSync);
50
+ }
51
+ else {
52
+ result = await this.packageManagerService.listPackageAbbreviatedManifests(scope, name, isSync);
53
+ }
54
+ const { etag, data, blockReason } = result;
55
+ // 404, no data
56
+ if (!etag) {
57
+ // don't set cdn header, no cdn cache for new package to sync as soon as possible
58
+ throw this.createPackageNotFoundError(fullname);
59
+ }
60
+ if (blockReason) {
61
+ this.setCDNHeaders(ctx);
62
+ throw this.createPackageBlockError(blockReason, fullname);
63
+ }
64
+ const cacheBytes = Buffer.from(JSON.stringify(data));
65
+ // only set cache with normal request
66
+ // sync request response with no bug version fixed
67
+ if (!isSync) {
68
+ await this.cacheService.savePackageEtagAndManifests(fullname, isFullManifests, etag, cacheBytes);
69
+ }
70
+ // set etag
71
+ // https://forum.nginx.org/read.php?2,240120,240120#msg-240120
72
+ // should set weak etag avoid nginx remove it
73
+ ctx.set('etag', `W/${etag}`);
74
+ ctx.type = 'json';
75
+ this.setCDNHeaders(ctx);
76
+ return cacheBytes;
77
+ }
78
+ };
79
+ __decorate([
80
+ (0, tegg_1.Inject)()
81
+ ], ShowPackageController.prototype, "packageManagerService", void 0);
82
+ __decorate([
83
+ (0, tegg_1.Inject)()
84
+ ], ShowPackageController.prototype, "cacheService", void 0);
85
+ __decorate([
86
+ (0, tegg_1.HTTPMethod)({
87
+ // GET /:fullname
88
+ // https://www.npmjs.com/package/path-to-regexp#custom-matching-parameters
89
+ path: `/:fullname(${PackageUtil_1.FULLNAME_REG_STRING})`,
90
+ method: tegg_1.HTTPMethodEnum.GET,
91
+ }),
92
+ __param(0, (0, tegg_1.Context)()),
93
+ __param(1, (0, tegg_1.HTTPParam)())
94
+ ], ShowPackageController.prototype, "show", null);
95
+ ShowPackageController = __decorate([
96
+ (0, tegg_1.HTTPController)()
97
+ ], ShowPackageController);
98
+ exports.ShowPackageController = ShowPackageController;
99
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2hvd1BhY2thZ2VDb250cm9sbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vYXBwL3BvcnQvY29udHJvbGxlci9wYWNrYWdlL1Nob3dQYWNrYWdlQ29udHJvbGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQSxzQ0FRcUI7QUFDckIsOERBQTJEO0FBQzNELDZEQUFtRjtBQUNuRix1REFBK0Q7QUFLL0QsSUFBYSxxQkFBcUIsR0FBbEMsTUFBYSxxQkFBc0IsU0FBUSx1Q0FBa0I7SUFZM0QsS0FBSyxDQUFDLElBQUksQ0FBWSxHQUFlLEVBQWUsUUFBZ0I7UUFDbEUsTUFBTSxDQUFFLEtBQUssRUFBRSxJQUFJLENBQUUsR0FBRyxJQUFBLDZCQUFlLEVBQUMsUUFBUSxDQUFDLENBQUM7UUFDbEQsTUFBTSxNQUFNLEdBQUcsSUFBQSw4QkFBbUIsRUFBQyxHQUFHLENBQUMsQ0FBQztRQUN4QyxNQUFNLG1CQUFtQixHQUFHLHFDQUFxQyxDQUFDO1FBQ2xFLE1BQU0sZUFBZSxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBRSxNQUFNLEVBQUUsbUJBQW1CLENBQUUsQ0FBQyxLQUFLLG1CQUFtQixDQUFDO1FBQzdGLGVBQWU7UUFDZixNQUFNLFNBQVMsR0FBRyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxlQUFlLENBQUMsQ0FBQztRQUNwRixJQUFJLFNBQVMsRUFBRTtZQUNiLElBQUksV0FBVyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQ25ELElBQUksV0FBVyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDaEMsV0FBVyxHQUFHLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDeEM7WUFDRCxJQUFJLFdBQVcsS0FBSyxTQUFTLEVBQUU7Z0JBQzdCLHNDQUFzQztnQkFDdEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDeEIsNkJBQTZCO2dCQUM3QixHQUFHLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQztnQkFDakIsT0FBTzthQUNSO1lBQ0QscUJBQXFCO1lBQ3JCLE1BQU0sVUFBVSxHQUFHLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLEVBQUUsZUFBZSxDQUFDLENBQUM7WUFDMUYsSUFBSSxVQUFVLElBQUksVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQ3ZDLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLEtBQUssU0FBUyxFQUFFLENBQUMsQ0FBQztnQkFDbEMsR0FBRyxDQUFDLElBQUksR0FBRyxNQUFNLENBQUM7Z0JBQ2xCLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3hCLE9BQU8sVUFBVSxDQUFDO2FBQ25CO1NBQ0Y7UUFFRCxvQkFBb0I7UUFDcEIsSUFBSSxNQUF3RCxDQUFDO1FBQzdELElBQUksZUFBZSxFQUFFO1lBQ25CLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyx3QkFBd0IsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1NBQ3pGO2FBQU07WUFDTCxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMscUJBQXFCLENBQUMsK0JBQStCLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztTQUNoRztRQUNELE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxHQUFHLE1BQU0sQ0FBQztRQUMzQyxlQUFlO1FBQ2YsSUFBSSxDQUFDLElBQUksRUFBRTtZQUNULGlGQUFpRjtZQUNqRixNQUFNLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUNqRDtRQUNELElBQUksV0FBVyxFQUFFO1lBQ2YsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN4QixNQUFNLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxXQUFXLEVBQUUsUUFBUSxDQUFDLENBQUM7U0FDM0Q7UUFFRCxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNyRCxxQ0FBcUM7UUFDckMsa0RBQWtEO1FBQ2xELElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDWCxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsMkJBQTJCLENBQUMsUUFBUSxFQUFFLGVBQWUsRUFBRSxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUM7U0FDbEc7UUFFRCxXQUFXO1FBQ1gsOERBQThEO1FBQzlELDZDQUE2QztRQUM3QyxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxLQUFLLElBQUksRUFBRSxDQUFDLENBQUM7UUFDN0IsR0FBRyxDQUFDLElBQUksR0FBRyxNQUFNLENBQUM7UUFDbEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN4QixPQUFPLFVBQVUsQ0FBQztJQUNwQixDQUFDO0NBQ0YsQ0FBQTtBQXhFQztJQURDLElBQUEsYUFBTSxHQUFFO29FQUM0QztBQUVyRDtJQURDLElBQUEsYUFBTSxHQUFFOzJEQUMwQjtBQVFuQztJQU5DLElBQUEsaUJBQVUsRUFBQztRQUNWLGlCQUFpQjtRQUNqQiwwRUFBMEU7UUFDMUUsSUFBSSxFQUFFLGNBQWMsaUNBQW1CLEdBQUc7UUFDMUMsTUFBTSxFQUFFLHFCQUFjLENBQUMsR0FBRztLQUMzQixDQUFDO0lBQ1UsV0FBQSxJQUFBLGNBQU8sR0FBRSxDQUFBO0lBQW1CLFdBQUEsSUFBQSxnQkFBUyxHQUFFLENBQUE7aURBNkRsRDtBQXpFVSxxQkFBcUI7SUFEakMsSUFBQSxxQkFBYyxHQUFFO0dBQ0oscUJBQXFCLENBMEVqQztBQTFFWSxzREFBcUIifQ==
@@ -0,0 +1,6 @@
1
+ import { EggContext } from '@eggjs/tegg';
2
+ import { AbstractController } from '../AbstractController';
3
+ export declare class ShowPackageVersionController extends AbstractController {
4
+ private packageManagerService;
5
+ show(ctx: EggContext, fullname: string, versionOrTag: string): Promise<any>;
6
+ }
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
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
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
9
+ return function (target, key) { decorator(target, key, paramIndex); }
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.ShowPackageVersionController = void 0;
13
+ const tegg_1 = require("@eggjs/tegg");
14
+ const AbstractController_1 = require("../AbstractController");
15
+ const PackageUtil_1 = require("../../../common/PackageUtil");
16
+ const SyncUtil_1 = require("../../../common/SyncUtil");
17
+ const egg_errors_1 = require("egg-errors");
18
+ let ShowPackageVersionController = class ShowPackageVersionController extends AbstractController_1.AbstractController {
19
+ async show(ctx, fullname, versionOrTag) {
20
+ // https://github.com/npm/registry/blob/master/docs/responses/package-metadata.md#full-metadata-format
21
+ const [scope, name] = (0, PackageUtil_1.getScopeAndName)(fullname);
22
+ const isSync = (0, SyncUtil_1.isSyncWorkerRequest)(ctx);
23
+ const { blockReason, manifest, pkgId } = await this.packageManagerService.showPackageVersionManifest(scope, name, versionOrTag, isSync);
24
+ if (!pkgId) {
25
+ throw this.createPackageNotFoundError(fullname);
26
+ }
27
+ if (blockReason) {
28
+ this.setCDNHeaders(ctx);
29
+ throw this.createPackageBlockError(blockReason, fullname, versionOrTag);
30
+ }
31
+ if (!manifest) {
32
+ throw new egg_errors_1.NotFoundError(`${fullname}@${versionOrTag} not found`);
33
+ }
34
+ this.setCDNHeaders(ctx);
35
+ return manifest;
36
+ }
37
+ };
38
+ __decorate([
39
+ (0, tegg_1.Inject)()
40
+ ], ShowPackageVersionController.prototype, "packageManagerService", void 0);
41
+ __decorate([
42
+ (0, tegg_1.HTTPMethod)({
43
+ // GET /:fullname/:versionOrTag
44
+ path: `/:fullname(${PackageUtil_1.FULLNAME_REG_STRING})/:versionOrTag`,
45
+ method: tegg_1.HTTPMethodEnum.GET,
46
+ }),
47
+ __param(0, (0, tegg_1.Context)()),
48
+ __param(1, (0, tegg_1.HTTPParam)()),
49
+ __param(2, (0, tegg_1.HTTPParam)())
50
+ ], ShowPackageVersionController.prototype, "show", null);
51
+ ShowPackageVersionController = __decorate([
52
+ (0, tegg_1.HTTPController)()
53
+ ], ShowPackageVersionController);
54
+ exports.ShowPackageVersionController = ShowPackageVersionController;
55
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2hvd1BhY2thZ2VWZXJzaW9uQ29udHJvbGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2FwcC9wb3J0L2NvbnRyb2xsZXIvcGFja2FnZS9TaG93UGFja2FnZVZlcnNpb25Db250cm9sbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUFBLHNDQVFxQjtBQUNyQiw4REFBMkQ7QUFDM0QsNkRBQW1GO0FBQ25GLHVEQUErRDtBQUUvRCwyQ0FBMkM7QUFHM0MsSUFBYSw0QkFBNEIsR0FBekMsTUFBYSw0QkFBNkIsU0FBUSx1Q0FBa0I7SUFTbEUsS0FBSyxDQUFDLElBQUksQ0FBWSxHQUFlLEVBQWUsUUFBZ0IsRUFBZSxZQUFvQjtRQUNyRyxzR0FBc0c7UUFDdEcsTUFBTSxDQUFFLEtBQUssRUFBRSxJQUFJLENBQUUsR0FBRyxJQUFBLDZCQUFlLEVBQUMsUUFBUSxDQUFDLENBQUM7UUFDbEQsTUFBTSxNQUFNLEdBQUcsSUFBQSw4QkFBbUIsRUFBQyxHQUFHLENBQUMsQ0FBQztRQUN4QyxNQUFNLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsR0FBRyxNQUFNLElBQUksQ0FBQyxxQkFBcUIsQ0FBQywwQkFBMEIsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxNQUFNLENBQUMsQ0FBQztRQUN4SSxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ1YsTUFBTSxJQUFJLENBQUMsMEJBQTBCLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDakQ7UUFDRCxJQUFJLFdBQVcsRUFBRTtZQUNmLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDeEIsTUFBTSxJQUFJLENBQUMsdUJBQXVCLENBQUMsV0FBVyxFQUFFLFFBQVEsRUFBRSxZQUFZLENBQUMsQ0FBQztTQUN6RTtRQUNELElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDYixNQUFNLElBQUksMEJBQWEsQ0FBQyxHQUFHLFFBQVEsSUFBSSxZQUFZLFlBQVksQ0FBQyxDQUFDO1NBQ2xFO1FBQ0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN4QixPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0NBQ0YsQ0FBQTtBQXpCQztJQURDLElBQUEsYUFBTSxHQUFFOzJFQUM0QztBQU9yRDtJQUxDLElBQUEsaUJBQVUsRUFBQztRQUNWLCtCQUErQjtRQUMvQixJQUFJLEVBQUUsY0FBYyxpQ0FBbUIsaUJBQWlCO1FBQ3hELE1BQU0sRUFBRSxxQkFBYyxDQUFDLEdBQUc7S0FDM0IsQ0FBQztJQUNVLFdBQUEsSUFBQSxjQUFPLEdBQUUsQ0FBQTtJQUFtQixXQUFBLElBQUEsZ0JBQVMsR0FBRSxDQUFBO0lBQW9CLFdBQUEsSUFBQSxnQkFBUyxHQUFFLENBQUE7d0RBaUJqRjtBQTFCVSw0QkFBNEI7SUFEeEMsSUFBQSxxQkFBYyxHQUFFO0dBQ0osNEJBQTRCLENBMkJ4QztBQTNCWSxvRUFBNEIifQ==
@@ -0,0 +1,17 @@
1
+ import { EggContext } from '@eggjs/tegg';
2
+ import { Static } from '@sinclair/typebox';
3
+ import { AbstractController } from '../AbstractController';
4
+ declare const MaintainerDataRule: import("@sinclair/typebox").TObject<{
5
+ maintainers: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
6
+ name: import("@sinclair/typebox").TString;
7
+ email: import("@sinclair/typebox").TString;
8
+ }>>;
9
+ }>;
10
+ declare type Maintainer = Static<typeof MaintainerDataRule>;
11
+ export declare class UpdatePackageController extends AbstractController {
12
+ private packageManagerService;
13
+ update(ctx: EggContext, fullname: string, data: Maintainer): Promise<{
14
+ ok: boolean;
15
+ }>;
16
+ }
17
+ export {};
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
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
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
9
+ return function (target, key) { decorator(target, key, paramIndex); }
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.UpdatePackageController = void 0;
13
+ const egg_errors_1 = require("egg-errors");
14
+ const tegg_1 = require("@eggjs/tegg");
15
+ const typebox_1 = require("@sinclair/typebox");
16
+ const AbstractController_1 = require("../AbstractController");
17
+ const PackageUtil_1 = require("../../../common/PackageUtil");
18
+ const MaintainerDataRule = typebox_1.Type.Object({
19
+ maintainers: typebox_1.Type.Array(typebox_1.Type.Object({
20
+ name: typebox_1.Type.String({ minLength: 1, maxLength: 100 }),
21
+ email: typebox_1.Type.String({ format: 'email', maxLength: 400 }),
22
+ }), { minItems: 1 }),
23
+ });
24
+ let UpdatePackageController = class UpdatePackageController extends AbstractController_1.AbstractController {
25
+ // https://github.com/npm/cli/blob/latest/lib/commands/owner.js#L191
26
+ async update(ctx, fullname, data) {
27
+ const npmCommand = ctx.get('npm-command');
28
+ if (npmCommand === 'unpublish') {
29
+ // ignore it
30
+ return { ok: false };
31
+ }
32
+ // only support update maintainer
33
+ if (npmCommand !== 'owner') {
34
+ throw new egg_errors_1.BadRequestError(`header: npm-command expected "owner", but got "${npmCommand}"`);
35
+ }
36
+ ctx.tValidate(MaintainerDataRule, data);
37
+ const pkg = await this.getPackageEntityAndRequiredMaintainer(ctx, fullname);
38
+ // make sure all maintainers exists
39
+ const users = [];
40
+ for (const maintainer of data.maintainers) {
41
+ const user = await this.userRepository.findUserByName(maintainer.name);
42
+ if (!user) {
43
+ throw new egg_errors_1.UnprocessableEntityError(`Maintainer "${maintainer.name}" not exists`);
44
+ }
45
+ users.push(user);
46
+ }
47
+ await this.packageManagerService.replacePackageMaintainers(pkg, users);
48
+ return { ok: true };
49
+ }
50
+ };
51
+ __decorate([
52
+ (0, tegg_1.Inject)()
53
+ ], UpdatePackageController.prototype, "packageManagerService", void 0);
54
+ __decorate([
55
+ (0, tegg_1.HTTPMethod)({
56
+ // PUT /:fullname/-rev/:rev
57
+ path: `/:fullname(${PackageUtil_1.FULLNAME_REG_STRING})/-rev/:rev`,
58
+ method: tegg_1.HTTPMethodEnum.PUT,
59
+ }),
60
+ __param(0, (0, tegg_1.Context)()),
61
+ __param(1, (0, tegg_1.HTTPParam)()),
62
+ __param(2, (0, tegg_1.HTTPBody)())
63
+ ], UpdatePackageController.prototype, "update", null);
64
+ UpdatePackageController = __decorate([
65
+ (0, tegg_1.HTTPController)()
66
+ ], UpdatePackageController);
67
+ exports.UpdatePackageController = UpdatePackageController;
68
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVXBkYXRlUGFja2FnZUNvbnRyb2xsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9hcHAvcG9ydC9jb250cm9sbGVyL3BhY2thZ2UvVXBkYXRlUGFja2FnZUNvbnRyb2xsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQUEsMkNBR29CO0FBQ3BCLHNDQVNxQjtBQUNyQiwrQ0FBaUQ7QUFDakQsOERBQTJEO0FBQzNELDZEQUFrRTtBQUlsRSxNQUFNLGtCQUFrQixHQUFHLGNBQUksQ0FBQyxNQUFNLENBQUM7SUFDckMsV0FBVyxFQUFFLGNBQUksQ0FBQyxLQUFLLENBQUMsY0FBSSxDQUFDLE1BQU0sQ0FBQztRQUNsQyxJQUFJLEVBQUUsY0FBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLFNBQVMsRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxDQUFDO1FBQ25ELEtBQUssRUFBRSxjQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLENBQUM7S0FDeEQsQ0FBQyxFQUFFLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQ3JCLENBQUMsQ0FBQztBQUlILElBQWEsdUJBQXVCLEdBQXBDLE1BQWEsdUJBQXdCLFNBQVEsdUNBQWtCO0lBSTdELG9FQUFvRTtJQU1wRSxLQUFLLENBQUMsTUFBTSxDQUFZLEdBQWUsRUFBZSxRQUFnQixFQUFjLElBQWdCO1FBQ2xHLE1BQU0sVUFBVSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDMUMsSUFBSSxVQUFVLEtBQUssV0FBVyxFQUFFO1lBQzlCLFlBQVk7WUFDWixPQUFPLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDO1NBQ3RCO1FBQ0QsaUNBQWlDO1FBQ2pDLElBQUksVUFBVSxLQUFLLE9BQU8sRUFBRTtZQUMxQixNQUFNLElBQUksNEJBQWUsQ0FBQyxrREFBa0QsVUFBVSxHQUFHLENBQUMsQ0FBQztTQUM1RjtRQUNELEdBQUcsQ0FBQyxTQUFTLENBQUMsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDeEMsTUFBTSxHQUFHLEdBQUcsTUFBTSxJQUFJLENBQUMscUNBQXFDLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQzVFLG1DQUFtQztRQUNuQyxNQUFNLEtBQUssR0FBaUIsRUFBRSxDQUFDO1FBQy9CLEtBQUssTUFBTSxVQUFVLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUN6QyxNQUFNLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN2RSxJQUFJLENBQUMsSUFBSSxFQUFFO2dCQUNULE1BQU0sSUFBSSxxQ0FBd0IsQ0FBQyxlQUFlLFVBQVUsQ0FBQyxJQUFJLGNBQWMsQ0FBQyxDQUFDO2FBQ2xGO1lBQ0QsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNsQjtRQUNELE1BQU0sSUFBSSxDQUFDLHFCQUFxQixDQUFDLHlCQUF5QixDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN2RSxPQUFPLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDO0lBQ3RCLENBQUM7Q0FDRixDQUFBO0FBaENDO0lBREMsSUFBQSxhQUFNLEdBQUU7c0VBQzRDO0FBUXJEO0lBTEMsSUFBQSxpQkFBVSxFQUFDO1FBQ1YsMkJBQTJCO1FBQzNCLElBQUksRUFBRSxjQUFjLGlDQUFtQixhQUFhO1FBQ3BELE1BQU0sRUFBRSxxQkFBYyxDQUFDLEdBQUc7S0FDM0IsQ0FBQztJQUNZLFdBQUEsSUFBQSxjQUFPLEdBQUUsQ0FBQTtJQUFtQixXQUFBLElBQUEsZ0JBQVMsR0FBRSxDQUFBO0lBQW9CLFdBQUEsSUFBQSxlQUFRLEdBQUUsQ0FBQTtxREF1QmxGO0FBakNVLHVCQUF1QjtJQURuQyxJQUFBLHFCQUFjLEdBQUU7R0FDSix1QkFBdUIsQ0FrQ25DO0FBbENZLDBEQUF1QiJ9
@@ -0,0 +1,2 @@
1
+ import { EggContext, Next } from '@eggjs/tegg';
2
+ export declare function AlwaysAuth(ctx: EggContext, next: Next): Promise<void>;